2012-10-21 68 views
1

我正嘗試使用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?如果是這樣,我該怎麼做?

我在這裏失蹤的是什麼?

的問候,並感謝提前, 丹

+0

大家好。通過使用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

回答