1

C++ で Cripto API を使用して、Sign/Decode 関数のペアを構築しようとしています。

署名プロセスは問題ないようですが、デコード部分を機能させるのに問題があります。私は証明書に依存していないので、CryptSignMessageWithKey と CryptVerifyMessageSignatureWithKey を使用しています。ただし、CryptVerifyMessageSignatureWithKey への呼び出しは、CRYPT_E_ASN1_BADTAG エラーを返しています。インターネットで問題を探していると、同様のトピックに関する 1 つまたは 2 つのディスカッションが見つかりましたが、それらから解決策を得ることができませんでした。

私のコードはすべて 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 に答える