我正在尝试使用Windows CryptoAPI函数输出导入的RSA公钥的原始base64格式。使用带有CRYPT_STRING_BASE64HEADER标志的CryptBinaryToString,输出标头显示为"BEGIN CERTIFICATE“,而不是预期的"BEGIN PUBLIC KEY”。
(编辑:我没有突出显示我的问题的这一部分)此外,生成的公钥似乎与原始公钥不同。
如果我导出输出并重新导入,这会出现问题吗?如果是这样,我做错了什么?
下面是如何导入公钥的。
公钥存储在文件pubkey.pem中,格式如下:
-----BEGIN PUBLIC KEY-----
[REDACTED]
-----END PUBLIC KEY-----
使用CreateFile/ReadFile将文件读入缓冲区。使用CryptStringToBinaryA将PEM转换为二进制。使用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-----
https://stackoverflow.com/questions/56137510
复制相似问题