2014-01-16 52 views
1

我的要求是驗證早先在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! 你可以請看看我的代碼,並指出我的錯誤

謝謝。

+1

我強烈懷疑你不應該顛倒哈希......它只是一個字節序列,而不是一個數字被認爲是小端或大端...... –

+0

@JonSkeet請參考這個MSDN鏈接,如果它可以幫助 http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider.aspx#remarksToggle –

+0

有趣的,但這表示它是加密而不是簽名。你至少有*試過*沒有扭轉它? –

回答

1

你似乎散列兩次。一旦

BYTE* Message_Digest_SHA1 = SHA1("Hello World"); 

然後在

CryptHashData(hHash, Message_Digest_SHA1, 20,0) 

再次我懷疑你只需要一次哈希值。我建議刪除第一個,因爲簽名方法需要引用散列對象。請提供正確的二進制編碼"Hello World"作爲數據。

+1

請注意,我沒有看到任何用於字符串的'ComputeHash'方法,所以請在糖頂部給我們提供一個SSCCE(或兩個)。 –