平台本身是用 java 写的,想用 python 同样实现一套,但是使用的终端已经内置了加密算法,所以算法不可变,算法逻辑中间有一段大概是这样:
byte[] value = Utf8.encode(inputString) // 工具类实现字符串转 byte[]
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256")
for (int i = 0; i < 1024; i++) {
value = messageDigest.digest(value);
// 因 java 语言的特性,上面获取摘要的的字节数组是里面是包含负数的,包含负数数据的 byte[]又直接进行摘要。
}
return new String(Hex.encode(value)) // Hex 工具类转成 16 进制字符串
实现相同算法时使用 python3:
sha256 = hashlib.sha256()
bs = bytes(inputString, encoding="utf-8")
sha256.update(bs)
for i in range(0,1023):
sha256.update(sha256.digest()) # 此时拿到的 bytes 与 java 拿到的其实已经是不一样了,所以最终拿到的摘要值也就不同了
print(sha256.hexdigest())
其实平台使用的的摘要方式如果是 1024 次摘要十六进制字符串的摘要
的话,那其实与语言特性就无关了,但是实现方式却是使用连续对字节数组(byte[])进行摘要。python 的 bytes 又不支持负数,导致最终多次计算之后的值不一致。
大佬们看看怎么解决这个问题。
1
yyang179 2020-03-09 21:50:15 +08:00 via Android
试试把 bytes 转成 np.int8 的数组,然后再 sha256.update。
|
2
wwqgtxx 2020-03-09 21:56:34 +08:00 via iPhone 2
看了一下 python 代码部分,你在循环中 update 应该就违反了 java 代码的本意,python 的 hashlib 中,调用多次 update 之后会将多次的输入拼接后进行 hash,你可能需要要循环中重新初始化一个新的 hashlib.sha256
|
3
smallerpig OP @wwqgtxx 大佬你说的是正确的,用你的方法修改了 Python 方法:
``` python temp = bytes(inputString, encoding="utf-8") for i in range(0, 1024): sha256 = hashlib.sha256() sha256.update(temp) temp = sha256.digest() ``` 核心就是把实例化 sha256 的操作放到循环里面去,这样每次一个,而不是每次在同一个 hashlib.sha256 对象里去 update。 感谢你的回复,解决了我一天的问题。 |