Реальная история.
Там нет на самом деле простой способ сделать это. Вы можете вызвать программу под названием gpgsm с помощью:
gpgsm -o секрет-GPG-key.p12 --export секретный ключ-p12 0xXXXXXXXX
OpenSSL PKCS12 -в агентурной GPG-key.p12 -nocerts отъезда GPG-key.pem
OpenSSL PKCS12 -в агентурной GPG-key.p12 -nokeys отъезда GPG-certs.pem
Если вы настаиваете, то вы должны смотреть на gpgsm исходный код, как это специально построенный инструмент для работы.
Последние 2 строки можно сделать в C ++ легко. Для того, чтобы загрузить RSA ключи вы можете сделать:
Статическая INT pass_cb (символ * ЬиЕ, внутр размер, внутр rwflag, пустота * и)
{
Const строка пас = reinterpret_cast<символ *>(И);
INT Len = pass.size ();
// если слишком долго, усечение
если (LEN > размер)
Len = размер;
pass.copy (BUF, длина);
вернуться Len;
}
RSA * LoadPrivateKey (Const строка& PEM, Const строка& проходить)
{
BIO_free (био);
БИО * био = BIO_new_mem_buf (StringAsVoid (ул), -1);
если (! био)
бросить Ошибка чтения ();
RSA * = PEM_read_bio_RSAPrivateKey пара ключей (био, NULL, pass_cb,
StringAsVoid (проход));
если (! пара ключей)
бросить NoKeypairLoaded ();
вернуться пара ключей;
}
Если это открытый ключ, то используйте вместо PEM_read_bio_PKCS7. Выше функция должна признать это PKCS.
Может быть, иногда вам нужен объект EVP:
класс EvpBox
{
общественности:
EvpBox (RSA * Кейп);
~ EvpBox ();
EVP_PKEY * Key ();
частный:
EVP_PKEY * evpkey;
};
...
EvpBox :: EvpBox (RSA * Кейп)
{
evpkey = EVP_PKEY_new ();
если (! EVP_PKEY_set1_RSA (evpkey, Кейп)) {
бросить Ошибка чтения ();
}
}
EvpBox :: ~ EvpBox ()
{
EVP_PKEY_free (evpkey);
}
EVP_PKEY * EvpBox :: Key ()
{
вернуться evpkey;
}
1HmskBCwhnV8DRvYdpBmDyyTwGc28otPeZ