【发布时间】:2012-10-21 20:17:43
【问题描述】:
我正在尝试使用 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 中?如果是这样,我该怎么做?
我在这里缺少什么?
问候,并在此先感谢您, 丹
【问题讨论】:
-
大家好。正如 Andrew7Webb 在http://social.msdn.microsoft.com/Forums/en-US/windowssecurity/thread/b4d1eb0e-d4c1-46f0-80f4-8110a0e26be9 中所建议的那样,通过使用 CryptExportPublicKeyInfo 准备 CERT_PUBLIC_KEY_INFO 解决了问题。