欢迎访问宙启技术站
智能推送

Python中使用Crypto.Cipher.PKCS1_OAEP实现RSA加密和解密

发布时间:2023-12-11 01:44:51

在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.keypublic.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加密和解密操作。