这是哪种私钥格式?

时间:2012-02-16 16:43:19

标签: format openssl key encryption

我使用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文件中。

实际上我正在使用objective-c实现CMS加密和解密项目。现在我正在尝试使用证书,私钥等解密我的加密容器文件...... 我对OpenSSL中的哪种方法应该选择将上述密钥加载到EVP_PKEY对象中感到有点困惑。

它建议我使用以下格式:

  • FORMAT_ASN1
  • FORMAT_PEM
  • FORMAT_PKCS12
  • FORMAT_MSBLOB
  • FORMAT_PVK

我知道它不是PEMPKCS12。我猜是ASN1PVK,但我真的不知道,我在OpenSSL文档中没有找到任何关于此的更多信息。

有谁能告诉我上述密钥的格式是什么?

修改 要更多地指出我的问题:我已将上述密钥加载到BIO中。我可以成功地使用BIO阅读此BIO_read(keybio, ...)并且它包含密钥(在ascii中)。现在我希望从EVP_PKEY获得BIO。 我试过......

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

......但这不起作用。当我打电话给它时,它要求我在控制台中输入密码,当我这样做时,密钥是NULL。 : - /

2 个答案:

答案 0 :(得分:4)

密钥是包含在PEM容器中的PKCS#8 EncryptedPrivateKeyInfo。

你可以做这样的事情把它变成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;
}

答案 1 :(得分:2)

OpenSSL使用(扩展的)PEM格式用于PKCS#8编码的私钥。