找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

MD5算法,看这篇就够了

admin 2019-10-8 07:31 125人围观 C++相关



分享一下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".如果减数是一个表达式,则用括号括住,如:x_{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]

[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]

/* 第三轮操作 */

/* [abcd k s t] 表示如下操作

a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */

[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]

/* 第四轮操作 */

/* [abcd k s t] 表示如下操作

a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */

[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的循环 */

3.5 Step 5. 输出

上一步输出最终的结果A,B,C,D。我们从A的低位字节开,到D的高位字节结束,每一个都是32位,最终拼接的结果就是4*32 = 128位,这就是MD5结算的结果。

4.总结

MD5算法很容易实现,为任意长度的信息计算摘要信息。据推测要实现两个不同的报文产生相同的消息摘要需要2^64次的操作,要恢复给定摘要的报文则需要2^128次操作。MD5算法已经过非常细致的检查。当然,最后的结论是还需要相关的更好的算法和更进一步的安全分析。

当然,在1996年后该算法被证实存在弱点,可以被加以破解。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证。




来都来了,走啥走,留个言呗~

 IT大咖说  |  关于版权

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!


相关推荐

推荐文章

最近活动





点击【阅读原文】更多IT技术圈干货等你挖


----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:IT大咖说,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......