У меня есть существующий набор кода 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?