Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vba中的hmacsha1 encrpyt不等于使用pack方法的php hmac_sha1值_Php_Vba_Encryption_Vb6 - Fatal编程技术网

vba中的hmacsha1 encrpyt不等于使用pack方法的php hmac_sha1值

vba中的hmacsha1 encrpyt不等于使用pack方法的php hmac_sha1值,php,vba,encryption,vb6,Php,Vba,Encryption,Vb6,这是我的VB6代码 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

这是我的VB6代码

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方法加密数据,两种方法的输出都是相同的,但是如果我们使用pack方法加密数据,则会显示不同的结果。

如果
“1989151498577ad12a9f8adf157f5abf”
应该是十六进制的密钥,则php代码是正确的

验证Encryp_HMACSHA1是否希望密钥为数据或十六进制字符串。

通过以十六进制显示键来验证转换为数据后的键是否相同。您的VB6
Pack
功能是:

  • 一次将两个十六进制数字转换为字节,然后
  • 使用ANSI到Unicode转换将这些值转换为字符
然后您的
Encryp\u HMACSHA1

  • 获取此类字符串值,并使用转换为UTF-8将其转换为字节数组,以及
  • 将其输入
    crypto.Key
    进行咀嚼
以这种方式使用字符串进行快速和松散的播放会损坏您的键值

我被申请复制错误的签名结果,方法是使用已知的工作VB6代码并修改它以执行相同的失真

我不知道为什么要使用这种巨大而沉重的.Net inter-clop方法来完成部分工作,然后在MSXML DOM中进行另一次非常沉重的运行,只用于Base64编码。哇,你有足够的内存让它运行吗

我使用了附件中的
HS1.cls
HS1演示1-1.zip
)中的

那么所需要的就是:

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“Unicode”文本(UCS-2/UTF-16LE),键为十六进制文本的“Unicode”字符串。例如:

txtSignature.Text = HMACSHA1("test", "1989151498577ad12a9f8adf157f5abf")
果然,它产生了:

4QXpNBD/cv0sLIfFIsFGe5D57gI=
这也比(a.)使用.NETCLR和Framework库加上“interop”和(b.)MSXML作为围绕简单API调用的超胖包装要轻得多


但是,如果您真的愿意,您可以保留所有开销,只要您更正“十六进制数字串到密钥”解析逻辑。

如果我们不使用pack方法加密数据,两种输出都是相同的,但如果使用pack,则会显示不同的结果。请建议一些解决方案如答案中所述,PHP代码生成正确的哈希值。您需要找出VB6实现中需要更改的内容,仔细查看文档,了解预期的输入格式应该会有所帮助。哈希不是加密。感谢您的回答,您的答案非常有效,你让我开心。我感激