繁体   English   中英

Microsoft CryptoAPI:如何将PUBLICKEYBLOB转换为DER / PEM?

[英]Microsoft CryptoAPI: how to convert PUBLICKEYBLOB to DER/PEM?

我有一个生成的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

添加:我尝试使用X509_ASN_ENCODING进行RSA_CSP_PUBLICKEYBLOB,但是结果与openssl工具的输出不同,并且密钥导入失败。 openssl导出的DER长25个字节,两个键中只有前3个字节相等。 这是关键比较的图片:

并排键比较

如果仔细观察这张图片,我们可以看到openssl的密钥版本在第3个字节之后还有某种额外的24个字节的标头。 到目前为止,还没有弄清楚它是什么,但是如果我用从RSA_CSP_PUBLICKEYBLOB的CryptEncodeObject获得的输出将这个硬编码的标头隐藏起来,则一切正常。 不知道该标头是否始终相同。

我一直在努力使用PUBLICKEYBLOB-> PEM / DER格式,直到找到有关从智能卡中提取一个并进行转换的帖子。 要点是,MS PUBLICKEYBLOB需要删除前32个字节,然后颠倒顺序并将末尾添加02 03 01 00 01。 这将为您提供DER格式。 然后,您可以对base64进行编码以获取PEM,然后添加必需的开始/结束公钥行。

您可以参考原始文章作为背景。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM