我正在尝试使用 C++ 中的 Cripto API 构建一个签名/解码函数对。
签名过程似乎没问题,但我在让解码部分工作时遇到问题。因为我不依赖证书,所以我使用的是 CryptSignMessageWithKey 和 CryptVerifyMessageSignatureWithKey。但是,对 CryptVerifyMessageSignatureWithKey 的调用返回 CRYPT_E_ASN1_BADTAG 错误。在互联网上寻找问题时,我发现了一两个关于类似主题的讨论,但我无法从他们那里收集到一些解决方案。
我所有的代码都是基于 Crypto API 的。它的相关(我认为)部分是:
CryptAcquireContext(&hCryptProv, cryptContainerName, MS_ENHANCED_PROV, PROV_RSA_FULL, 0);
...
CryptGetUserKey(hCryptProv, AT_SIGNATURE, &hKey);
...
CryptExportKey(hKey, NULL, PUBLICKEYBLOB, 0, pbKeyBlob, &dwKeyBlobLen);
...
sigParams.cbSize = sizeof(CRYPT_KEY_VERIFY_MESSAGE_PARA);
sigParams.dwMsgEncodingType = (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING);
sigParams.hCryptProv = NULL;
publicKeyInfo.Algorithm.pszObjId = szOID_RSA_RC4;
publicKeyInfo.Algorithm.Parameters.cbData = 0;
publicKeyInfo.Algorithm.Parameters.pbData = NULL;
publicKeyInfo.PublicKey.pbData = pbKeyBlob;
publicKeyInfo.PublicKey.cbData = dwKeyBlobLen;
publicKeyInfo.PublicKey.cUnusedBits = 0;
...
// ***** ERROR: CRYPT_E_ASN1_BADTAG
CryptVerifyMessageSignatureWithKey(&sigParams, &publicKeyInfo, pbBuffer, dwCount, decodedBlob, &dwCount);
我是否应该以某种方式将从 CryptExportKey 获得的公钥转换为 ASN1,并将其存储在 publicKeyInfo.PublicKey.pbData 中?如果是这样,我该怎么做?
我在这里想念什么?
问候,并提前感谢,丹