我的要求是驗證早先在VB.Net中籤名的C++應用程序中的簽名散列!無法從VB.Net驗證C++中的簽名散列
我會簡單介紹一下你我做了什麼去實現它。所有的 首先,我創建了一個私人/公共密鑰對CspParameters.KeyNumber值=「簽名」,並出口其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兼容性(大端至小端)保存簽名的哈希值。
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! 你可以請看看我的代碼,並指出我的錯誤
謝謝。
我強烈懷疑你不應該顛倒哈希......它只是一個字節序列,而不是一個數字被認爲是小端或大端...... –
@JonSkeet請參考這個MSDN鏈接,如果它可以幫助 http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider.aspx#remarksToggle –
有趣的,但這表示它是加密而不是簽名。你至少有*試過*沒有扭轉它? –