Какой формат приватного ключа это? - PullRequest
3 голосов
/ 16 февраля 2012

У меня есть закрытый ключ, созданный с помощью OpenSSL и зашифрованный с помощью RSA:

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQILJ8rNTk54VICAggA
MBQGCCqGSIb3DQMHBAiXuThuf12hMwSCBMhrm8H2j7yzLBOIvSWbLoyUmIn7e9zA
6PLDzj1dos+h+wAkPN0IgJlkdoBBXlnF7tzGdoctOYOKiu/p+HLzMnvHaDfNSFwz
5zx4yyZsKtf90gT6IVuJy7TMiLK3gk4gdZJc820OeRr1FjdRV3iVpTXbVfpwG/B3
IbV0PX3ZaHeR1m8vWI0/XQB7ZL7lLT+3MO66X/PAMTPA9joFMxuPFasIb2uXSqe/
CJNOyY4iW89uYHFiOe53e4ggUdT/rupoR4OSNKKEH5f1y+FIuH1xNvlmi14hJn+k
KOOi89vVIcvh4abCM+jhYwpPOGB8Sz2bAXsYocgZPvKtKakHlis7RcSsd5Usx9Nt
tgQ=
-----END ENCRYPTED PRIVATE KEY-----

И я сохранил его в user.key файле.

На самом деле я 'm реализация проекта CMS для шифрования и дешифрования в target-c.Теперь я пытаюсь расшифровать файл моего зашифрованного контейнера, используя сертификаты, закрытый ключ и т. Д. Я немного запутался, какой метод из OpenSSL я должен выбрать, чтобы загрузить вышеупомянутый ключ в объект EVP_PKEY.

Предлагаются следующие форматы:

  • FORMAT_ASN1
  • FORMAT_PEM
  • FORMAT_PKCS12
  • FORMAT_MSBLOB
  • FORMAT_PVK

Я знаю, что это не PEM, а PKCS12.Я бы предположил ASN1 или PVK, но я действительно не знаю, и я не нашел никакой дополнительной информации по этому вопросу в документе OpenSSL.

Может кто-нибудь сказать мне, пожалуйста, какой формат имеет вышеупомянутый ключ?

РЕДАКТИРОВАТЬ: Чтобы задать мой вопрос немного больше: у меня есть вышеупомянутый ключ загружен в BIO.Я могу прочитать это BIO с BIO_read(keybio, ...) успешно, и он содержит ключ (в ascii).Теперь я хочу получить EVP_PKEY из этого BIO.Я пытался ...

EVP_PKEY *key = PEM_read_bio_PrivateKey(keybio, NULL, 0, NULL);

... но это не работает.Когда я вызываю это, он просит меня ввести фразу-пароль в консоли, и когда я делаю это, ключ - NULL.: - /

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

Ключ - PKCS # 8 EncryptedPrivateKeyInfo, завернутый в PEM-контейнер.

Вы можете сделать что-то подобное, чтобы поместить его в EVP_PKEY -объект:

// This must be called once: 
OpenSSL_add_all_algorithms();

BIO* bio_err = BIO_new_fp (stderr, BIO_NOCLOSE);

X509_SIG* p8 = PEM_read_bio_PKCS8(in, NULL, NULL, NULL);
if(p8==NULL){
  BIO_printf(bio_err, "Error decoding key\n");
  ERR_print_errors(bio_err);
  return;
}
PKCS8_PRIV_KEY_INFO* p8inf = PKCS8_decrypt(p8, password, strlen(password));
if(p8inf==NULL){
  BIO_printf(bio_err, "Error decrypting key\n");
  ERR_print_errors(bio_err);
  return;
}
EVP_PKEY* pkey = EVP_PKCS82PKEY(p8inf);
if(pkey==NULL){
  BIO_printf(bio_err, "Error converting key\n");
  ERR_print_errors(bio_err);
  return;
}
2 голосов
/ 16 февраля 2012

Этот (расширенный) формат PEM используется OpenSSL для секретных ключей в кодировке PKCS # 8.

...