深入解析MD5压缩算法及其源码实现

版权申诉
0 下载量 131 浏览量 更新于2024-10-14 收藏 29KB RAR 举报
资源摘要信息:"MD5压缩算法" MD5压缩算法是一种广泛使用的加密散列函数,可以产生出一个128位的散列值(hash value),通常用一个32位的十六进制字符串表示。MD5由罗纳德·李维斯特(Ronald Rivest)于1991年设计,旨在取代之前不安全的MD4散列算法。尽管MD5在安全性上已经不被推荐使用,但它在文件完整性验证和数字签名中曾经应用广泛。 MD5算法的工作原理如下: 1. MD5算法接受任意长度的消息作为输入。 2. 首先对消息进行填充,填充的规则是将消息长度变为512位的整数倍。填充的方法是在消息后面添加一个1,后面跟着若干个0,最后加上一个64位的长度字段。 3. 然后初始化一个128位的缓冲区(四个32位寄存器),它们分别是:A=0x***,B=0x89abcdef,C=0xfedcba98,D=0x***。 4. 将填充后的消息分成512位的块进行处理,对于每一个512位的块,重复执行以下步骤: a. 将消息分为16个32位的字。 b. 使用一个非线性函数,四个辅助函数,以及一个逻辑函数,结合输入的消息块,进行16轮运算。 c. 在每一轮运算中,四个辅助函数分别处理缓冲区中的四个部分,并与输入的消息字进行运算,最终更新缓冲区中的值。 5. 在完成所有消息块的处理后,将缓冲区中的值输出,这四个值(A、B、C、D)拼接成一个128位的散列值。 MD5算法的应用场景主要包括: 1. 文件完整性验证:用户可以使用MD5算法计算出文件的散列值,与官方发布的散列值对比,判断文件是否被篡改。 2. 密码存储:在早期,一些网站和服务会将用户的密码通过MD5算法生成散列值存储起来。但是,由于MD5算法存在安全性问题,现在更推荐使用如bcrypt等更安全的算法来存储密码。 3. 数字签名:在数字签名中,散列函数被用来产生待签名的数据的摘要,这个摘要然后用发送者的私钥加密,接收者可以用发送者的公钥解密并验证数据的完整性。 尽管MD5算法在理论上和实践中都已被证明存在弱点,它仍然在一些不需要高安全性的场合中被使用。然而,鉴于它的安全性缺陷,开发者和安全专家推荐使用其他散列函数,如SHA-256或SHA-3等,这些算法提供了更强的抗碰撞性和更高的安全性。 由于给出的信息中提到了“BCB 工程 + 源码”,这里可能指的是Borland C++ Builder(BCB)的工程项目文件,这是一种主要用于创建基于Windows的桌面应用程序的集成开发环境。BCB工程项目文件可能包含了MD5算法的源码实现,方便开发者在BCB环境中编译和运行MD5算法。 综合上述信息,我们可以了解到MD5算法的原理、应用场景、安全问题以及其在BCB环境中的可能应用。尽管MD5不再适合用于加密和安全敏感的应用,但它在理解散列函数的基础知识和历史发展方面仍然具有教育意义。
2009-09-07 上传
MD5的全称是Message-digest Algorithm 5(信息-摘要算法),用于确保信息传输完整一致。在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc,的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个算法的描述和c语言源代码在Internet RFC 1321中有详细的描述(http://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由Ronald L. Rivest在1992年8月向IETF提交。   MD5最广泛被用于各种软件的密码认证和钥匙识别上。通俗的讲就是人们讲的序列号,   Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验和将产生MD2冲突。MD2算法的加密后结果是唯一的--即没有重复。   为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。   尽管MD4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。   一年以后,即1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4稍微慢一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD5完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。   Van oorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force hash function),而且他们猜测一个被设计专门用来搜索MD5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代MD5算法的MD6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响MD5的安全性。上面所有这些都不足以成为MD5的在实际应用中的问题。并且,由于MD5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。   2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。   令世界顶尖密码学家想象不到的是,破解MD5之后,2005年2月,王小云教授又破解了另一国际密码SHA-1。因为SHA-1在美国等国际社会有更加广泛的应用,密码被破的消息一出,在国际社会的反响可谓石破天惊。换句话说,王小云的研究成果表明了从理论上讲电子签名可以伪造,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。