我使用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
对象中感到有点困惑。
它建议我使用以下格式:
我知道它不是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
。 : - /
答案 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编码的私钥。