Сборка OpenSSL RSA из компонентов

Я почти везде искал ответ на этот вопрос, но я думаю, что мне действительно нужно, чтобы кто-то с соответствующим опытом работы с OpenSSL указал мне правильное направление.

В Python есть библиотека PyCryptodome, в которой реализованы на чистом Python несколько криптографических алгоритмов, включая RSA. У них есть функция как часть модуля RSA, которая называется construct, который создает ключ RSA из различных компонентов (n, e, d, p и q). Однако мне не удалось найти подобную функцию в OpenSSL, вероятно, просто потому, что я не знаю, где искать в их документации.

Любая помощь будет принята с благодарностью.


person watzon    schedule 29.04.2020    source источник


Ответы (1)


OpenSSL позволяет вам предоставлять эти значения, создавая собственную структуру RSA (через RSA_new()) и затем заполняя ее через RSA_set0_key, RSA_set0_factors и RSA_set0_crt_params.

Обратите внимание, что вы можете полностью определить открытый/закрытый ключ RSA, используя только n, e, d, но есть несколько традиционно предоставляемых дополнительных значений (например, p и q — это простые числа, формирующие модуль, а iqmp, dmp1 и dmq1 — коэффициенты CRT).

OpenSSL требует, чтобы вы предоставили их как экземпляры BN *, и вы не должны освобождать экземпляры BN после их назначения с помощью функций set0. Когда вы видите функцию с такой схемой именования в OpenSSL, это означает, что вы устанавливаете значение, но оно не увеличивает счетчик ссылок, поэтому, если вы сами освободите BN *, он станет недопустимым указателем в структуре.

Вы можете увидеть, как это работает, в источник pyca/cryptography, но я настоятельно не рекомендую делать это самостоятельно, если вы не очень хорошо разбираетесь в OpenSSL и его недостатках.

person Paul Kehrer    schedule 30.04.2020