2016-03-28 69 views
0

我有一個生成的RSA密鑰對存儲爲PRIVATEKEYBLOB和PUBLICKEYBLOB,我需要能夠將這些密鑰轉換爲DER或PEM格式,以便我可以在PHP或Python中使用它。我發現我可以使用CryptEncodeObject函數將我的PRIVATEKEYBLOB轉換爲DER。爲了做到這一點,我需要使用PKCS_RSA_PRIVATE_KEY編碼標誌。但我找不到如何將PUBLICKEYBLOB轉換爲DER的任何線索。Microsoft CryptoAPI:如何將PUBLICKEYBLOB轉換爲DER/PEM?

這裏是我的PRIVATEKEYBLOB皈依代碼:

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 

新增::

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工具的輸出測試我的鑰匙我試圖RSA_CSP_PUBLICKEYBLOB與X509_ASN_ENCODING,但結果與openssl工具的輸出不同,並且關鍵輸入失敗。 openssl的導出DER長25個字節,並且只有前3個字節在兩個鍵中相等。這是比較關鍵的畫面:

Side-by-side key comparison

如果我們在這幅畫仔細觀察,我們可以看到,OpenSSL的密鑰版本有3字節後某種額外的24個字節報頭的。還沒有弄清楚它到底是什麼,但如果我使用RSA_CSP_PUBLICKEYBLOB從CryptEncodeObject獲得的輸出來對此硬編碼頭進行聯合分析,它一切正常。不知道該標題是否總是相同或不是。

回答

-2

我PUBLICKEYBLOB掙扎 - > PEM/DER格式,直到我發現了一個關於從智能卡中拉一個並將其轉換後。它的要點是,MS PUBLICKEYBLOB需要移除前32個字節,然後顛倒順序並將02 03 01 00 01添加到結尾。這會給你DER格式。然後,您可以使用base64編碼來獲取PEM,然後添加必需的開始/結束公鑰線。

您可以參考original post瞭解背景。

相關問題