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 source , но я настоятельно рекомендую не делать это самостоятельно, если вы не очень удобны с OpenSSL и его уязвимостями.