没有合适的资源?快使用搜索试试~ 我知道了~
MD5 报文摘要算法源码.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 118 浏览量
2022-11-01
20:33:09
上传
评论
收藏 45KB DOCX 举报
温馨提示
试读
18页
。。。
资源推荐
资源详情
资源评论
MD5 报文摘要算法
(RFC1321——The MD5 Message-Digest Algorithm)
本文地位
本文并非指定一个 Internet标准,而是向互联网提供信息,本文可以任意传播,
不受限制。
致谢
Don Coppersmith, Burt Kaliski, Ralph Merkle,David Chaum, 和 Noam Nisan
向本文提供极大的帮
助,在此本人表示忠心的感谢。
目录
1 执行简介 1
2 术语和符号 1
3 MD5算法描述 2
4 摘要 4
5 MD4和 MD5的区别 4
6 参考文献 4
7 附录 A-参考应用程序 4
8 安全事项 18
9 作者地址 18
1 执行简介
本文描述了 MD5报文摘要算法,此算法将对输入的任意长度的信息进行计算,产
生一个 128位
长度的“指纹”或“报文摘要”,假定两个不同的文件产生相同的报文摘要或由
给定的报文摘要产生原始信息在计算上是行不通的。MD5算法适合用在数据签名
应用中,在此应用中,一个大的文件必须在类似 RSA算法的公用密钥系统中用私
人密钥加密前被“压缩”在一种安全模式下。
MD5算法能在 32位机器上能以很快的速度运行。另外,MD5算法不需要任何大型
的置换列表。
此算法编码很简洁。MD5 算法是 MD4报文摘要算法的扩展。MD5算法稍慢于 MD4
算法,但是在设计上比 MD4算法更加“保守”。设计MD5是因为 MD4算法被采用
的速度太快,以至于还无法证明它的正确性,因为 MD4算法速度非常快,它处在
遭受成功秘密攻击的“边缘”。MD5后退了一步,它舍弃了一些速度以求更好的
安全性。它集中了不同的评论家提出的建议,并采取了一些附加的优化措施。它
被放在公共的地方以求公众的评论意见,它可能当作一个标准被采纳。
作为基于 OSI的应用,MD5的对象标识符是:
md5 OBJECT IDENTIFIER ::=
iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 5}
在 X.509类型 AlgorithmIdentifier [3]中,MD5算法参数应该包括 NULL类
型。
2 术语和符号
本文中一个“字”是 32位,一个“字节”是 8 位。一系列位串可看成是一系列
字节的普通形式,其中的连续的 8 位看成一个字节,高位在前,同理一系列字节
串可看成是一系列 32位的字,其中每个连续的 4 个字节当作一个字,地位在前。
我们定义 x_i代表“x 减去 I".如果下划线左边的是一个表达式,则用括号括住,
如:
x_{i+1}。同样我们用^代表求幂,这样 x^i则代表 x 的 i 次幂。
符号“+”代表字的加,X <<< s代表 32位的值 X 循环左移 s 位,not(X)代表 X
的按位补运算,X v Y 表示 X 和 Y 的按位或运算,XxorY代表 X 和 Y 的按位异或
运算,XY代表 X 和 Y 的按位与运算。
3 MD5算法描述
我们假设有一个 b 位长度的输入信号,希望产生它的报文摘要,此处 b 是一个非
负整数,b 也可能是 0,不一定必须是 8 的整数倍,它可能是任意大的长度。我
们设想信号的比特流如下所示:
m_0 m_1 ... m_{b-1}
下面的 5 步计算信息的报文摘要。
(1) 补位
MD5算法是对输入的数据进行补位,使得如果数据位长度 LEN对 512求余的结果
是 448。即数据扩展至 K*512+448位。即 K*64+56个字节,K 为整数。补位操作
始终要执行,即使数据长度 LEN对 512求余的结果已是 448。
具体补位操作:补一个 1,然后补 0 至满足上述要求。总共最少要补一位,最多
补 512位。
(2) 补数据长度
用一个 64 位的数字表示数据的原始长度 b,把 b 用两个 32 位数表示。那么只
取 B 的低 64位。
当遇到 b 大于 2^64 这种极少遇到的情况时,这时,数据就被填补成长度为 512
位的倍数。也就是说,此时的数据长度是 16个字(32位)的整数倍数。用 M[0 ...
N-1]表示此时的数据,其中的 N 是 16的倍数。
(3) 初始化 MD缓冲器
用一个四个字的缓冲器(A,B,C,D)来计算报文摘要,A,B,C,D分别是 32位
的寄存器,初
始化使用的是十六进制表示的数字
A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210
(4) 处理位操作函数
首先定义 4 个辅助函数,每个函数的输入是三个 32位的字,输出是一个 32位的
字。
X,Y,Z 为 32位整数。
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))
这一步中 使用一个 64 元素的常数组 T[1 ... 64],它由 sine 函数构成,T[i]
表示数组中的第 i 个元素,它的值等于经过 4294967296 次 abs(sin(i))后的值
的整数部分(其中 i 是弧度 )。T[i]为 32位整数用 16进制表示,数组元素在
附录中给出。
具体过程如下:
/* 处理数据原文 */
For i = 0 to N/16-1 do
/*每一次,把数据原文存放在 16个元素的数组 X 中. */
For j = 0 to 15 do
Set X[j] to M[i*16+j].
end /结束对 J 的循环
/* Save A as AA, B as BB, C as CC, and D as DD. */
AA = A
BB = B
CC = C
DD = D
/* 第 1 轮*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[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]
/* 第 2 轮* */
/* 以 [abcd k s i]表示如下操作
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[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]
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]
/* 第 3 轮*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
/* 第 4 轮*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]
/* 然后进行如下操作 */
A = A + AA
B = B + BB
C = C + CC
D = D + DD
end /* 结束对 I 的循环*/
(5) 输出结果
报文摘要的产生后的形式为:A,B,C,D。也就是低位字节 A 开始,高位字节 D
结束。
现在完成了对 MD5的描述,在附录中给出了 C 形式的程序。
4 摘要
MD5算法实现很容易,它提供了任意长度的信息的“指纹”(或称为报文摘要)。
据推测要实现
两个不同的报文产生相同的摘要需要 2^64次的操作,要恢复给定摘要的报文则
需要 2^128次操作。
为寻找缺陷,MD5算法已经过非常细致的检查。最后的结论是还需要相关的更好
的算法和更进一步
的安全分析。
5 MD4和 MD5的区别
以下是 MD5和 MD4的不同点:
1. 加上了第四轮循环。
2. 每一步增加了一个唯一的常数值。
第二轮中的函数 g 从(XY v XZ v YZ)变成了(XZ v Y not(Z)),以减少 g 函数的
均衡性。
6 参考文献
[1] Rivest, R., "The MD4 Message Digest Algorithm", RFC 1320, MIT and RSA
Data Security,
Inc., April 1992.
[2] Rivest, R., "The MD4 message digest algorithm", in A.J. Menezes and
S.A. Vanstone,
editors, Advances in Cryptology - CRYPTO '90Proceedings, pages 303-311,
Springer-Verlag,
1991.
[3] CCITT Recommendation X.509 (1988), "The Directory -
Authentication
Framework."
7 附录 A-参考应用程序
剩余17页未读,继续阅读
资源评论
G11176593
- 粉丝: 6646
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功