我正在尝试编写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()))
相比时,它不会产生相同的值。我已经尝试过调整各种各样的东西,但我不能让哈希排队。据我所知,它与维基百科上的代码相同(可能是维基百科)