Шифрование учебника Python Crypto RSA по сравнению с openssl — что оно делает?

У меня есть существующий набор кода Python, который использует примитивный (учебник) механизм шифрования RSA для шифрования небольших фрагментов данных. В частности, код Python загружает открытый ключ в переменную publickey, а затем шифрует эти данные с помощью следующего кода:

ciphertext = publickey.encrypt(plaintext,None)

Да, я прочитал заявление об отказе от ответственности, что «эта функция выполняет простое, примитивное шифрование RSA (учебник). В реальных приложениях вам всегда нужно использовать правильное криптографическое заполнение…» К сожалению, я не могу изменить этот код в настоящее время, поэтому я застрял с использованием этой команды шифрования «учебник».

Обратите внимание, что даже несмотря на то, что эта команда не использует какую-либо схему заполнения, она по-прежнему способна зашифровать любой (соответственно небольшой) объем открытого текста. Другими словами, открытый текст может быть любой длины вплоть до ограничения, установленного RSA.

Однако теперь я хочу использовать библиотеку OPENSSL C в приложении IOS для идентичного шифрования RSA. Я не могу понять, как сделать то же самое, что делает функция python. В OPENSSL есть метод RSA_public_encrypt, в котором вы передаете размер открытого текста, сам открытый текст, указатель объекта RSA, который содержит информацию об открытом ключе, и механизм заполнения RSA. Чтобы воспроизвести то, что python делает в криптобиблиотеке, я подумал, что могу использовать RSA_NO_PADDING в качестве механизма заполнения. Проблема в том, что OPENSSL заявляет в своей документации, что если вы используете RSA_NO_PADDING, то длина открытого текста для шифрования должна быть ТОЧНО равна определенному значению: RSA_Size(rsa), где rsa — указатель на передаваемый объект RSA (объект который содержит открытый ключ).

Другими словами, криптобиблиотека Python, по-видимому, способна шифровать открытый текст переменной длины без заполнения, но OPENSSL требует, чтобы открытый текст был фиксированной длины. Итак, что именно делает криптобиблиотека python для обработки переменного размера открытого текста, и есть ли способ воспроизвести это в OPENSSL?


person Marc    schedule 05.12.2013    source источник


Ответы (1)


Если вы посмотрите документацию для RSA_NO_PADDING, там объясняется:

Этот режим следует использовать только для реализации криптографически безопасных режимов заполнения в коде приложения. Шифрование пользовательских данных напрямую с помощью RSA небезопасно.

Другими словами, RSA_NO_PADDING предназначен для случаев, когда вы собираетесь обрабатывать заполнение самостоятельно, поэтому OpenSSL ожидает ввода надлежащего размера. Это не означает "учебник RSA".

Есть ли веская причина, по которой вы не можете изменить код Python? Учебник RSA небезопасен, и вы сильно рискуете, используя его.

person mfanto    schedule 05.12.2013
comment
Вы правы - я пошел дальше и изменил схему заполнения на рекомендуемую. - person Marc; 09.12.2013
comment
Просто использование примитива I2OSP из PKCS#1 (т. е. создание строки октетов из целого числа) — это единственное, что вам нужно сделать, прежде чем вы сможете начать модульное возведение в степень, если вы используете NO_PADDING. Это настолько близко, насколько вы можете приблизиться к учебнику RSA, не начав с числа. - person Maarten Bodewes; 01.07.2016