分享一下MD5算法加密的过程,参考了MD5算法原文 。希望对大家有所帮助!
1. 摘要
这篇文章主要描述了MD5消息摘要算法 。算法输入为任意长度的消息 , 输出为一个128位的消息摘要 。假定两个不同的文件产生相同的报文摘要或由给定的报文摘要产生原始信息在计算上是行不通的 。MD5算法适用于数字签名应用,例如在RSA中,大文件在被私钥加密之前,需要以一种安全的方式来进行压缩 。
MD5算法在设计上会在32位计算上会更快,另外 , MD5算法不需要大型的置换表格;实现代码简洁紧凑 。
MD5算法是MD4消息摘要算法的扩展 。MD5比MD4在速度上会稍慢,但是在设计上更加“保守” 。MD5被设计的初衷就是MD4在当时还没有被证明的情况下就被广泛的使用;因为MD4设计之初为了追求速度,安全性方面处于密码分析学攻击的“边缘” 。MD5就稍有保守,放弃一点速度获得更大的安全保障,除此之外,还包含了一些学术界提出的建议和一些优化措施 。
2. 术语和符合
本文中一个“字”是32位 , 一个“字节”是8位 。
我们定义x_i代表“x减去I”.如果减数是一个表达式,则用括号括?。?纾簒_{i+1} 。同样我们用^代表求幂,这样x^i则代表x的i次幂 。“+”代表“字”之间的相加,X<<< s代表X左移s位 , not(X)表示对X进行按位补运算,X v Y表示按位或 。X xor Y表示按位异或,XY表示按位与 。
3. MD5算法描述
我们假设有一个b位长的信息作为输入,然后我们算出他的摘要信息 。b是一个非负整数 , b有可能是0,不需要一定是8的倍数 , 可能会非常得大 。我们将输入信息描绘如下:
m_0 m_1 .. m_{b-1}
接下来的五步我们来算出它的摘要 。
3.1 step 1 . 填充
我们将输入信息填充到长度对512取余对于448 。无论输入信息的长度多少,填充总是会发生的,即使本身的长度就已经满足模512对于448的情况下 。
过程如下:
在输入信息后添加一个“1”位,其余添加“0”位使得输入信息长度满足对512取余对于448 。总的来说,至少添加一位,至多添加512位 。
文章插图
举个例子:66
文章插图
3.2 step2. 补充数据长度
将输入信息b用64位表示并添加到填充的数据之后,如果b大于2^64的话,则只取低64位 。
至此 , 我们的处理结果刚好是512的倍数 , 等效的,也是16字的倍数,我们用M[0…N-1]来表示这个结果,其中N是16的倍数 。
文章插图
3.3 step 3. 初始化MD缓冲区
用一个四字的缓冲区(A,B,C,D)来计算消息摘要,这里的A , B,C , D每一个都是一个32位的寄存器 。这些寄存器的初始值如下,用16进制表示的 , 低位字节优先 。
word A: 01 23 45 67
word B: 89 ab dc ed
word C: fe dc ba 98
word D: 76 54 32 10
3.4 step 4. 处理消息
我们首先需要定义四个辅助函数 。
F(X,Y,Z) = XY v not(X) Z
G(X,Y,Z) = XZ v Y not(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X v not(Z))
对于函数F来说,在每一位上F函数就像是一个选择器:if X then Y else Z 。
这一步需要一个64长度的表格T[1…64],由sin函数构造而成 。T[i]是4294967296次运行abs(sin(i))的结果,以此类推即可 。
我们需要进行一下处理
/* 处理原数据. */
For i = 0 to N/16-1 do
/* 将数据赋值给X. */
For j = 0 to 15 do
Set X[j] to M[i*16+j].
end /* 结束对j的循环 */
/* 把A保存位AA B保存为BB C保存为CC D保存位DD */
AA = A
BB = B
CC = C
DD = D
/* 第一轮操作 */
/* [abcd k s i] 表示如下操作
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
/* 第二轮操作 */
/* [abcd k s i] 表示如下操作
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
【文件md5计算速度 md5加密算法原理及实现】
- linux解压zip命令到当前目录 unzip解压到指定文件夹
- word文档右边有空白区域怎么删除 打开文件后右边空白的删除
- 教你正确给文件夹设置密码保护 win10怎么加密文件夹
- 文件夹无法删除的解决方法分享 文件夹无法删除怎么办
- excel文件太大打开很慢如何处理 excel文件过大怎么缩减
- 先压缩文件再发送吗 电脑微信不支持发送文件夹怎么解决
- excel如何插入文件 把文件放到excel表格里的设置
- cad文件太大怎么变小 cad文件深度清理命令
- 怎么跳过解压密码解压 有关解压文件的步骤
- 怎么给电脑文件夹设置密码 文件夹加密的方法分享