2

PRIVATEKEYBLOB と PUBLICKEYBLOB として格納された生成された RSA キー ペアがあり、PHP または Python で使用できるように、これらのキーを DER または PEM 形式に変換できる必要があります。CryptEncodeObject 関数を使用して PRIVATEKEYBLOB を DER に変換できることがわかりました。そのためには、PKCS_RSA_PRIVATE_KEY エンコーディング フラグを使用する必要があります。しかし、PUBLICKEYBLOB を DER に変換する方法についての手がかりが見つかりませんでした。

PRIVATEKEYBLOB 変換のコードは次のとおりです。

LPCSTR type = PKCS_RSA_PRIVATE_KEY;
DWORD  encd = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;

DWORD dlen = 0;
if(!CryptEncodeObject(encd, type, key, null, &dlen))
{ LOG_ERROR(); return false; }

// Buffer allocation (der variable)

if(!CryptEncodeObject(encd, type, key, der, &dlen))
{ LOG_ERROR(); return false; }

キーを openssl ツールの出力と比較してテストします。

openssl rsa -pubin -inform MS\ PUBLICKEYBLOB -in pub.ms -outform DER -out pub.der
openssl rsa -inform MS\ PRIVATEKEYBLOB -in pri.ms -outform DER -out pri.der

追加: X509_ASN_ENCODING で RSA_CSP_PUBLICKEYBLOB を試しましたが、結果が openssl ツールの出力と異なり、キーのインポートに失敗します。openssl のエクスポートされた DER は 25 バイト長く、最初の 3 バイトだけが両方のキーで同じです。キー比較の写真は次のとおりです。

サイドバイサイドのキー比較

この図をよく見ると、openssl のキー バージョンには、3 番目のバイトの後に何らかの追加の 24 バイトのヘッダーがあることがわかります。それが何であるかはまだわかりませんが、このハードコーディングされたヘッダーを、RSA_CSP_PUBLICKEYBLOB を使用して CryptEncodeObject から取得した出力と連結すると、すべて正常に動作します。ただし、そのヘッダーが常に同じかどうかはわかりません。

4

2 に答える 2

0

https://msdn.microsoft.com/en-us/library/windows/desktop/aa378145(v=vs.85).aspxに記載されているように、RSA_CSP_PUBLICKEYBLOB を使用し ます。

于 2016-03-29T16:13:01.613 に答える