(转帖)
一. 加密:历史悠久的技术
任何一个安全专家提起如今信息技术的安全保护措施,都不可避免要涉及一个名词:加密(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)。“冲突”是所有基于“摘要”的算法都要面对的最大问题,由于它们是根据“不完整”的数据内容产生的密文,如果运算过程存在暇癖,就会在处理某些不同数据时产生相同的摘要,这后果可是致命的,因为“摘要”算法的原则是原数据不可还原,因此验证的过程并不同于简单加密运算里的“数据还原匹配”,验证端同样要根据原数据(甚至连原数据都没有,而仅仅是最初保存的摘要)进行运算得到的摘要作为凭据与客户端发来的摘要进行匹配检验,如果两段字符串完全相同,即视为验证通过。这是在“摘要算法”理论上“不可逆且唯一”的基础上采用的安全检验方法,验证方可以不需要索取原数据,而只要拥有一个有效的摘要即可完成对客户端的身份确认,大大减少了原数据被入侵者掌握的几率。
但是这样的验证的方式就产生了一个“看似不可能”的缺陷:假如入侵者能伪造出一段数据,使之能在通过“摘要”计算后产生的摘要与真正的原数据产生的摘要一样,那么入侵者便能冒充原数据持有者通过身份验证。这在理论上是不可能的,然而现实总是不会让人那么愉快,由于算法不可避免的出现了漏洞,使得这个设想成为了事实,这就是“冲突”的来源:某两个或多个数据产生的摘要出现了完全雷同的现象,使得用户能在输入了即使不是原数据的密码后能顺利通过验证,因为身份检验程序发现原本储存的用户信息的签名数据与接收到的数据的运算结果完全一致,于是认为请求方为合法用户,就给予通过了。这种运算结果相同的现象,就是“冲突”。
“冲突”会造成非常危险的后果,因此MD4被无情的抛弃了,取而代之的是在MD4基础上加强了算法的MD5,它在MD4的基础上增加了“安全带”(Safety Belts)的概念,虽然MD5比MD4稍微慢一些,但却大大减小了冲突的发生率,虽然很早以前就有专家发现MD5算法在专门用于寻找“冲突”的机器上平均每24天就会产生一个“冲突”,但是对于一般应用来说,这种几率已经非常低微,因此MD5至今仍然是最强健的加密算法。
有读者也许会问,既然MD5是不可逆的,那么网络上存在的那些“MD5密码破解工具”又是什么回事?其实,那并不是破解,至今MD5还没能被完全破解过,虽然曾经有过一篇报道称中国某教授破解了MD5,但是后来这个结论又被推翻了。网络上流传的那些工具纯粹是依赖于“运气+机器性能+耐心”的产品而已,它们的原理是“穷举”,即程序在一定的数据范围内产生一系列数据组合进行MD5运算,再把运算结果与获取的摘要进行比较,如果两者相同,就被定义为“破解”了。这只是一种穷举法而已,实际意义不大,要知道在不产生冲突的前提下生成一个与原数据完全相同的字符串要有多少运气的成分,更何况它还完全依赖于你的机器性能,如果对方密码简单如123456这样的形式,我们还可能侥幸在1分钟——1天内运算出来,但是如果对方密码是0e1WeTru9t@MD5这样的组合呢?MD5的高强度使得它如此难以破解,因此成为大众首选,许多入侵者在辛苦取得目标网站数据库后,一看password字段都是0ca175b9c0f726a831d895e269332461的形式,第一反应都会是“MD!白干了!”
⑵.SHA算法
世界的发展是多元化的,尽管MD5性能如此出众,但它并不能代表唯一,世界上还同时存在着许多其它方式的高强度算法,SHA系列算法就是其中一个。
SHA的中文是“安全哈希算法”(Safe-Hash Algorithm),它有多个改进版本,也属于“摘要”算法,它能产生高达160位的摘要,SHA-1是改进了SHA算法缺陷而产生的升级版本,除此之外还有SHA-256、SHA-383、SHA-512等,提供了最高达到512位的摘要。
2.“对称/非对称密钥”加密算法
由于“摘要”算法加密的数据仅仅能作为一种身份验证的凭据使用,如果我们要对整个文档数据进行加密,就不能采用这种“不可逆”的算法了,因此“密钥”算法(Key Encoding)的概念被提出,与开头提到的智力题类似,此类算法通过一个被称为“密钥”的凭据进行数据加密处理,接收方通过加密时使用的“密钥”字符串进行解密,即双方持有的“密码”相同(对称)。如果接收方不能提供正确的“密钥”,解密出来的就不是原来的数据了。
以上是“对称密钥”的概念,那么“非对称密钥”又该怎么理解呢?有人用邮箱作为比喻,任何人都可以从邮箱的信封人口塞进信件,但是取信的权力却仅仅在于持有邮箱钥匙的人的手上。这个众人皆知的信封入口就是“公钥”(Public Key),而你持有的邮箱钥匙就是“私钥”(Private Key),这种算法规定,对方给你发送数据前,可以用“公钥”加密后再发给你,但是这个“公钥”也无法解开它自己加密的数据,即加密过程是单向的,这样即使数据被途中拦截,入侵者也无法对其进行破解,能还原数据内容的只有“私钥”的持有者,这就是“非对称密钥”加密算法,也称为“公共密钥算法”,这两者均建立在PKI验证体系结构上。
你也许会想,这两种形式加密出来的数据如果稍加耐心进行分析,一定能找到变化规律从而直接破解。这个想法没错,但是专家早就思考过这个可能性了,因此这种算法虽然是采用某个字符串作为凭据进行加密操作的,可是它可能把凭据拆分为多个不同的“子段”并进行多次运算,最终的结果就是让你难以发现变化的规律,破解也就成为了难事。
基于“对称密钥”的加密算法有DES、TripleDES、RC2、RC4、RC5和Blowfish等;基于“非对称密钥”的加密算法有RSA、Diffie-Hellman等。
⑴.对称密钥——DES、TripleDES算法
美国国家标准局在1973年开始研究除国防部以外的其它部门的计算机系统的数据加密标准,最终选用了IBM公司设计的方案作为非机密数据的正式数据加密标准(DES即Data Encryption Standard)。DES满足了国家标准局欲达到的4个目的:
提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改;
具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握;
DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础;
实现经济,运行有效,并且适用于多种完全不同的应用。
DES算法从诞生开始,就被各个领域广泛应用了,包括ATM柜员机、POS系统、收费站等,DES以它高强度的保密性能为大众服务,那么,它是如何工作的呢?
DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,首先,DES把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,并进行前后置换(输入的第58位换到第一位,第50位换到第2位,依此类推,最后一位是原来的第7位),最终由L0输出左32位,R0输出右32位,根据这个法则经过16次迭代运算后,得到L16、R16,将此作为输入,进行与初始置换相反的逆置换,即得到密文输出。
DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密,如果Mode为加密,则用Key去把数据Data进行加密,生成Data的密码形式作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式作为DES的输出结果。在使用DES时,双方预先约定使用的“密码”即Key,然后用Key去加密数据;接收方得到密文后使用同样的Key解密得到原数据,这样便实现了安全性较高的数据传输。
DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法,而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,那么它搜索完全部密钥就需要将近2285年的时间,因此DES算法是一种很可靠的加密方法。
TripleDES算法又称3-DES,是DES算法的替代版本,它使用两个密钥对明文运行 DES 算法三次,从而得到 112 位有效密钥强度。TripleDES主要用于解决DES 技术的 56 位密钥的抵抗破解强度随着计算机运算速度加快而日益减弱的问题。
⑵.对称密钥——RC算法
RC系列算法是大名鼎鼎的RSA三人组设计的密钥长度可变的流加密算法,其中最流行的是RC4算法,RC系列算法可以使用2048位的密钥,该算法的速度可以达到DES加密的10倍左右。
RC4算法的原理是“搅乱”,
它包括初始化算法和伪随机子密码生成算法两大部分,在初始化的过程中,密钥的主要功能是将一个256字节的初始数簇进行随机搅乱,不同的数簇在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,得到的子密钥序列和明文进行异或运算(XOR)后,得到密文。
由于RC4算法加密采用的是异或,所以,一旦子密钥序列出现了重复,密文就有可能被破解,但是目前还没有发现密钥长度达到128位的RC4有重复的可能性,所以,RC4是目前最安全的加密算法之一。
⑶.非对称密钥——RSA算法
RSA算法是最流行的公钥密码算法,使用长度可以变化的密钥。RSA是第一个既能用于数据加密也能用于数字签名的算法。
RSA算法原理如下:
1.随机选择两个大质数p和q,p不等于q,计算N=pq;
2.选择一个大于1小于N的自然数e,e必须与(p-1)(q-1)互素。
3.用公式计算出d:d×e = 1 (mod (p-1)(q-1)) 。
4.销毁p和q。
最终得到的N和e就是“公钥”,d就是“私钥”,发送方使用N去加密数据,接收方只有使用d才能解开数据内容。
RSA的安全性依赖于大数分解,小于1024位的N已经被证明是不安全的,而且由于RSA算法进行的都是大数计算,使得RSA最快的情况也比DES慢上倍,这是RSA最大的缺陷,因此通常只能用于加密少量数据或者加密密钥,但RSA仍然不失为一种高强度的算法。
三. 结语:不可忽视的数据安全
随着信息化走进千家万户,人们越来越关注自己的数据安全,而数据安全除了在攻防体系上必须有所保障以外,关键的一点就是要对其进行强度够高的加密,进一步减小数据被盗窃后的损失。这一观点早已在网络论坛的发展中得到证实,早期的论坛数据库都是未经过加密处理就直接保存的,在这个前提下,只要入侵者拿到了数据库,就等于拿到了整个论坛,因为密码字段是明文形式的。有些重要的网站甚至使用一些后台没有提供数据加密方案的程序做站点,这是非常不明智的。
确定了加密方案后,有些人就自己写算法进行数据加密,殊不知这也算产生了安全隐患,通常个人无法写出高强度的加密算法,入侵者如果稍加分析便能破译内容,你的辛苦也就付之东流。相反,如果采用在国际得到安全认证的流行加密方案,数据安全反而提高了,何乐不为?
不过,随着计算机技术的发展,特别是运算速度的提高,使得目前通用的一些高强度算法逐渐有了疲惫的趋势,也许再过不久,它们就会被攻破了,到那个时候,我们又该拿什么去捍卫数据安全呢?
参考文献:
《MD5算法研究》
《DES算法实现过程分析》
《RSA算法基础》
《RC4加密算法》
《加密和 Microsoft 公钥基础结构》