Код RSA, написанный с помощью PyCrypto, не работает с PyCryptodome

#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. Позволит ли это мне расшифровать старые зашифрованные данные? если да, есть ли какой-либо ресурс, который поможет мне выполнить миграцию?