2016-03-28 200 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了解背景。

相关问题