我正在做一个项目,我将在其中加密一些文件。我已经实现了 AES 功能,现在我正在实现 RSA 部分。在 AES 部分,每次我要加密一个新文件时,我都会创建一个新密钥,即使密码是相同的,使用不同的盐也是如此。为了恢复上述密码,我需要将一个已知的密码和盐散列在一起。我应该对 RSA 公钥和私钥做同样的事情吗?如果是这样,我可以将我在 AES 密钥上使用的方法应用于 RSA 密钥吗?或者我的方法应该不同吗?
这就是我生成 RSA 密钥的方式:
from Crypto.PublicKey import RSA
class RsaKeyGenerator:
def __index__(self):
self.__key = RSA.generate(2048)
def generate_public_key(self):
return self.__key.publickey().exportKey()
def generate_private_key(self, password):
return self.__key.exportKey(passphrase=password, pkcs=8, protection="scryptAndAES128-CBC")
这就是我处理加密/解密过程的方式:
from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
from Crypto.Cipher import PKCS1_OAEP, AES
class RsaCrypto:
def __init__(self, public_key):
self.public_key = RSA.import_key(open(public_key, 'rb').read())
self.__cipher_rsa = PKCS1_OAEP.new(self.public_key)
self.__session_key = get_random_bytes(16)
self.__cipher_aes = AES.new(self.__session_key, AES.MODE_EAX)
self.__nonce = self.__cipher_aes.nonce
def get_session_key(self):
return self.__cipher_rsa.encrypt(self.__session_key)
def get_nonce(self):
return self.__nonce
def encrypt(self, plaintext_bytes):
cipher_text, tag = self.__cipher_aes.encrypt_and_digest(plaintext_bytes)
return cipher_text, tag
@staticmethod
def decrypt(private_key, password, enc_session_key, nonce, tag, cipher_text):
plain_private_key = RSA.import_key(private_key, passphrase=password)
cipher_rsa = PKCS1_OAEP.new(plain_private_key)
session_key = cipher_rsa.decrypt(enc_session_key)
cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce)
return cipher_aes.decrypt_and_verify(cipher_text, tag)