MD5哈希函数python

时间:2017-05-28 19:39:22

标签: python hash md5

我正在尝试编写MD5哈希函数,以便在Wikipedia上完成伪代码的实验目的。这是我的代码:

dot()

它产生哈希值,但与s = [ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, ] K = [ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 ] def hash(message): if isinstance(message, str): message = message.encode('utf-8') message = int.from_bytes(message, 'little') # Initialize variables: a0 = 0x67452301 # A b0 = 0xefcdab89 # B c0 = 0x98badcfe # C d0 = 0x10325476 # D original_length = message.bit_length() # Pre-processing: add a single 1 bit message = (message << 1) + 1 # Pre-processing: padding with zeros. # TODO: no need for a while loop, just shift the right number of bits while message.bit_length() % 512 != 448: message = message << 1 # Add original length of message message = (message << 64) + (original_length % pow(2, 64)) while message: # 512 bit chunk chunk = message & (pow(2, 512) - 1) message = message >> 512 # Split the chunk into 16 32-bit words M = [] while chunk: M.append(chunk & (pow(2, 32) - 1)) chunk = chunk >> 32 # Initialize hash value for this chunk A = a0 B = b0 C = c0 D = d0 for i in range(64): if i < 16: F = (B & C) | (bit_not(B) & D) g = i elif i < 32: F = (D & B) | (bit_not(D) & C) g = (5*i + 1) % 16 elif i < 48: F = (B ^ C ^ D) g = (3*i + 5) % 16 else: F = C ^ (B | bit_not(D)) g = (7*i) % 16 dTemp = D D = C C = B B = leftrotate((A + F + K[i] + M[g]), s[i]) A = dTemp a0 = A b0 = B c0 = C d0 = D ret = (a0 << (32*3)) + (b0 << (32*2)) + (c0 << 32) + d0 return ret.to_bytes(16, 'little').hex() def bit_not(x): """Invert all bits in x (as opposed to ~ which will also make the number nagative)""" return pow(2, 32) - 1 - x def leftrotate(x, c): """Rotate bits left by c bits""" return (x << c) & (pow(2, 32)-1) | (x >> (32-c)) if __name__ == '__main__': import sys print(hash(sys.stdin.read())) 相比时,它不会产生相同的值。我已经尝试过调整各种各样的东西,但我不能让哈希排队。据我所知,它与维基百科上的代码相同(可能是维基百科)

0 个答案:

没有答案