首页 > 解决方案 > 每次用户要加密一个新文件时,我是否应该生成一个新的 RSA 密钥对?

问题描述

我正在做一个项目,我将在其中加密一些文件。我已经实现了 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)

标签: pythonpython-3.xpycryptodomepython-cryptography

解决方案


推荐阅读