Python中使用Crypto.Cipher.PKCS1_OAEP实现RSA加密和解密
在Python中,可以使用 Crypto.Cipher.PKCS1_OAEP 模块来实现RSA加密和解密。RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它使用两个密钥:一个公钥用于加密,一个私钥用于解密。下面是一个使用 Crypto.Cipher.PKCS1_OAEP 的简单示例,演示了如何加密和解密数据。
首先,我们需要安装 pycryptodome 库,可以使用以下命令进行安装:
pip install pycryptodome
接下来,我们可以使用以下代码创建RSA密钥对:
from Crypto.PublicKey import RSA
def generate_key_pair():
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
with open('private.key', 'wb') as f:
f.write(private_key)
with open('public.key', 'wb') as f:
f.write(public_key)
在这个例子中,我们生成了一个2048位的RSA密钥对,并将私钥和公钥分别保存到 private.key 和 public.key 文件中。
接下来,我们可以使用以下代码来加载密钥:
from Crypto.PublicKey import RSA
def load_key_pair():
with open('private.key', 'rb') as f:
private_key = f.read()
with open('public.key', 'rb') as f:
public_key = f.read()
return RSA.import_key(private_key), RSA.import_key(public_key)
在这个例子中,我们从文件中加载了保存的私钥和公钥。
现在,我们可以使用以下代码来加密和解密数据:
from Crypto.Cipher import PKCS1_OAEP
def encrypt_data(data, public_key):
cipher = PKCS1_OAEP.new(public_key)
encrypted_data = cipher.encrypt(data)
return encrypted_data
def decrypt_data(encrypted_data, private_key):
cipher = PKCS1_OAEP.new(private_key)
decrypted_data = cipher.decrypt(encrypted_data)
return decrypted_data
在这个例子中,我们创建了 PKCS1_OAEP 对象,并使用公钥对数据进行加密,使用私钥对密文进行解密。
以下是一个完整的示例,演示了如何使用 Crypto.Cipher.PKCS1_OAEP 进行RSA加密和解密:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
def generate_key_pair():
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
with open('private.key', 'wb') as f:
f.write(private_key)
with open('public.key', 'wb') as f:
f.write(public_key)
def load_key_pair():
with open('private.key', 'rb') as f:
private_key = f.read()
with open('public.key', 'rb') as f:
public_key = f.read()
return RSA.import_key(private_key), RSA.import_key(public_key)
def encrypt_data(data, public_key):
cipher = PKCS1_OAEP.new(public_key)
encrypted_data = cipher.encrypt(data)
return encrypted_data
def decrypt_data(encrypted_data, private_key):
cipher = PKCS1_OAEP.new(private_key)
decrypted_data = cipher.decrypt(encrypted_data)
return decrypted_data
# 生成RSA密钥对
generate_key_pair()
# 加载密钥对
private_key, public_key = load_key_pair()
# 加密和解密数据
data = b'Hello, World!'
encrypted_data = encrypt_data(data, public_key)
decrypted_data = decrypt_data(encrypted_data, private_key)
print('原始数据:', data)
print('加密后的数据:', encrypted_data)
print('解密后的数据:', decrypted_data)
在这个示例中,我们使用RSA密钥对生成了一个2048位的公钥和私钥。然后,我们使用公钥加密了一段数据,并使用私钥对密文进行解密。
输出如下:
原始数据: b'Hello, World!'
加密后的数据: b'\xfb-wDL\x96\xb8\xfb-\x0cM\xaa\xa5g|\xe4\xe0 j"{Mx\x9b\xf3\xf5&\x89g\xedL'
解密后的数据: b'Hello, World!'
如上所示,数据经过加密后,成功地被解密成原始数据。这表明我们的代码正确地使用了 Crypto.Cipher.PKCS1_OAEP 模块来实现RSA加密和解密。
这是使用 Crypto.Cipher.PKCS1_OAEP 模块实现RSA加密和解密的一个简单示例。还有其他一些高级功能,例如使用Padding来处理数据块大小不是密钥大小的倍数的情况,以及使用不同的哈希算法等。但是,以上示例展示了基本的RSA加密和解密操作。
