Python非对称加密实现流程
1. 前言
非对称加密算法是一种加密方式,它使用了一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。在Python中,我们可以使用cryptography
库来实现非对称加密算法。
2. 实现步骤
下面是实现Python非对称加密的步骤:
步骤 | 描述 |
---|---|
1. 生成密钥对 | 使用cryptography 库生成公钥和私钥 |
2. 加密数据 | 使用公钥加密数据 |
3. 解密数据 | 使用私钥解密数据 |
3. 生成密钥对
首先,我们需要生成一对密钥:公钥和私钥。我们可以使用RSA算法生成密钥对。下面是生成密钥对的代码:
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
# 生成私钥
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
# 生成公钥
public_key = private_key.public_key()
# 序列化私钥
private_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
)
# 序列化公钥
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
# 保存私钥和公钥到文件
with open('private_key.pem', 'wb') as f:
f.write(private_pem)
with open('public_key.pem', 'wb') as f:
f.write(public_pem)
代码解释:
- 导入需要的模块和类。
- 使用
rsa.generate_private_key
方法生成私钥。 - 使用私钥的
public_key
方法生成公钥。 - 使用
private_key.private_bytes
方法将私钥序列化为PEM格式。 - 使用
public_key.public_bytes
方法将公钥序列化为PEM格式。 - 将私钥和公钥保存到文件中。
4. 加密数据
接下来,我们可以使用公钥来加密数据。下面是加密数据的代码:
from cryptography.hazmat.primitives.asymmetric import padding
# 读取公钥
with open('public_key.pem', 'rb') as f:
public_pem = f.read()
# 加载公钥
public_key = serialization.load_pem_public_key(public_pem)
# 加密数据
message = b'Hello, World!'
ciphertext = public_key.encrypt(
message,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
# 打印加密后的数据
print(ciphertext.hex())
代码解释:
- 导入需要的模块和类。
- 使用
open
函数读取公钥文件。 - 使用
serialization.load_pem_public_key
方法加载公钥。 - 使用公钥的
encrypt
方法对数据进行加密。 - 使用
print
函数打印加密后的数据。
5. 解密数据
最后,我们可以使用私钥来解密数据。下面是解密数据的代码:
from cryptography.hazmat.primitives.asymmetric import padding
# 读取私钥
with open('private_key.pem', 'rb') as f:
private_pem = f.read()
# 加载私钥
private_key = serialization.load_pem_private_key(
private_pem,
password=None
)
# 解密数据
plaintext = private_key.decrypt(
ciphertext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
# 打印解密后的数据
print(plaintext.decode())
代码解释:
- 导入需要的模块和类。
- 使用
open
函数读取私钥文件。 - 使用
serialization.load_pem_private_key
方法加载私钥。 - 使用私钥的
decrypt
方法对数据进行解密。 - 使用
print
函数打印解密后的数据。
6. 总结
通过以上步骤,我们成功地实现了