使用hashlib或其他方法将Java MD5`java.security.MessageDigest.getInstance(“ MD5”)`代码转换为Python2.7

时间:2019-02-24 13:49:15

标签: java python-2.7 md5

Java代码:

public static String md5(byte[] source) throws NoSuchAlgorithmException {
    char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
    md.update(source);
    byte tmp[] = md.digest();
    char str[] = new char[32];
    int k = 0;
    for (int i = 0; i < 16; i++) {
      str[k++] = hexDigits[tmp[i] >>> 4 & 0xf];
      str[k++] = hexDigits[tmp[i] & 0xf];
    }

    return new String(str);
  }

然后输入以下代码:

77,48,48,47,48,48,47,48,48,47,114,66,65,72,104,108,120,121,80,107,113,65,89,90,78,106,65,65,67,102,97,85,116,51,77,89,52,55,53,46,106,112,101,103,49,49

返回:

2fa040f96503fdabf5fd171da1473069

然后在python2.7中,我的代码:

def md5(string):
    m = hashlib.md5()
    m.update(string)
    return m.hexdigest()

相同的输入和返回:

e480188fdf66deeec3d5a2c42094dd73

那么如何编辑我的python代码以得到相同的收益?

1 个答案:

答案 0 :(得分:1)

仔细观察您的输入字符串774848474848474848471146665721...,它看起来像是表示ASCII字符的字节值的串联在一起:

77 48 48 47 48 48 47 48 48 47 114 66 65 72 ...

将它们转换为字符,我们得到字符串M00/00/00/rBAHhlxyPkqAYZNjAACfaUt3MY475.jpeg11

计算M00/00/00/rBAHhlxyPkqAYZNjAACfaUt3MY475.jpeg11的MD5哈希,得到2fa040f96503fdabf5fd171da1473069。这是您的Java代码返回的哈希值。

另一方面,计算字符串774848474848474848471146665721...的MD5哈希将返回e480188fdf66deeec3d5a2c42094dd73。这是您的Python代码返回的哈希值。

我已经能够使用您的Java代码和Python代码来计算这两个哈希,并在两者中获得相同的结果。为了在Java中将字符串转换为byte数组,我在字符串上调用了.getBytes("UTF-8")。 (我使用的是Python 3而不是Python 2,因此必须插入对.encode("utf-8")的调用,但这是一个问题。)

因此,用于计算MD5哈希值的Java和Python代码示例返回不同的结果,因为您向它们传递了不同的输入数据。