从Python生成的MD4哈希码不同于在线。我知道一定是由于编码。你能帮我吗?
from Crypto.Hash import MD4
psk = 'The quick brown fox jumps over the lazy dog'
h = MD4.new()
h.update(psk.encode('UTF-16LE'))
print(f'UTF-16LE: {h.hexdigest()}')
h.update(psk.encode('UTF-16'))
print(f'UTF-16: {h.hexdigest()}')
h.update(psk.encode('UTF-8'))
print(f'UTF8: {h.hexdigest()}')
h.update(psk)
print(f'UTF8?: {h.hexdigest()}')
使用不同编码的“快速的棕色狐狸跳过懒狗”的哈希输出为:
UTF-16LE: 4e6a076ae1b04a815fa6332f69e2e231
UTF-16: db8ae265b09c6ffa1e2fc163d66f64a4
UTF8: 324563ee68cc8009c82778d70d958723
UTF8?: 1aaf934b705b1d2aab69b0cf2a9cd87b
在线MD4哈希函数(https://emn178.github.io/online-tools/md4.html)会给出
1bee69a46ba811185c194762abaeae90
更新:
感谢您的评论,我已经更新了代码:
import getpass
from Crypto.Hash import MD4
psk = 'The quick brown fox jumps over the lazy dog' #getpass.getpass()
h = MD4.new(data=psk.encode('UTF-16LE'))
print(f'UTF-16LE: {h.hexdigest()}')
h = MD4.new(data=psk.encode('UTF-16'))
print(f'UTF-16: {h.hexdigest()}')
h = MD4.new(data=psk.encode('UTF-8'))
print(f'UTF8: {h.hexdigest()}')
h = MD4.new(data=psk)
print(f'UTF8?: {h.hexdigest()}')
新的输出是
UTF-16LE: 4e6a076ae1b04a815fa6332f69e2e231
UTF-16: c6274a58a30e434503b45d2ce95e6c19
UTF8: 1bee69a46ba811185c194762abaeae90
UTF8?: 1bee69a46ba811185c194762abaeae90
我还发现https://emn178.github.io/online-tools/md4.html使用UTF-16,即使我将其传递给UTF-16LE编码的文件也是如此。
WPA2 Enterprise要求文本以UTF-16LE编码。
问题来源:stackoverflow
使用update显然可以更新哈希,这意味着您可以提供更多的消息。因此,实际上您实际上是使用不同的编码多次输入字符串,这最终给出的哈希值不仅仅是字符串。
如果仅更新一次,您将获得预期的结果。
from Crypto.Hash import MD4
psk = 'The quick brown fox jumps over the lazy dog'
h = MD4.new()
h.update(psk.encode('UTF-8'))
print(f'UTF8: {h.hexdigest()}')
从摘要的文档中,hexdigest
方法是派生的:
返回到目前为止传递给update()
方法的字符串的摘要。这是一个digest_size
字节的字符串,可能包含非ASCII字符,包括空字节。
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。