#c #openssl #public-key
#c #openssl #открытый ключ
Вопрос:
Я хотел бы определить длину ключа открытого ключа, закодированного в DER
формате, при использовании OpenSSL
API C
.
Это довольно просто сделать с ключом, закодированным в PEM
формате:
FILE *fp = fopen(argv[1], "rb");
RSA *rsa_key = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL);
int keylength = RSA_size(rsa_key);
(предполагается, что загружаемый ключ был передан в качестве аргумента)
К сожалению, эквивалентной DER_read_RSA_PUBKEY
функции нет. Я пробовал это с i2d_RSA_PUBKEY_fp
помощью and d2i_RSA_PUBKEY_fp
, но безрезультатно — только ошибки сегментации.
Разница между _RSA_PUBKEY и _RSAPublicKey, по-видимому, заключается в том, что первый использует структуру SubjectPublicKeyInfo (открытый ключ сертификата), а второй использует структуру RSAPublicKey PKCS # 1.
Комментарии:
1. d2i_RSA_PUBKEY_fp — эквивалентная функция для чтения DER. Если вы видите ошибки seg из-за этого, возможно, вы хотели бы поделиться проблемным кодом?
Ответ №1:
Семейство функций d2i_ * доступно для преобразования DER во внутренние структуры данных openssl.
Итак, вы должны иметь возможность использовать:
FILE *fp = fopen(argv[1], "rb");
RSA *rsa_key = d2i_RSAPublicKey_fp(fp, NULL);
int keylength = RSA_size(rsa_key);
для достижения того, чего вы хотите.
Комментарии:
1. Примечание:
d2i_RSAPublicKey_fp
это API OpenSSL 1.1.0 и более поздних версий. Если вы все еще используете OpenSSL 1.0.2 (скорее всего, из-за соответствия требованиям FIPS), этот API недоступен, и вам придется использовать свой собственный.2. Это было абсолютно полезно и кратко, спасибо @Ctx. Дополнительная информация для тех, кто может использовать это решение и по-прежнему получает ошибки сегментации: попробуйте инициализировать свою структуру RSA с помощью NULL, а не только объявлять ее без инициализации.