.net CryptDecodeObjectEx使用CRYPT_E_ASN1_BADTAG失败
我试图验证HMAC,但CryptDecodeObjectEx返回错误 首先,我从PFX出口了PEM。我通过.NET使用.net CryptDecodeObjectEx使用CRYPT_E_ASN1_BADTAG失败,.net,windows,winapi,cryptography,.net,Windows,Winapi,Cryptography,我试图验证HMAC,但CryptDecodeObjectEx返回错误 首先,我从PFX出口了PEM。我通过.NET使用 pem = Convert.ToBase64String(x509Cert.Export(X509ContentType.Cert, password)) 我将其写入'----开始证书---'和'----结束证书---'之间的文件 然后我使用CryptStringToBinaryA将其加载到二进制缓冲区中,以便将其传递给CryptDecodeObjectEx以获取X509_P
pem = Convert.ToBase64String(x509Cert.Export(X509ContentType.Cert, password))
我将其写入'----开始证书---'和'----结束证书---'之间的文件
然后我使用CryptStringToBinaryA将其加载到二进制缓冲区中,以便将其传递给CryptDecodeObjectEx以获取X509_PUBLIC_KEY_信息
但这就是它失败的地方。它返回CRYPT_E_ASN1_BADTAG
CHAR SIGN_KEY[] = "-----BEGIN CERTIFICATE-----\n"
"MIIFWjCCA..................\n"
"-----END CERTIFICATE-----\n";
if (CryptStringToBinaryA((LPCSTR)SIGN_KEY, sizeof(SIGN_KEY), CRYPT_STRING_BASE64HEADER, NULL, &out, NULL, NULL)) {
bin = (PBYTE)HALLOC(out);
if (bin) {
if (CryptStringToBinaryA((LPCSTR)SIGN_KEY, sizeof(SIGN_KEY), CRYPT_STRING_BASE64HEADER, bin, &out, NULL, NULL)) {
//This fails here with 0x8009310B (CRYPT_E_ASN1_BADTAG - ASN.1 bad tag value met)
//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
if (CryptDecodeObjectEx(PKCS_7_ASN_ENCODING, X509_PUBLIC_KEY_INFO, bin, out, CRYPT_ENCODE_ALLOC_FLAG, NULL, &cpki, &out)) {
if (CryptDecodeObjectEx(PKCS_7_ASN_ENCODING, RSA_CSP_PUBLICKEYBLOB, cpki->PublicKey.pbData, cpki->PublicKey.cbData, CRYPT_ENCODE_ALLOC_FLAG, NULL, *key, kl)) {
在VB.Net中,我可以使用完全相同的证书字符串并创建一个新的X509证书,然后与RSACryptServiceProvider一起使用,以验证签名。伪代码如下:
x509 = New X509Certificate2(System.Text.Encoding.ASCII.GetBytes(SIGN_KEY))
Dim rsa As New RSACryptoServiceProvider()
rsa.FromXmlString(x509.PublicKey.Key.ToXmlString(False))
Return rsa.VerifyData(MessageBytes, New SHA256CryptoServiceProvider(), SignatureBytes)
这是可行的,所以我假设CryptStringToBinaryA没有正确处理证书字符串,但仍然返回TRUE
对于要导入C/C++CryptApi的.NET导出PEM,是否有特殊格式?您需要调用
CryptImportPubliceInfo
就地CryptDecodeObjectEx(PKCS_7_ASN_编码,RSA_CSP_PUBLICKEYBLOB
或者,如果使用CNG-CryptDecodeObjectEx
和CNG_RSA_PUBLIC_KEY_BLOB
来代替RSA_CSP_PUBLICKEYBLOB
为什么要关闭这个问题?我已经做了研究,但这并没有回答这个问题。重新打开它。但因为答案存在-我怎么说-替换RSA_CSP\u PUBLICKEYBLOB
到CNG\u RSA\u PUBLIC\u KEY\u BLOB
并使用CNG api。或者调用CryptImportPubliceInfo
。或者查找或CryptImportPubliceInfo已被弃用!RSA\u CSP\u PUBLICKEYBLOB是获取密钥信息后的第二步。在使用RSA\u CSP\u PUBLICKEYBLOB之前必须先获取密钥信息。CryptImportPublicKeyInfo
那又怎样?所有传统的加密api都被弃用。您的RSA\u CSP\u PUBLICKEYBLOB
也被弃用。在这种情况下使用CNG\u RSA\u PUBLIC\u KeyBlob