1

我正在尝试使用 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 中?如果是这样,我该怎么做?

我在这里想念什么?

问候,并提前感谢,丹

4

1 回答 1

0

正如 Andrew7Webb 在http://social.msdn.microsoft.com/Forums/en-US/windowssecurity/thread/b4d1eb0e-d4c1-46f0-80f4-8110a0e26be9中所建议的那样,通过准备解决了CERT_PUBLIC_KEY_INFO问题。CryptExportPublicKeyInfo

于 2013-01-05T13:03:53.770 回答