2016-06-22 72 views
0

這是我的VB6代碼HMACSHA1 encrpyt不等於PHP和包裝方法HMAC_SHA1價值

Private Function Encryp_HMACSHA1(pData As String, pSecretKey As String) As String 
Dim encoder As Object 
Dim crypto As Object 
Dim i As Integer 
Dim bSecretKey() As Byte 
Dim bData() As Byte 
Dim bEncrypted() As Byte 

Set encoder = CreateObject("System.Text.UTF8Encoding") 
Set crypto = CreateObject("System.Security.Cryptography.HMACSHA1") 

bData = encoder.Getbytes_4(pData) 
bSecretKey = encoder.Getbytes_4(pSecretKey) 
crypto.Key = bSecretKey 
bEncrypted = crypto.ComputeHash_2(bData) 


Set encoder = Nothing 
Set crypto = Nothing 

Dim objXML As MSXML2.DOMDocument 
Dim objNode As MSXML2.IXMLDOMElement 
Set objXML = New MSXML2.DOMDocument 
Set objNode = objXML.createElement("b64") 

objNode.dataType = "bin.base64" 
objNode.nodeTypedValue = bEncrypted 
EncodeBase64 = objNode.Text 

Encryp_HMACSHA1 = EncodeBase64 

Set objNode = Nothing 
Set objXML = Nothing 

End Function 

Public Function Pack(strlength As String) As String 
Dim Temp As String 
Dim MyString As String 
Dim i As Integer 

MyString = "" 
For i = 1 To Len(strlength) Step 2 
    Temp = Mid(strlength, i, 2) 
    MyString = MyString & Chr(CLng("&H" & Temp)) 
Next 

Pack = MyString 
End Function 

Private Sub Command1_Click() 
Dim pKey As String 
    pKey = Pack("1989151498577ad12a9f8adf157f5abf") 
    Text1.Text = Encryp_HMACSHA1("test", pKey) 
End Sub 

結果爲VB是:03AM+k4B3mPEZlkCatDvdiHOuuc=

這是我的PHP代碼

$key = "1989151498577ad12a9f8adf157f5abf"; 

$decodeKey = pack("H*",$key); 

$data = "test"; 

$hash = hash_hmac("SHA1", $data, $decodeKey, TRUE); 

$signature = base64_encode($hash); 


echo $signature; 

結果爲php是:4QXpNBD/cv0sLIfFIsFGe5D57gI=

請幫助解決設備通貨膨脹。 另外還有一個問題,如果我們在不使用包方法的情況下加密數據,兩個輸出都是相同的,但是如果我們使用pack,它會顯示不同的結果。

+0

散列不是加密。 – Bob77

回答

0

你的VB6 Pack功能是:

  • 以一次字節轉換兩個十六進制數字,然後
  • 轉換那些值轉換爲ANSI到Unicode轉換的字符。

那麼您Encryp_HMACSHA1

  • 採取這樣字符串值並將其轉換成使用轉換爲UTF-8字節陣列,並
  • 供稿成crypto.Key蒙克上。

以這種方式使用字符串播放快速和鬆散已損壞您的關鍵值。

我是適用於重現通過利用已知的工作VB6代碼,並改變它來執行相同的失真不正確的簽名結果。

我不知道爲什麼你正在使用這個偉大的大重型.Net的馬蹄聲間辦法做的工作的一部分,然後以另一種非常沉重運行通過MSXML DOM只爲Base64編碼。哇,你有足夠的RAM甚至可以運行嗎?

我從附件(HS1 Demo 1-1.zip)所使用的HS1.cls

[VB6] HMAC-SHA-256, HMAC-SHA-1 Using Crypto API #35

然後所有需要的是:

Private Function HMACSHA1(ByVal Data As String, ByVal Key As String) As String 
    With New HS1 
     .InitHmac .Decode(Key, edfHexRaw) 
     HMACSHA1 = .Encode(.HMACSHA1(.ToUTF8(Data)), edfBase64, efNoFolding) 
    End With 
End Function 

其中數據VB6/Windows的 「統一」 的文字( UCS-2/UTF-16LE)和密鑰是一個「Unicode」字符串的十六進制文本。例如。:

txtSignature.Text = HMACSHA1("test", "1989151498577ad12a9f8adf157f5abf") 

果然,它產生:

4QXpNBD/cv0sLIfFIsFGe5D57gI= 

這也是遠重量更輕比使用(a。)中的.NET CLR和Framework庫加 「互操作」 和MSXML(B)。作爲圍繞簡單API調用的超胖包裝。

但是,如果您確實想要只要您將「十六進制數字的字符串」更正爲「解析邏輯」,就可以保留所有這些開銷。

+0

謝謝你的回答,你的回答是完美的,你創造了我的一天。我有責任 – Malik

0

如果"1989151498577ad12a9f8adf157f5abf"應該是十六進制的關鍵PHP代碼是正確的。

驗證是否Encryp_HMACSHA1預計該密鑰數據或十六進制字符串。
驗證如果鍵轉換後的數據是相同的由十六進制顯示它們

+0

如果我們使用pack方法加密數據,兩個輸出都是相同的,但是如果我們使用pack方法,它會顯示不同的結果。請提出一些解決方案 – Malik

+0

正如答案中所述,PHP代碼會生成正確的散列值。您需要確定VB6實現中需要更改的內容,仔細查看預期輸入格式的文檔可能會有所幫助。 – zaph