我正嘗試使用C++中的Cripto API構建一對Sign/Decode函數。用於CryptVerifyMessageSignatureWithKey的ASN1格式的公鑰?
簽名過程似乎沒問題,但我在解碼部分工作時遇到問題。 由於我不依賴證書,因此我使用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?如果是這樣,我該怎麼做?
我在這裏失蹤的是什麼?
的問候,並感謝提前, 丹
大家好。通過使用CryptExportPublicKeyInfo準備CERT_PUBLIC_KEY_INFO解決問題,正如Andrew7Webb在[http://social.msdn.microsoft.com/Forums/en-US/windowssecurity/thread/b4d1eb0e-d4c1-46f0-80f4-8110a0e26be9](http:/ /social.msdn.microsoft.com/Forums/en-US/windowssecurity/thread/b4d1eb0e-d4c1-46f0-80f4-8110a0e26be9)。 – Dan