一、概念
MD5算法是单向散列算法的一种。单向散列算法也称为HASH算法,是一种将任意长度的信息压缩至某一固定长度(称之为消息摘要)的函数(该压缩过程不可逆)。在MD5算法中,这个摘要是指将任意数据映射成一个128位长的摘要信息。并且其是不可逆的,即从摘要信息无法反向推演中原文,在演算过程中,原文的内容也是有丢失的。
并非说md5不能破解。MD5破解可以参考王晓云教授的《MD5破解》论文
因为MD5算法最终生成的是一个128位长的数据,从原理上说,有2^128种可能,这是一个非常巨大的数据,约等于3.4乘10的38次方,虽然这个是个天文数字,但是世界上可以进行加密的数据原则上说是无限的,因此是可能存在不同的内容经过MD5加密后得到同样的摘要信息,但这个碰中的概率非常小。可用于数字签名、信息完整性检查等用途;
1、对于需要高度安全性的数据,一般改用其他算法,如SHA-2。MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是高要求的数字签名等用途。
2、常见的散列算法还有SHA、RIPE-MD、HAVAL、N-Hash等
二、算法原理
2.1、MD5(32)、MD5(16)
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
将这128 位用十六进制表示便是常见的32 字符的MD5 码,而所谓的16 字符的MD5 码,其实是这32 字符中间的16 个字符。
MD5(123456,32) = e10adc3949ba59abbe56e057f20f883e
MD5(123456,16) = 49ba59abbe56e057
2.2、算法 4步流程
MD5 算法将输入的信息进行分组,每组512 位(64个 字节),顺序处理完所有分组后输出128 位结果。
在每一组消息的处理中,都要进行4 轮、每轮16 步、总计64 步的处理。其中每步计算中含一次左循环移位,每一步结束时将计算结果进行一次右循环移位。详见下方流程。
第1步:进行数据填充整理
这一步是对要加密的数据进行填充和整理,将要加密的二进制数据对512取模,得到的结果如果不够448位,则进行补足,补足的方式是第1位填充1,后面全部填充0。
为啥是448位呢? 在数据读取时,会有一个结束标识位。如同c中的字符串,有一个\0的结束标识;
将需加密的信件信息(如一份文件)分次读取到缓冲区中,一次最好读取64*n 个字节,这样就是n 组,方便处理。那么此时,对信息进行填充,使其字节数除以64 时余数为56,其一个结束标识符就是8字节;如,一个消息为64n 倍数字节,则最后一次读取0 字节(