PHP到Python的MD5哈希但结果不正确

3
我是一个有用的助手,可以为您翻译文本。

我试图将 PHP 中的 md5hash 函数重写为 Python 3.2,但是失败了:

PHP 代码:

function MD5Hash($str) {
    $m = md5($str);
    $s = '';
    foreach(explode("\n", trim(chunk_split($m, 2))) as $h) {
        $s .= chr(hexdec($h));
    }
    return $s;
}

并且Python代码:

def md5hash(self, st):
    m   = hashlib.md5(st).hexdigest()
    print(str(st) +" : "+m)
    s   = bytes()
    for i in range(0, len(m), 2):
        s   += chr(int(m[i:min(i+2, len(m))], 16)).encode('utf-8')
    return s

i'm try with

PHP:

echo(base64_encode(MD5Hash(MD5Hash("123123"))));
result: KXJU6b/guPOcaC7aMLub4A==

Python:

print(base64.b64encode(self.md5hash(self.md5hash(b"123123"))))
result: fcOsw6VSwo5iHEvCjz98w7JMW09w

我不知道如何修复它,请帮忙 :(

2
为什么不使用hashlib - IT Ninja
1个回答

4

使用binascii.unhexlify函数:

import base64
import hashlib
import binascii

def md5hash(st):
    m = hashlib.md5(st).hexdigest()
    # print(str(st) +" : "+m)
    s = binascii.unhexlify(m)
    return s

print(base64.b64encode(md5hash(md5hash(b"123123"))))

产量
KXJU6b/guPOcaC7aMLub4A==

顺便说一下,转换为Unicode然后再转回字节码是导致您原始计算出错的原因。使用utf-8编码会将某些Unicode字符转换为两个字节。这不是按照您的意图打包字节。请添加一个跟踪该值的打印语句。
chr(int(m[i:min(i+2, len(m))], 16)).encode('utf-8')

你可以试试这个方法,使用bytearray可以挽救大部分代码。虽然 binascii.unhexlify 更快速且编码更易,但是你会明白我的意思。

def md5hash(st):
    m = hashlib.md5(st).hexdigest()
    s = bytearray([int(m[i:min(i+2, len(m))], 16) for i in range(0, len(m), 2)])
    return s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接