簡體   English   中英

無法從VB.Net驗證C ++中的簽名哈希

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM