2011-09-22 174 views
0

我得到了一個代碼來將字符串轉換爲hmac sha1加密。 但是,我不能得到它的工作。這裏是我的代碼:Visual Basic 2010 HMAC SHA1

Public Shared Function HashString(ByVal StringToHash As String) As String 
    Dim myEncoder As New System.Text.UTF32Encoding 
    Dim Key() As Byte = myEncoder.GetBytes("thisismykey") 
    Dim Text() As Byte = myEncoder.GetBytes(StringToHash) 
    Dim myHMACSHA1 As New System.Security.Cryptography.HMACSHA1(Key) 
    Dim HashCode As Byte() = myHMACSHA1.ComputeHash(Text) 
    Return Convert.ToBase64String(HashCode) 
End Function 

當我運行像這樣的功能:

TextBox1.Text = HashString("thisismystring") 

我得到在文本框中04p075DKS2Suw9jGQKC5Q7mYjvI=。 我應該得到的是c2bc9dd26b76d5b61a40ac788220eef0b26cb2bb

任何人有任何想法如何解決這個問題?請幫忙:)

回答

3

我找到了解決方案。 我只是將字節轉換爲一個字符串,使其降低並替換 - 沒有任何東西。 見我的代碼:)

Public Function HashString(ByVal StringToHash As String, ByVal HachKey As String) As String 
    Dim myEncoder As New System.Text.UTF8Encoding 
    Dim Key() As Byte = myEncoder.GetBytes(HachKey) 
    Dim Text() As Byte = myEncoder.GetBytes(StringToHash) 
    Dim myHMACSHA1 As New System.Security.Cryptography.HMACSHA1(Key) 
    Dim HashCode As Byte() = myHMACSHA1.ComputeHash(Text) 
    Dim hash As String = Replace(BitConverter.ToString(HashCode), "-", "") 
    Return hash.ToLower 
End Function 

用法示例如下:

TextBox1.Text = HashString("thisismystring", "thisismykey") 

感謝您的幫助:)

1

你的04p075DKS2Suw9jGQKC5Q7mYjvI=是Base64。您的c2bc9dd26b76d5b61a40ac788220eef0b26cb2bb以十六進制表示。您需要將其中一個轉換爲其他格式,以便您可以正確比較它們。

ETA:我檢查過,兩者不匹配,你的十六進制給我在Base64中的wryd0mt21bYaQKx4giDu8LJssrs=。我懷疑問題可能在於使用UTF32編碼,這是非常不尋常的。 UTF8或UTF16更常見。首先嚐試使用UTF8。

0

校正depuis少校EXCEL,

倒放任杜MD5,IL faut複印機coller le code ci-dessous

Option Explicit 
Private Const HP_HASHVAL = 2 
Private Const HP_HASHSIZE = 4 
Private Const PROV_RSA_FULL As Long = 1 
Private Const ALG_CLASS_HASH = 32768 
Private Const ALG_TYPE_ANY = 0 
Private Const ALG_SID_MD2 = 1 
Private Const ALG_SID_MD4 = 2 
Private Const ALG_SID_MD5 = 3 
Private Const ALG_SID_SHA1 = 4 
Private Const CRYPT_NEWKEYSET = &H8 
Private Const CRYPT_VERIFYCONTEXT As Long = &HF0000000 

Enum HashAlgorithm 
    MD2 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD2 
    MD4 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD4 
    MD5 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD5 
    SHA1 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1 
End Enum 

Private Declare Function CryptAcquireContext Lib "Advapi32" Alias "CryptAcquireContextA" (ByRef phProv As Long, ByVal pszContainer As String, ByVal pszProvider As String, ByVal dwProvType As Long, ByVal dwFlags As Long) As Long 
Private Declare Function CryptReleaseContext Lib "Advapi32" (ByVal hProv As Long, ByVal dwFlags As Long) As Long 
Private Declare Function CryptCreateHash Lib "Advapi32" (ByVal hProv As Long, ByVal Algid As Long, ByVal hKey As Long, ByVal dwFlags As Long, ByRef phHash As Long) As Long 
Private Declare Function CryptDestroyHash Lib "Advapi32" (ByVal hHash As Long) As Long 
Private Declare Function CryptHashData Lib "Advapi32" (ByVal hHash As Long, pbData As Any, ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long 
Private Declare Function CryptGetHashParam Lib "Advapi32" (ByVal hHash As Long, ByVal dwParam As Long, pbData As Any, pdwDataLen As Long, ByVal dwFlags As Long) As Long 

Public Function HashString(ByVal Str As String, Optional ByVal Algorithm As HashAlgorithm = MD5) As String 
On Error Resume Next 
Dim hCtx As Long 
Dim hHash As Long 
Dim lRes As Long 
Dim lLen As Long 
Dim lIdx As Long 
Dim abData() As Byte 
lRes = CryptAcquireContext(hCtx, vbNullString, vbNullString, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) 
If lRes <> 0 Then 
    lRes = CryptCreateHash(hCtx, Algorithm, 0, 0, hHash) 
    If lRes <> 0 Then 
     lRes = CryptHashData(hHash, ByVal Str, Len(Str), 0) 
     If lRes <> 0 Then 
      lRes = CryptGetHashParam(hHash, HP_HASHSIZE, lLen, 4, 0) 
      If lRes <> 0 Then 
       ReDim abData(0 To lLen - 1) 
       lRes = CryptGetHashParam(hHash, HP_HASHVAL, abData(0), lLen, 0) 
       If lRes <> 0 Then 
        For lIdx = 0 To UBound(abData) 
         HashString = HashString & Right$("0" & Hex$(abData(lIdx)), 2) 
        Next 
       End If 
      End If 
     End If 
     CryptDestroyHash hHash 
    End If 

End If 
CryptReleaseContext hCtx, 0 
If lRes = 0 Then 
    MsgBox Err.LastDllError 
End If 
End Function 
+2

歡迎來到堆棧溢出!請使用英語,這樣每個人都會理解你。 – bytecode77

+0

請使用英文。 – CCoder

+0

是的,是的..使用英語。你怎麼敢。我們美國人太懶惰,無法使用翻譯法語的許多工具之一。 – Andy