2012-02-16 8 views
3

私は、秘密鍵は、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ファイルにそれを保存してきました。

実際には、私はCMSの暗号化と復号化プロジェクトをobjective-cで実装しています。今私は、証明書、秘密鍵などを使用して私の暗号化されたコンテナファイルを解読しようとしています... OpenSSLのどのメソッドをEVP_PKEYオブジェクトに上記のキーをロードするかを選択する必要があります少し混乱しています。

  • FORMAT_ASN1
  • FORMAT_PEM
  • FORMAT_PKCS12
  • FORMAT_MSBLOB私はそれがPEMとではないことを知っている
  • FORMAT_PVK

それは以下のフォーマットに私を示唆します3210。私はASN1またはPVKと推測しますが、実際にはわかりませんが、OpenSSLのドキュメントでこれに関する詳細情報は見つかりませんでした。

上記のキーのフォーマットは誰でも教えてください。

EDIT: はもう少し私の質問を指定するには:私はBIOにロードされ、前述のキーを持っています。私はこのBIOBIO_read(keybio, ...)で正常に読み取ることができ、それにキー(ascii)が含まれています。今私はこのBIOからEVP_PKEYを得たいと思っています。 私は...

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

を試してみた...しかし、これは動作しません。私がこれを呼び出すと、コンソールにパスフレーズを入力するように求められます。私がこれを行うと、鍵はNULLになります。 : -/

+0

私は鍵が** **パスワードで保護されていない場合、それが動作することがわかりました。本当に奇妙な...この問題についての記事もありますが、答えはありません。これはOpenSSLライブラリのバグでしょうか? – Chris

答えて

4

鍵は、PKCS#8 EncryptedPrivateKeyInfoがPEMコンテナにラップされています。

あなたはEVP_PKEY -objectにそれを得るために、このような何かを行うことができます。

// 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; 
} 
+0

Mh .... 'PKCS8_decrypt(...)を呼び出した後、' p8inf'がNULLになっています – Chris

+0

@Chris:一度呼び出す必要のあるエラー処理と初期化呼び出しを追加しました。それでも問題が解決しない場合は、エラーの内容を教えてください。パスワードを教えてもらえると助けになるので、自分でコードをテストすることができます。 –

+0

何を変更しましたか?私は 'OpenSSL_add_all_algorithms();'をすでにメソッドの先頭に置いていましたので、私はあなたの行を削除しましたが、新しいコードでは動作します。今度は、コードの後の 'CMS_decrypt(cms、key、c​​ert、out、NULL、0)'が 'NULL'であるというエラーがありましたが、それは別の問題です。私はそれを解決できない場合、少し研究を行い、新しい投稿を開始します。ご協力いただきありがとうございます! – Chris

2

この(拡張)PEM形式は、OpenSSLでPKCS#8エンコードされた秘密鍵用に使用されます。

関連する問題