jyjjf 发表于 2023-5-12 16:30

sha1的输出结果不一样?怎么回事?【已解决】

本帖最后由 jyjjf 于 2023-5-13 10:41 编辑

最近再调试一个关于加解密的VB.Net 字符串加密类(https://www.cnblogs.com/yhsc/p/4393670.html),
发现里面有个sha1的hash问题(问题代码如下),
代码我的理解是对输入的字符串进行sha1加密并补位或截取,
但是好像并不是sha1加密,
譬如我TruncateHash("1",24) ,
按道理应该是sha1的结果是356A192B7913B04C54574D18C28D46E6395428AB00000000,
但是结果是                        E91FE173F59B063D620A934CE1A010F2B114C1F300000000,
明显不一样。
可是使用空白结果倒是一样的,TruncateHash("",24)
都是DA39A3EE5E6B4B0D3255BFEF95601890AFD8070900000000
说明后面的00000000是补位。
问一下大神,这个sha1是怎么回事?


    Private Function TruncateHash(ByVal key As String, ByVal length As Integer) As Byte()   
      Dim sha1 As New System.Security.Cryptography.SHA1CryptoServiceProvider' Hash the key.
      Dim keyBytes() As Byte = System.Text.Encoding.Unicode.GetBytes(key)
      Dim hash() As Byte = sha1.ComputeHash(keyBytes)' Truncate or pad the hash.
      ReDim Preserve hash(length - 1)
      Return hash
    End Function

kwk99 发表于 2023-5-12 18:13

使用python sha1 加密出来的结果与楼主的预想是一致的

import hashlib
str = '1'
estr = str.encode('utf-8')
s1 = hashlib.sha1(estr).hexdigest().upper()

print(f'sha1加密后的结果为:{s1}')
print(f'进行补位后为:{s1}00000000')

结果如下

jyjjf 发表于 2023-5-12 18:34

kwk99 发表于 2023-5-12 18:13
使用python sha1 加密出来的结果与楼主的预想是一致的

import hashlib


所以,很奇怪为什么结果会是另外一个E91FE173F59B063D620A934CE1A010F2B114C1F300000000,而不是356A192B7913B04C54574D18C28D46E6395428AB00000000

hrpzcf 发表于 2023-5-12 19:01

换个编码器,可能是编码器的问题
比如System.Text.Encoding.UTF8.GetBytes

流云 发表于 2023-5-12 20:33

他这个sha1是标准的 但是运算前他给数据尾巴+上了0x00比如这个E91FE173F59B063D620A934CE1A010F2B114C1F300000000 就是对0x3100运算的结果

猜测 可能是宽字符的原因吧

jyjjf 发表于 2023-5-13 10:38

hrpzcf 发表于 2023-5-12 19:01
换个编码器,可能是编码器的问题
比如System.Text.Encoding.UTF8.GetBytes

感谢提示,知道怎么回事了,改成System.Text.Encoding.ASCII.GetBytes这个就结果一样了,很奇怪

jyjjf 发表于 2023-5-13 12:53

知道细节了,平时转换都是ancii字符串转换,如果都转换十六进制,再转换sha1,结果不一样(十六进制不一样)
如1的字符转换,十六进制是31,sha1结果是356A192B7913B04C54574D18C28D46E6395428AB
如1的UNICODE十六进制是3100,sha1结果就是E91FE173F59B063D620A934CE1A010F2B114C1F3,

pjy612 发表于 2023-5-31 12:14

换 System.Text.Encoding.UTF8 估计就好了
页: [1]
查看完整版本: sha1的输出结果不一样?怎么回事?【已解决】