【问题标题】:ASN1 formatted public key for CryptVerifyMessageSignatureWithKey?CryptVerifyMessageSignatureWithKey 的 ASN1 格式公钥?
【发布时间】: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 中?如果是这样,我该怎么做?

我在这里缺少什么?

问候,并在此先感谢您, 丹

【问题讨论】:

标签: cryptoapi asn.1


【解决方案1】:

按照 Andrew7Webb 在http://social.msdn.microsoft.com/Forums/en-US/windowssecurity/thread/b4d1eb0e-d4c1-46f0-80f4-8110a0e26be9 中的建议,通过准备CERT_PUBLIC_KEY_INFOCryptExportPublicKeyInfo 解决了问题。

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    相关资源
    最近更新 更多