Должен ли я генерировать новую пару ключей RSA каждый раз, когда пользователь собирается зашифровать новый файл? - PullRequest
0 голосов
/ 10 октября 2019

Я работаю над проектом, в котором я собираюсь зашифровать некоторые файлы. У меня уже есть реализованная функция 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)
...