#pycrypto #pycryptodome
#pycrypto #pycryptodome
Вопрос:
Я пытаюсь запустить две простые функции, которые я написал для PyCrypto, с помощью PyCryptodome. Вот функции с соответствующими определениями членов класса:
import Crypto.PublicKey.RSA as RSA
class MyRSA():
n = "123..." # these are actually very long string...
p = "345..."
u = "567..."
q = "789..."
e = long(65537)
t = (long(n), e, long(d), long(p), long(q), long(u))
key = RSA.construct(t)
def DecryptText(self, text):
chunk_size = 128
enc_vec = [text[i:i chunk_size] for i in range(0, len(text),
chunk_size)]
plain_text = ''
for x in enc_vec:
plain_text = MyRSA.key.decrypt(x)
return plain_text
def EncryptText(self, text):
chunk_size = 128
text_vec = [text[i:i chunk_size] for i in range(0, len(text),
chunk_size)]
enc_text = ''
for x in text_vec:
enc_text = MyRSA.key.encrypt(x, '')[0]
return enc_text
Две функции EncryptText и DecryptText используют методы PyCrypto encrypt и decrypt, которые больше не поддерживаются в PyCryptodome (при их вызове внешним кодом возникает ошибка NotImplemented). Кто-нибудь может мне помочь преобразовать их в код, совместимый с PyCryptodome? Заранее спасибо!
Ответ №1:
Это не тот вопрос, который вы задавали, но, пожалуйста, имейте в виду, что в вашем устройстве есть значительная криптографическая слабость EncryptText
. Вы разбиваете свои сообщения на фрагменты и шифруете каждый из них. Этот метод примерно такой же, как режим ECB в symmetric encryptions, и поэтому он имеет ту же слабость:
a) Злоумышленник может изменить порядок фрагментов сообщения или поменять их местами между различными способами шифрования.
б) видны повторяющиеся фрагменты, дающие злоумышленнику подсказки относительно того, как расшифровать сообщение.
Ответ №2:
Фундаментальным компонентом шифрования RSA является заполнение. Pycrypto использовался для предоставления методов raw decrypt
и encrypt
для объекта ключа RSA (тех, которые вы используете), но это неправильно и небезопасно, потому что они не реализуют никакого заполнения.
Вместо этого вы должны использовать модуль Crypto.Cipher.PKCS1_OAEP
(единственная опция в pycryptodome), который надежно обрабатывает заполнение.
Комментарии:
1. Позволит ли это мне расшифровать старые зашифрованные данные? если да, есть ли какой-либо ресурс, который поможет мне выполнить миграцию?