3

我正在尝试将 md5hash 函数从 php 重写为 python3.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

我正在尝试

PHP:

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

Python:

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

我不知道如何解决它,请帮助我:(

4

1 回答 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')

你会明白我的意思。)虽然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
于 2013-03-30T01:33:34.717 回答