Я пытаюсь что-то зашифровать с помощью RSA.
Но моя библиотека RSA не позволяет использовать ключи x509.
Поэтому я попытался преобразовать его в ключ DER, используя openssl.
но я не очень понимаю, как это работает. я заметил два класса, которые казались нормальными, но я не могу понять, как их использовать.
функции являются:
-i2d_X509
-X509
Я нашел кусок кода, но я не могу понять это:
int len;
unsigned char *buf, *p;
len = i2d_X509(x, NULL);
buf = OPENSSL_malloc(len);
if (buf == NULL)
/* error */
p = buf;
i2d_X509(x, &p);
Если бы вы могли помочь мне, было бы здорово.
i2d_X509
значит конвертировать X509
объект из внутреннего представления (который является X509
структура) в DER-кодированное представление (которое копируется в буфер или в файл).
Итак, в этом коде в строке
len = i2d_X509(x, NULL);
Вы определяете длину буфера или количество байтов, необходимых для представления данного сертификата в DER.
Затем вы выделяете столько памяти и последнее утверждение
len = i2d_X509(x, &p);
копирует X509 *
сертификат в этот буфер в формате DER.
Этот буфер вы можете сохранить в файле и сохранить его как файл сертификата, скажем .cer, .crt, и открыть его любым инструментом сертификации.
Возвращаясь к вашей проблеме, вы можете использовать этот буфер в вашей программе, которая принимает сертификат DER.
Но ты упомянул ключ, не так ли?
Если тебе надо RSA
Открытый ключ, то вы можете сделать следующее.
Вам может понадобиться сначала извлечь ключ с помощью X509_get_pubkey
который даст ключ в EVP_PKEY
состав.
EVP_PKEY * pkey;
pkey = X509_get_pubkey(x);
RSA * rsa;
rsa = EVP_PKEY_get1_RSA(pkey);
Теперь выведите это RSA
структура в DER.
int len;
unsigned char *buf, *p;
len = i2d_RSAPublicKey(rsa, buffer, buffer_length);
ассигновать buffer
на достаточно большую длину скажем 4000 в зависимости от ключа.
Я думаю, что это поможет вам.
Других решений пока нет …