CryptBinaryToString不输出预期公钥

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (34)

我正在尝试使用Windows CryptoAPI函数输出导入的RSA公钥的原始base64格式。使用CryptBinaryToString和CRYPT_STRING_BASE64HEADER标志,输出标头显示“BEGIN CERTIFICATE”而不是预期的“BEGIN PUBLIC KEY”。

如果我要导出输出并使用不同的标头重新导入它,这会成为问题吗?如果是这样,我做错了什么?

以下是导入公钥的方式。

公钥以以下PEM格式存储在文件pubkey.pem中:

-----BEGIN PUBLIC KEY-----
[REDACTED]
-----END PUBLIC KEY-----

使用CreateFile / ReadFile将文件读入缓冲区。PEM使用CryptStringToBinaryA转换为二进制。使用CryptDecodeObjectEx将二进制解码为X509_PUBLIC_KEY_INFO。PubKeyInfo结构被解码为RSA_CSP_PUBLICKEYBLOB(与上面相同的功能)。

这部分工作正常(可以导入密钥并使用CryptImportKey,CryptEncrypt等加密数据)。

这是我将用于尝试将原始blob恢复为base64 PEM格式的代码。我删除了大多数错误检查以保存头痛。

pbTmp和cbTmp分别是保存输出和大小的临时缓冲区。pBinaryKey是原始公钥blob(从前面导入)pBuffer是输出缓冲区(假设是正确的大小)ulDataLen是输出缓冲区大小

CryptEncodeObjectEx(X509_ASN_ENCODING, RSA_CSP_PUBLICKEYBLOB, pBinaryKey, 0, NULL, NULL, &cbTmp)
pbTmp = malloc(cbTmp);
CryptEncodeObjectEx(X509_ASN_ENCODING, RSA_CSP_PUBLICKEYBLOB, pBinaryKey, 0, NULL, pbTmp, &cbTmp)
CryptBinaryToStringA(pbTmp, cbTmp, CRYPT_STRING_BASE64HEADER, NULL, &ulDataLen)
CryptBinaryToStringA(pbTmp, cbTmp, CRYPT_STRING_BASE64HEADER, pBuffer, &ulDataLen)

结果缓冲区以此结束:

-----BEGIN CERTIFICATE-----
[REDACTED; DIFFERENT FROM ORIGINAL PUBLIC KEY]
-----END CERTIFICATE-----
提问于
用户回答回答于

根据该文件

CRYPT_STRING_BASE64HEADER(0x00000000):Base64,带有证书 开头和结尾标题。

预期的标题是“BEGIN CERTIFICATE”。并且“BEGIN PUBLIC KEY”没有其他标志参数支持。正如@Jonathan Potter所说,你总是可以使用CRYPT_STRING_BASE64标志来编码而不用标题,然后自己添加正确的标题。

而且,这是另一个关于使用openssl从CERTIFICATE获取PUBILC的答案

扫码关注云+社区

领取腾讯云代金券