MD5算法的学习
MD5_百度百科
MD5信息摘要算法(Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位的(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德v·李维斯特设计,与1992年公开,用以取代MD4算法。
MD5的散列值通常用十六进制表示,如:
MD5(1)= C4CA4238A0B923820DCC509A6F75849B
MD5(2)= C81E728D9D4C2F636F067F89CC14862C
MD5(MD5) = 7F138A09169B250E9DCB378140907378
算法步骤
1.数据填充与分组
使消息长度满足特定条件(长度为512的倍数),MD5对消息进行填充。
在消息后附加一个1位
接着,附加若干个0位,直到消息长度(mod 512)等于448位
最后,附加消息的原始长度(以64位二进制表示),使总长度达到512的倍数
例如:“abc”
a的ASCLL:97,二进制位:01100001
b的ASCLL:98,二进制位:01100010
c的ASCLL:99,二进制位:01100011
拼接:01100001 01100010 01100011(24位)
添加1个1:01100001 01100010 01100011 1(25位)
添加0:01100001 01100010 01100011 10000000 00000000 00000000 ... (共 423 个 0)
附加原始消息:
原始消息是24位:24 = 0x18 = 00000000 00000000 00000000 00000000 00011000
- 大端序(Big Endian):高字节存储在低地址,低字节存储在高地址。
- 小端序(Little Endian):低字节存储在低地址,高字节存储在高地址。
以小端序是:
00011000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
最后,将这64位加到之前的末尾:
01100001 01100010 01100011 10000000 00000000 00000000 ... (423 个 0) ... 00011000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
- 消息内容:
01100001 01100010 01100011
- 填充部分:
10000000 00000000 ...(423 个 0)
- 长度部分:
00011000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
2.初始化散列值
MD5算法初始化了4个32位的缓冲区变量
A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476
3.计算散列值
将填充后的消息按512位分成多个块,每个块进一步分为16个32位的小块
(1)定义辅助函数
(2)主循环
MD5对每个消息块执行64次迭代(分为四轮,每轮16次),每次使用一个非线性函数和一个常量K[i]
- 每轮的常量 K[i]K[i]K[i] 是从正弦函数生成的。
- 每次迭代都将更新缓冲区变量 A,B,C,DA, B, C, DA,B,C,D。
每次迭代的核心公式:
- a,b,c,d 是缓冲区变量。
- M[k]M[k]M[k] 是当前消息块的某个子块。
- K[i]K[i]K[i] 是常量。
- sss 是循环左移的位数。
(3)更新缓冲区
(4)输出结果