MD5
历史与密码学
1992年8月,罗纳德·李维斯特向IETF提交了一份重要文件,描述了这种算法的原理,由于这种算法的公开性和安全性,在90年代被广泛使用在各种程序语言中,用以确保资料传递无误等。
MD5由MD4、MD3、MD2改进而来,主要增强算法复杂度和不可逆性。
目前,MD5算法因其普遍、稳定、快速的特点,仍广泛应用于普通数据的错误检查领域。例如在一些BitTorrent下载中,软件将通过计算MD5检验下载到的文件片段的完整性。
应用
MD5已经广泛使用在为文件传输提供一定的可靠性方面。例如,服务器预先提供一个MD5校验和,用户下载完文件以后,用MD5算法计算下载文件的MD5校验和,然后通过检查这两个校验和是否一致,就能判断下载的文件是否出错。
MD5亦有应用于部分网上赌场以保证赌博的公平性,原理是系统先在玩家下注前已生成该局的结果,将该结果的字符串配合一组随机字符串利用MD5 加密,将该加密字符串于玩家下注前便显示给玩家,再在结果开出后将未加密的字符串显示给玩家,玩家便可利用MD5工具加密验证该字符串是否吻合。
例子: 在玩家下注骰宝前,赌场便先决定该局结果,假设生成的随机结果为4、5、 6大,赌场便会先利用MD5 加密“4, 5, 6”此字符串并于玩家下注前告诉玩家;由于赌场是无法预计玩家会下什么注,所以便能确保赌场不能作弊;当玩家下注完毕后,赌场便告诉玩家该原始字符串,即“4, 5, 6”,玩家便可利用MD5工具加密该字符串是否与下注前的加密字符串吻合。
该字符串一般会加上一组随机字符串 (Random string),以防止玩家利用碰撞 (Collision) 解密字符串,但如使用超级电脑利用碰撞亦有可能从加上随机字符串的加密字符串中获取游戏结果。随机字符串的长度与碰撞的次数成正比关系,一般网上赌场使用的随机字符串是长于20字,有些网上赌场的随机字符串更长达500字,以增加解密难度。
算法

Figure 1. 一个MD5运算— 由类似的64次循环构成,分成4组16次。F 一个非线性函数;一个函数运算一次。Mi 表示一个 32-bits 的输入数据,Ki 表示一个 32-bits 常数,用来完成每次不同的计算。
MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。
⊕ ⊕ --> , ∧ ∧ --> , ∨ ∨ --> , ¬ ¬ --> {\displaystyle \oplus ,\wedge ,\vee ,\neg } 是 XOR, AND, OR , NOT 的符号。
伪代码
//Note: All variables are unsigned 32 bits and wrap modulo 2^32 when calculatingvarint[64]r,k//r specifies the per-round shift amountsr[0..15]:={7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22}r[16..31]:={5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20}r[32..47]:={4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23}r[48..63]:={6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}//Use binary integer part of the sines of integers as constants:forifrom0to63k[i]:=floor(abs(sin(i+1))×2^32)//Initialize variables:varinth0:=0x67452301varinth1:=0xEFCDAB89varinth2:=0x98BADCFEvarinth3:=0x10325476//Pre-processing:append"1"bittomessageappend"0"bitsuntilmessagelengthinbits≡448(mod512)appendbitlengthofmessageas64-bitlittle-endianintegertomessage//Process the message in successive 512-bit chunks:foreach512-bitchunkofmessagebreakchunkintosixteen32-bitlittle-endianwordsw[i],0≤i≤15//Initialize hash value for this chunk:varinta:=h0varintb:=h1varintc:=h2varintd:=h3//Main loop:forifrom0to63if0≤i≤15thenf:=(bandc)or((notb)andd)g:=ielseif16≤i≤31f:=(dandb)or((notd)andc)g:=(5×i+1)mod16elseif32≤i≤47f:=bxorcxordg:=(3×i+5)mod16elseif48≤i≤63f:=cxor(bor(notd))g:=(7×i)mod16temp:=dd:=cc:=bb:=leftrotate((a+f+k[i]+w[g]),r[i])+ba:=tempNexti//Add this chunk"s hash to result so far:h0:=h0+ah1:=h1+bh2:=h2+ch3:=h3+dEndForEachvarintdigest:=h0appendh1appendh2appendh3//(expressed as little-endian)
MD5散列
一般128位的MD5散列被表示为32位十六进制数字。以下是一个43位长的仅ASCII字母列的MD5散列:
即使在原文中作一个(比如用c取代d)其散列也会发生巨大的变化:
空文的散列为:
缺陷
2009年谢涛和冯登国仅用了2的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟。
参见
MD2
MD4
SHA
AES
参考文献
^Tao Xie and Dengguo Feng.How To Find Weak Input Differences For MD5 Collision Attacks(PDF). 30 May 2009.
碰撞
Two colliding Postscript files with the same size
Two colliding executable files
MD5 Collision, Visualised
Exploiting MD5 collisions, in C#
Fast MD5 Collision Generator
Hash Collisions within a Minute
工具
MD5 加密- 在线MD5散列发生器
MD5 在线计算器- 使用 JavaScript 技术制作的 MD5 安全计算器,含Android, Chrome 版本。
MD5 的VC++实现代码CSDN 下载频道:MD5 的VC++实现代码
www.cmd5.com- 应用MD5散列数据库查询
www.md5.com.cn- MD5反向查询破解
MD5 Crack online- Passwords Recovery by MD5 Rainbow Tables
md5.rednoize.com- MD5转换
us.md5.crysm.net- MD5 Reverse lookup
md5.mmkey.com- MD5搜集,相关程序源码
xmd5.org- MD5转换
MD5 Hash Example/Generator
MD5 Checksums for Linux and BSD Distributions
winMd5Sum- MD5值计算
MD4/MD5/SHA-1 加密
Pascal Unit
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

- 有价值
- 一般般
- 没价值








24小时热门
推荐阅读
关于我们

APP下载


{{item.time}} {{item.replyListShow ? '收起' : '展开'}}评论 {{curReplyId == item.id ? '取消回复' : '回复'}}