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 に格納する必要がありますか? もしそうなら、どうすればいいですか?
ここで私が見逃しているポイントは何ですか?
よろしく、よろしくお願いします、ダン