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