我有一个生成的RSA密钥对存储为PRIVATEKEYBLOB和PUBLICKEYBLOB,我需要能够将这些密钥转换为DER或PEM格式,以便我可以在PHP或Python中使用它。我发现我可以使用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
ADDED:我尝试了使用X509_ASN_ENCODING的RSA_CSP_PUBLICKEYBLOB,但结果与openssl工具的输出不同,并且密钥导入失败。 openssl导出的DER长25个字节,两个键中只有前3个字节相等。以下是关键比较的图片:
如果仔细观察这张图片,我们可以看到openssl的密钥版本在第3个字节后有一些额外的24字节头。 Haven还没弄清楚它到底是什么,但是如果我用来自CryptEncodeObject和RSA_CSP_PUBLICKEYBLOB的输出结合这个硬编码头,它一切正常。不确定该标题是否总是相同或不同。
答案 0 :(得分:0)
使用RSA_CSP_PUBLICKEYBLOB,如中所述 https://msdn.microsoft.com/en-us/library/windows/desktop/aa378145(v=vs.85).aspx
答案 1 :(得分:-2)
我与PUBLICKEYBLOB斗争 - > PEM / DER格式化,直到我找到一篇关于从智能卡中拉出一个并转换它的帖子。它的要点是,MS PUBLICKEYBLOB需要删除前32个字节,然后反转顺序并将02 03 01 00 01添加到结尾。这将给你DER格式。然后,您可以使用base64编码来获取PEM,然后添加必需的开始/结束公钥行。
您可以参考original post了解背景信息。