加密的故事

一. 加密:历史悠久的技术

任何一个安全专家提起如今信息技术的安全保护措施,都不可避免要涉及一个名词:加密(Encrypt)。的确,纵观当今信息世界,加密离我们并不遥远,从小小的个人密码,到重要机密文件,无一不是经过加密后的产物。加密技术已经渗透了整个信息时代,任何人都不可避免的接触到——即使你根本不知道“加密”是什么。

许多人一提起“加密”,都会有一种“畏惧”的心理,以为加密技术绝对是“新手勿近”的,其实不然,加密其实一直伴你左右,回忆一下儿时智力测试的题目:“007收到遇害同事的字条,上面写着4FEFKKILJK81IP,根据事先约定,已知c=3,q=H,问该同事要传递什么信息给007?”这到题目放到信息技术方面来看待,就是一条经过简单的替换字符算法加密的字符串,它把原字符改为使用相对应的数字排序来替代,从而产生了一组“没有意义”的字符组合,但是因为我们知道c=3等条件,所以稍加排序即可得到原句:“Do not trust Hary”,这个过程也可称为“解密”(Decrypt)。有读者也许会不屑一顾,就这么简单也算加密?别忘了,我们是在已经知道c=3的前提下完成的“解密”,换句话说,也就是已经知道了“算法”,否则光凭以上一组不知所云的字符串,谁能解开?

“就不让你直接看到信息”——与之相似的思路加以扩充,便成了“加密”的来由;而“我偏要看到你不想让我看的信息”的思想,则发展出了“解密”技术。加密和解密从诞生开始,就是一对不可分割的兄弟。

加密作为保障数据安全的一种方式,早就在历史上发挥了悠久的作用,从远古时代开始,人们就已经在采用一种如今称为“编码”(Code)的方法用于保护文字信息。最早影响世界的加密技术诞生于战争年代,由德国人发明,用于传递攻击信息;而最早影响世界的解密技术,也诞生于战争年代,由英美开发出来破译德国人的攻击信息。正是战争让加解密技术不断改进发展,直到现在,仍然在为信息时代的数据安全而服务。

说了这么多,也该为加密技术做一个系统的概念了:所谓“加密”,就是对原内容为明文的文件或数据按某种算法进行处理,使其成为不可读的代码,经过这样处理的数据通常称为“密文”,密文只能在经过相对应的反向算法处理后才能恢复原来的内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的,而将该编码信息转化为其原来数据的过程,就是“解密”。

无论哪一个国家,都会有专家专注于加密技术的研究,因此诞生了许多算法,并且在按照生物界的“弱肉强食”定律发展完善着。其中,强度高(不容易被解密)的算法得以保留发展,强度低的算法最终被时间淘汰,除此之外,也存在着一部分未公开的私人算法,它们共同担任着维护数据安全的重任。通常我们提及加密技术时所说的“MD5加密”、“SHA-1加密”、“RSA加密”等,其实就是在说它们所采用的算法。采用一个高强度的算法来加密你的数据,将会让你的数据安全得到更高的保护。

二. 算法:关键的抉择

“我想要葡萄,还想要橙子,可是我只能选择其中一样,我该选哪个?”如果要为自己的数据加密,我们就不得不面对这样一个选择,因为世界上的算法不止一个,还各有特性,究竟什么算法才是最适合的呢?于是,我们逐渐陷入一个选择的泥潭。因此,在选择使用哪种算法作为你的加密基础前,就需要对各种常见的算法原理有个了解……

1.基于“消息摘要”的算法

“消息摘要”(Message Digest)是一种能产生特殊输出格式的算法,这种加密算法的特点是无论用户输入什么长度的原始数据,经过计算后输出的密文都是固定长度的,这种算法的原理是根据一定的运算规则对原数据进行某种形式的提取,这种提取就是“摘要”,被“摘要”的数据内容与原数据有密切联系,只要原数据稍有改变,输出的“摘要”便完全不同,因此基于这种原理的算法便能对数据完整性提供较为健全的保障。但是,由于输出的密文是提取原数据经过处理的定长值,所以它已经不能还原为原数据,即消息摘要算法是“不可逆”的,理论上无法通过反向运算取得原数据内容,因此它通常只能被用来做数据完整性验证,而不能作为原数据内容的加密方案使用,否则谁也无法还原。尽管如此,“消息摘要”算法还是为密码学提供了健全的防御体系,因为连专家也无法根据拦截到的密文还原出原来的密码内容。因为这个特性,“消息摘要”算法产生的密文被称为“摘要”。

如今常用的“消息摘要”算法经历了多年验证发展而保留下来的强者,分别是MD2、MD4、MD5、SHA、SHA-1/256/383/512等,其中最广泛应用的是基于MD4发展而来的MD5算法。

⑴.MD5算法

MD5算法的全称是“消息摘要算法”(Message-Digest Algorithm version.5),它是当前公认的强度最高的加密算法。出现在MD5之前的是MD2和MD4,间隔分别只有一年。虽然三者的算法结构多少有点相似,但是由于MD2诞生于8位计算机的时代,因此它的设计与后来出现的MD4、MD5完全不同,因此不能进行简单的替代。然而,无论是MD2、MD4还是MD5,它们都是在获得一个随机长度信息的基础上产生一个128位信息摘要的算法。

MD2算法是Rivest在1989年开发的,它很慢(因为是为8位机器设计的),但相当安全。在这个算法中,首先要对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾,并且根据这个新产生的信息计算出散列值(Hash),最终运算结果即为类似于“d41d8cd98f00b204e9800998ecf8427e”的摘要,而且这个值是唯一的。

为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度除以512的余数为448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位Merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理,最终生成摘要。

然而MD4存在一个严重漏洞,那就是“冲突”(Collisions)。“冲突”是所有基于“摘要”的算法都要面对的最大问题,由于它们是根据“不完整”的数据内容产生的密文,如果运算过程存在暇癖,就会在处理某些不同数据时产生相同的摘要,这后果可是致命的,因为“摘要”算法的原则是原数据不可还原,因此验证的过程并不同于简单加密运算里的“数据还原匹配”,验证端同样要根据原数据(甚至连原数据都没有,而仅仅是最初保存的摘要)进行运算得到的摘要作为凭据与客户端发来的摘要进行匹配检验,如果两段字符串完全相同,即视为验证通过。这是在“摘要算法”理论上“不可逆且唯一”的基础上采用的安全检验方法,验证方可以不需要索取原数据,而只要拥有一个有效的摘要即可完成对客户端的身份确认,大大减少了原数据被入侵者掌握的几率。

但是这样的验证的方式就产生了一个“看似不可能”的缺陷:假如入侵者能伪造出一段数据,使之能在通过“摘要”计算后产生的摘要与真正的原数据产生的摘要一样,那么