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 から取得した出力と連結すると、すべて正常に動作します。ただし、そのヘッダーが常に同じかどうかはわかりません。