本文目录导读:
我来详细解释MD5算法的实现逻辑,MD5(Message Digest Algorithm 5)是一种广泛使用的哈希算法,产生128位(16字节)的哈希值。
MD5算法整体流程
数据预处理
def md5_padding(message):
"""
对消息进行填充,使其长度对512取模等于448
"""
original_length = len(message) * 8 # 原始消息长度(位)
# 先添加一个'1'位
message += b'\x80'
# 填充0直到长度满足条件:len % 512 = 448
while (len(message) * 8) % 512 != 448:
message += b'\x00'
# 附加原始消息长度(64位,小端序)
message += original_length.to_bytes(8, 'little')
return message
初始化MD缓冲区
# 四个32位寄存器,初始值 A = 0x67452301 B = 0xEFCDAB89 C = 0x98BADCFE D = 0x10325476
主循环处理
def md5_process(chunk, A, B, C, D):
"""
处理512位(64字节)的数据块
"""
# 将64字节数据分成16个32位字
words = []
for i in range(16):
words.append(int.from_bytes(chunk[i*4:(i+1)*4], 'little'))
# 保存当前状态
AA, BB, CC, DD = A, B, C, D
# 4轮处理,每轮16步,共64步
for i in range(64):
if i < 16: # 第1轮
f = (B & C) | (~B & D)
g = i
elif i < 32: # 第2轮
f = (D & B) | (~D & C)
g = (5 * i + 1) % 16
elif i < 48: # 第3轮
f = B ^ C ^ D
g = (3 * i + 5) % 16
else: # 第4轮
f = C ^ (B | ~D)
g = (7 * i) % 16
# 更新值
f = (f + A + words[g] + K[i]) & 0xFFFFFFFF
A = D
D = C
C = B
B = (B + left_rotate(f, s[i])) & 0xFFFFFFFF
# 更新最终值
return (A + AA) & 0xFFFFFFFF, \
(B + BB) & 0xFFFFFFFF, \
(C + CC) & 0xFFFFFFFF, \
(D + DD) & 0xFFFFFFFF
def left_rotate(value, shift):
"""
循环左移操作
"""
return ((value << shift) | (value >> (32 - shift))) & 0xFFFFFFFF
完整MD5实现
def md5(message):
"""
计算消息的MD5哈希值
"""
# 1. 数据填充
padded_message = md5_padding(message)
# 2. 初始化寄存器
A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476
# 3. 处理每个512位数据块
for i in range(0, len(padded_message), 64):
chunk = padded_message[i:i+64]
A, B, C, D = md5_process(chunk, A, B, C, D)
# 4. 输出最终哈希值
result = (A.to_bytes(4, 'little') +
B.to_bytes(4, 'little') +
C.to_bytes(4, 'little') +
D.to_bytes(4, 'little'))
return result.hex()
关键常数表
# 正弦常数表(64个)
K = [int(abs(math.sin(i+1)) * 2**32) for i in range(64)]
# 循环左移位数
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]
算法特点
- 不可逆性:MD5是单向函数,无法从哈希值还原原始数据
- 雪崩效应:输入微小变化会导致输出巨大差异
- 定长输出:无论输入多长,输出始终是128位
安全注意事项
⚠️ 重要提示:MD5已被证明存在严重的安全漏洞,不应用于:
- 密码存储
- 数字签名
- 证书验证
建议使用SHA-256或更高版本的哈希算法。
这个实现展示了MD5的核心逻辑,但实际应用中应使用像Python的hashlib库这样的标准实现。
标签: 源码实现