导入必要的模块:
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization
生成RSA密钥对:
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
public_key = private_key.public_key()
这里我们使用RSA算法生成私钥和相应的公钥。
在这段代码中,`private_key` 是生成的私钥,而 `public_key` 则是从私钥生成的对应的公钥。
key_size=2048 指定了生成的RSA密钥的位数,也就是密钥的长度,在rsa加密中密钥的长度一般以位数表示,例如,2048比1024更加安全,因为有更大的组合空间,更不容易被破解。
保存私钥到文件:
pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
)
with open("private_key.pem", "wb") as f:
f.write(pem)
将私钥以PEM格式保存到文件,这是一个关键步骤,确保私钥的安全保存。
-
private_key.private_bytes()
: 这是一个方法调用,用于将私钥对象转换为字节流。在这里,我们将私钥对象private_key
转换为字节流。 -
encoding=serialization.Encoding.PEM
: 这个参数指定了字节流的编码方式,即使用PEM编码。 -
format=serialization.PrivateFormat.PKCS8
: 这个参数指定了私钥的格式,即使用PKCS#8格式。 -
encryption_algorithm=serialization.NoEncryption()
: 这个参数指定了在保存私钥时不使用加密。这意味着私钥文件将不受任何密码保护,这在某些情况下可能是安全隐患。实际应用中,如果需要保存私钥,通常会使用密码保护以增加安全性。 -
接下来,我们使用
with
语句来打开一个文件,并将字节流写入文件:
with open("private_key.pem", "wb") as f:
f.write(pem)
-
with open("private_key.pem", "wb") as f:
: 这是一个文件操作的上下文管理器,它打开一个名为private_key.pem
的文件,使用二进制写入模式 ("wb"
)。 -
f.write(pem)
: 这一行将之前生成的字节流写入文件。通过这一步,我们将私钥以PEM格式保存到名为private_key.pem
的文件中。
要加密的数据:
data_to_encrypt = b"这是需要加密的数据。"
这段代码定义了一个变量 `data_to_encrypt`,并将一个字符串数据赋值给它。
使用公钥加密数据:
encrypted_data = public_key.encrypt(
data_to_encrypt,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
使用公钥对数据进行加密,这里使用OAEP填充方案(Optimal Asymmetric Encryption Padding)来增加安全性。
-
encrypted_data = public_key.encrypt(...)
: 这是一个赋值语句,将加密后的数据保存到名为encrypted_data
的变量中。 -
public_key.encrypt(...)
: 这是使用公钥进行加密的方法调用。 -
data_to_encrypt
: 这是之前定义的需要加密的数据,是一个字节字符串。 -
padding.OAEP(...)
: 这是一个填充方案的设置,使用OAEP填充方案(Optimal Asymmetric Encryption Padding)来增加安全性。-
mgf=padding.MGF1(algorithm=hashes.SHA256())
: 这是设置 OAEP 中的 MGF (Mask Generation Function),使用SHA-256哈希算法生成掩码。 -
algorithm=hashes.SHA256()
: 这是设置 OAEP 中的哈希算法,使用SHA-256。 -
label=None
: 这是设置 OAEP 的标签,通常设为 None。
-
所以,整体来说,这段代码的作用是使用公钥对给定的数据进行加密。加密后的数据将保存在 encrypted_data
变量中,以便后续解密操作。需要注意的是,对于解密,需要使用相应的私钥进行操作。
使用私钥解密数据:
decrypted_data = private_key.decrypt(
encrypted_data,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
使用私钥对加密数据进行解密,需要使用相同的填充方案。
-
decrypted_data = private_key.decrypt(...)
: 这是一个赋值语句,将解密后的数据保存到名为decrypted_data
的变量中。 -
private_key.decrypt(...)
: 这是使用私钥进行解密的方法调用。 -
encrypted_data
: 这是之前加密过的数据,是一个字节字符串。 -
padding.OAEP(...)
: 这是同样使用OAEP填充方案的设置,用于解密数据。-
mgf=padding.MGF1(algorithm=hashes.SHA256())
: 这是设置 OAEP 中的 MGF (Mask Generation Function),与加密时一样,使用SHA-256哈希算法生成掩码。 -
algorithm=hashes.SHA256()
: 这是设置 OAEP 中的哈希算法,也与加密时一样,使用SHA-256。 -
label=None
: 这是设置 OAEP 的标签,同样设为 None。
-
所以,整体来说,这段代码的作用是使用私钥对已加密的数据进行解密。解密后的数据将保存在 decrypted_data
变量中,恢复为原始的字节字符串形式。这样就完成了加密和解密的过程。需要注意,解密的成功需要使用与加密时使用的填充方案相同的设置和密钥对。
这个案例展示了使用Python进行RSA非对称加密的过程,涵盖了密钥生成、加密和解密等步骤。实际应用中,还需要注意对私钥的保护和管理,确保数据的安全性。