[英]Unable to verify the Signed Hash in C++ from VB.Net
我的要求是驗證我的C ++應用程序中已簽名的哈希,該哈希是先前在VB.Net中簽名的!
我將向您簡要說明如何實現此目標。首先,我使用CspParameters.KeyNumber value =“ Signature”創建了一個私鑰/公鑰對,並將其CspBlob導出到文件“ KeyPair.txt”中以使用公鑰。在我的C ++程序中。
Dim str As testData= "Hello World"
Dim Hash() As Byte = HashAlgorithm.Create("SHA1").ComputeHash(testData)
Hash = RSA.SignHash(Hash, CryptoConfig.MapNameToOID("SHA1"))
Array.Reverse(Hash)
並將簽名哈希以相反的順序保存在文件“ Signature.txt”中,以使VB.Net與本機CAPI兼容(從Big Endian到Little Endian)。
2.)在另一端(C ++程序)...
首先,我計算了testData“ Hello World”的SHA1,然后使用下面的代碼來驗證簽名。
BYTE* Message_Digest_SHA1 = SHA1("Hello World");
BYTE* pbBlob = ReadFile("KeyPair.txt");
int pbBlobLen = GetFileLen("KeyPair.txt");
BYTE* pbSignature = ReadFile("Signature.txt");
int pbSignatureLen = GetFileLen("Signature.txt");
if (!CryptAcquireContext(&hProv, NULL, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
{
//Error checking omitted !
}
if (pbBlob) {
if (!CryptImportKey(hProv, pbBlob, pbBlobLen , 0, 0, &hPubKey))
return FALSE;
}
HCRYPTHASH hHash;
if(CryptCreateHash(
hProv,
CALG_SHA1,
0,
0,
&hHash))
{
printf("The hash object has been recreated. \n");
}
else
{
// Error
}
if(CryptHashData(
hHash,
Message_Digest_SHA1 ,
20, // length of message digest
0))
{
printf("The new hash has been created.\n");
}
else
{
//Error
}
if(CryptVerifySignature(
hHash,
pbSignature,
pbSignatureLen ,
hPubKey,
NULL,
0))
{
printf("The signature has been verified.\n");
}
else
{
DWORD error = GetLastError(); // 2148073478 in HEX 0x80090006 NTE_BAD_SIGNATURE
printf("Signature not validated!\n");
}
if(hHash)
CryptDestroyHash(hHash);
但是,CryptVerifySignature失敗,並顯示NTE_BAD_SIGNATURE! 你能看看我的代碼並指出我的錯誤嗎
謝謝。
您似乎哈希了兩次。 曾在
BYTE* Message_Digest_SHA1 = SHA1("Hello World");
然后再在
CryptHashData(hHash, Message_Digest_SHA1, 20,0)
我懷疑您只需要哈希一次。 我建議刪除第一個,因為簽名方法希望引用哈希對象。 而是提供"Hello World"
的正確二進制編碼作為數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.