一文读懂MD5

曾经沧海难为水,除却巫山不是云。-- 元稹
MD5简介
MD5消息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位的散列值(hash value),用于确保信息传输完整一致,MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计。
MD5实现步骤
这里根据rfc1321中的描述进行说明, 下文的描述中假设有一个b-bit的消息作为输入,即:
m = m_0 m_1 ... m _{b-1}
步骤一: 数据填充(Append Padding Bits)
MD5是按照分块进行处理的,分块长度为512bit, 大多数情况下,数据的长度不会恰好满足是512的整数倍,因此需要进行padding到给定的长度。
填充规则: 原始明文消息的b位之后补100..., 直到满足b + paddingLength % 512 = 448, 那如果b % 512在[448, 512(0)]之间呢,则在增加一个分块,按照前面的规则填充即可(因为rfc里面说了,最少填充1bit)。
步骤二: 长度填充
之前说了,需要满足b + paddingLength % 512 = 448, 那么对于最后一个分块,就还剩512 - 448 = 64 bit 这剩下的64bit存放的是原始消息的长度,也就是b。这也就是说,MD5最多可以处理明文长度小于等于2^64 bit的数据。
经过上面两个步骤的处理,最终得到的处理后的数据如下图所示:

步骤三: 初始化MD缓冲区
MD Buffer是4个32bit的向量,贴一下rfc的原文:
A four-word buffer (A,B,C,D) is used to compute the message digest. Here each of A, B, C, D is a 32-bit register. These registers are initialized to the following values in hexadecimal, low-order bytes first):
word A:01 23 45 67
word B:89 ab cd ef
word C:fe dc ba 98
word D:76 54 32 10
不过这里要注意一点,程序实现的话,需要按照下面的方式来处理一下(上面加黑的部分, 低字节在前面[low-order byte first]):
let A = 0x67452301;
let B = 0xEFCDAB89;
let C = 0x98BADCFE;
let D = 0x10325476;
步骤四: 对每一个分块进行处理
这一步是整个MD5算法的核心

本文详细介绍了MD5消息摘要算法,包括数据填充、长度填充、初始化MD缓冲区、分块处理核心步骤及代码实现,旨在帮助读者全面理解MD5的工作原理。
最低0.47元/天 解锁文章
2801

被折叠的 条评论
为什么被折叠?



