Сборка OpenSSL RSA из компонентов - PullRequest
0 голосов
/ 29 апреля 2020

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

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

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

1 Ответ

1 голос
/ 30 апреля 2020

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 и его уязвимостями.

...