Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net CryptDecodeObjectEx使用CRYPT_E_ASN1_BADTAG失败_.net_Windows_Winapi_Cryptography - Fatal编程技术网

.net CryptDecodeObjectEx使用CRYPT_E_ASN1_BADTAG失败

.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

我试图验证HMAC,但CryptDecodeObjectEx返回错误

首先,我从PFX出口了PEM。我通过.NET使用

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