MD5算法填充规则

#MD5 填充规则
填充一个1 和 n 个0 还有一个64位的填充前的长度

n的个数是怎么计算的呢
要求 1.整个的内容必须是 512的整数倍 所以后面长度大于512就必须要取余%运算的原因
2.后面要一个64位的二进制表示填充前的长度

假如要进行MD5的值为 b’0123456789’ 计算填充前的长度为80bits
很明显不足512个bits 先填充的内容为 b’0x80’(10000000) 后面再填充 512-64-80-8 = 360个0bits填充 45个bytes = 0x2D个bytes
b’0123456789’ + b’\x80’ + (b’\x0’ * 45) + b’\x50’ + b’\x0’ + b’\x0’ + b’\x0’ + b’\x0’ + b’\x0’ + b’\x0’ + b’\x0’
上面是填充的是小于512个bits的

如果是大于 512bits
加入MD5的值为b’0’513 计算填充前的长度为 5138 = 4104bits 0x1008
要填充的内容为b’0x80’(10000000) 4104 % 512 = 8 后面再填充 512-64-8-8 = 432 432个bits填充 54个bytes
b’0’*513 + b’\x80’ + (b’\x0’ * 54) + b’\x8’ +b’\x10’ + b’\x0’ + b’\x0’ + b’\x0’ + b’\x0’ + b’\x0’ + b’\x0’

bitlen = lambda s: len(s) * 8

msglen = bitlen(msg)
mod512val = msglen%512
zero_pad = 512 - 64 - mod512val - 8 
msg = msg + b'\x80' + (b'\x0' * (zero_pad//8)) + struct.pack('<Q', msg_len)

#优化一下

msglen = bitlen(msg)
zero_pad = (56 - (len(msg) + 1) % 64) % 64
msg = msg + b'\x80'
msg = msg + b'\x00' * zero_pad + struct.pack('<Q', msg_len)#msg_len 转换成小端的ulonglong

猜你喜欢

转载自blog.csdn.net/qq_36535153/article/details/131230254