eBay CEO作序推荐《web商务安全设计与开发宝典》:对称加密系统
使 用密码的目的是防止信息在传输和存储过程中被除目标接受者以外的任何人读取和理解。理想情况下,未经授权的个人永远都不能对一个加密信息进行解密。实际 上,读取加密通信只是一个时间函数,但未经授权的个人破解一个加密信息需要付出相当大的努力,花费大量的时间,所以不太切合实际。等到他破解了该消息的时 候,这个消息所包含的信息可能已没什么价值了。
使用密码可以实现机密性、完整性、身份验证和不可抵赖性。在不可抵赖中,发送者不能否认发送或者签发过带有数字签名的文件。不可抵赖能够证明某人发送或者签署过数字文件。
加密技术主要有两种,对称密钥(密钥或者私用密钥)加密和非对称密钥(公钥)加密。在对称密钥加密中,接收者和发送者共享一个共同密钥。在非对称密钥加密 中,发送者和接收者各持一个私用密钥和一个公开密钥,私用密钥他们各自私自保存,公开密钥公开放置,供想与他们通信的人使用。公开密钥和私用密钥有数学关 系,理想情况下,拥有公开密钥的人不能导出私用密钥。由于非对称密钥加密中涉及大量的计算,所以对称密钥加密系统往往比非对称密钥加密系统运行得快。
流 密码和分组密码是构成对称加密系统的两个主要类型的算法。流密码使用一个单一密钥K来加密一个明文消息M,后者是一串按顺序被处理的串行数据串。这个消息 被看做是一个数据流,其中每个字节都和它之前的那些字节一起被处理,并且这个顺序非常重要。如果改变这个明文中任何字节的顺序,那么从改变的那个地方往后 看这个密文,就会与原来不同。
分组密码是指把明文分成含有n个字符或者字节的组,每组都用相同的加密算法和密钥K。比如,如果一个明文消息M被分成了M1、M2、…….Mp共p组,那么:
E(M,K)=E(M1,K)E(M2,K)…E(Mp,K)
其中等式右边的这几个组连接在一起组成密文。
1. 流密码
流密码往往不需要对消息进行任何填充。因为消息被看做是一个数据流,所以它们可以是任何长度,不需要以任何方式对其进行填充,除非想给普通消息增加随机性。
下面是几个常见的流密码:
● RC4
● SEAL
● ISAAC
● PANAMA
● Helix
流密码有很多,其中多数的工作原理是为密钥生成一个看似随机的数据流。然后该数据流与消息进行异或(XOR)运算,密文即得以创建。异或函数是对两串比特进行二进制操作,然后生成第三串比特。在异或操作中,当两个比特不相同时,其结果为1,当它们相同时,结果为0。
使用XOR,并不是一种简单的相加(即由此产生的数字大于这个字符),但其结果仍然映射一个字符。XOR也有一个有用的可逆属性。比如:
● C=A XOR B
● B=A XOR C
● A=B XOR C
如 果A代表一个明文字符,B代表一个密钥字符,那么C是使用XOR函数进行加密之后而生成的密文。要想解密,只需重新对C和B或者密文和密钥应用XOR函 数。没有密钥,就不可能知道明文是什么。所有可能的值都可以用来计算密钥,但只有一个值能返回到正确结果。如果这个密钥和明文一样长,并且只用过一次,密 钥是随机产生的,那么这种加密方法被称为一次填充,它是十分安全的。
2. 分组密码
分 组密码是另外一种对称加密算法。分组密码也使用一个单一密钥对消息进行加密,但它一次只加密一个块。每块含有特定数量的比特,其数量由算法决定。各个块独 立被处理,一个消息块和另一消息块的加密之间没有任何关系。分组密码这种一次只处理一个消息块的能力正是分组密码不同于流加密的地方所在。
虽 然分组密码有独立处理单个消息块的能力,但通常情况下仍会使用加密模式来打破这种属性,防止有人看到重复的块而获知关于这个消息的信息。比如,如果 Alice在回答Bob的问题时发送消息“yes”给Bob,那么如果使用相同的密钥,这个字“yes”将被加密成同一密文。那么每次发送“yes”时, 入侵者Eve就可以在不进行解密的情况下知道发送了什么消息。更糟糕的是,另外一个人会用所有可能的密钥预先计算这个消息“yes”,然后只需要把看到的 这个密文与相应的密钥进行比对,假设这个密钥足够小的话,他便可进一步破解所有加密。
另外一个针对分组密码的攻击是改变这个组块的顺序。这和流密码不一样,它仍然不会影响解密,因为每个组块彼此独立。这意味着在用这种方式使用分组密码时,机密性还存在,但完整性丧失了。
为 了打破相同明文组块总是加密成相同的密文组块这一属性,人们创建了各种加密模式。第一种加密模式是简单地对明文一组一组地加密。这种加密模式叫做电码本。 其他3种常见模式为密码分组链接、密码反馈和输出反馈。虽然这3种模式打破了同一明文被加密成相同密文的属性,但它们也有缺点,即和流密码一样,任何差错 都会在整个加密流程中传播。各种模式传播差错的程度不同,具体如下:
● 电子密码书(electronic code book,ECB):一次只对消息的一个组块进行加密,一个明文组块只映射一个密文组块。组块中的差错只影响对那个组块的解密。如果一个完整的组块在传输过程中丢失,其他组块不受任何影响。
● 密码分组链接(cipher block chaining,CBC):前面已加密的输出组块和下一个未加密的明文组块一起进行异或运算。如果一个组块出现差错,则这个差错会传播到下面两个被破译的组块中。如果整个组块在传输过程中丢失,在解密过程中仅影响下一个组块。
● 密码反馈(cipher feedback,CFB):前 面密文块被加密后的结果与明文块一起进行异或运算。这与CBC模式的不同之处在于这个异或运算发生在对前面密文分组加密之后。如果一个组块中出现差错,那 么该差错被传播到|n/r|个组块中,其中n等于这个分组密码的输出大小,r等于在异或运算中用到的比特的数量。如果一整个分组在传输过程中丢失了,则 CFB模式将会和CBC模式一样恢复数据,然而,它要求恢复|n/r|个组块。
● 输出反馈(output feedback,OFB):不 断把加密算法的输出结果输入到这个算法之中,然后这个明文和这个输出一起进行异或运算。这不同于CFB,因为不把密文输入到这个加密算法。如果一个组块出 现差错,则此差错仅传播到那些被改变的比特上。然而,如果有任何比特丢失,包括一整个组块丢失,那么这个差错都会被传播到所有其余的组块上,且不能恢复。
在 上面所列的各种模式中,因为上述原因,ECB几乎从来都不使用。最受欢迎的模式是CBC,因为它不像OFB,即使比特丢失,差错也不传播至整个消息。 CBC比CFB用得多,是因为差错传播的范围通常较小,仅限于两个块,且因为出现的这个比特变化以一种可以预见的方式发生在后面的组块上。比如,在使用 CBC时,如果块1有比特在传输过程中翻转,那么块1将看似很随机,块2将有同样的比特在块1传输过程中比特翻转的地方翻转。这会使得Mallory能够 造成对这个消息的可预见的改变。在CFB模式中,在块1中翻转的比特正是在解密的块1中翻转的比特。后面的块看起来是随机的。如果攻击者打算在密文传输过 程中翻转比特的话,那么在解密时接收到一个看似随机的块要好得多,这会提醒您攻击已经出现,不要相信它后面的东西了。而CFB却不是这样,因为您只知道差 错已经发生了,但不一定知道它是在哪儿开始的。
3. 初始化向量
初 始化向量(initialization vector,IV)是一个任意的比特组,可以和密钥一起用于流密码或分组密码中。IV被用来生成独一无二的加密数据,该数据与用同一加密密钥生成的其他 加密数据相互独立。因此,有了IV,便可以对数据中重复的序列使用相同密钥加密,而产生不同的加密结果。接收者在接收用IV加了密的数据时,也必须知道这 个IV,才能对消息进行解密。
4. 古典密码
本节将详细讨论基本的加密操作,以便更加深入地理解加密方法的演变过程和人们为此付出的相应努力。
1) 代换
凯 撒密码(Caesar Cipher)是一种简单的代换密码,是把字母向后移动3个位数。凯撒密码是Vigenère多表密码的一个子集,后者将在本章后文进行讨论。从数学角度 讲,凯撒密码的实现方法是将消息的字符加上重复的密钥,然后再进行模26运算。在模26加法中,分别给字母表中的字母A~Z一个0~25的值。然后把密钥 和消息所对应的数值加起来,其和如果大于等于26,则取减去26的差为其对应值。在确定密钥时,必须规定下面2个参数:
D:密钥重复的字母数,
K:密钥
下面举例说明,如D=3,K=CAF
消息是:HOW ARE YOU
按照字母表中各个字母所对应的数值,该消息为:
7 14 22 0 17 4 24 14 20
H O W A R E Y O U
密钥K所对应的数为:
2 0 5
C A F
现在,我们重复地把密钥205与消息对应的数字相加得结果如下:
2 0 5 2 0 5 2 0 5 重复的密钥
7 14 22 0 17 4 24 14 20 消息
9 14 1 2 17 9 0 14 25 密文所对应的数字
J O B C R J A O Z 密文
把数字换成字母表中它们所对应的字母则生成上面这个密文。
如果密钥数字和消息数字相加的和大于等于26,那么这种加法就是模26(mod26),即最终结果是相加的和减去26所得的差。下面的例子说明了模26加法的运算规律:
14 12 22 24
12 22 8 5
26 34 30 29 和
0 8 4 3 模26加法的运算结果
这种加密方式可以用公式表示如下:
C=(M+b) mod N
其中,b是一个固定整数
N是字母表所包含的字母数
M是数字形式的明文消息
C是数字形式的密文
这 种代换密码可以使用频度分析(frequency analysis)来破解。在频度分析中,根据某种特定语言中字母表中的字母被使用的频度特点来破解密码。这种密码分析之所以是可能的,是因为凯撒密码是 一个单表密码(monoalphabetic)或者简单的代换密码,指一个密文字符代替一个明文字符。多表密码(polyalphabetic)可以通过 使用多个代换密码来实现。因此,在加密过程中,同一明文字母可以转换成一个不同的密文字母。出生于1523年的法国外交官Blaisede Vigenère结合Alberti、Trithemius和Porta的密码研究,开发了功能非常强大的多表密码。Vigenère的密码使用26个字 母表。
因为使用了多个字母表,所以可以抵制频度分析的破解方式。然而,这种方法也可以通过发现周期(period)—— 即代换表重复的时间—— 的方式来破解。图1描述的是多表代换,密钥是10 3 1,指从明文字母向密文字母移动的位数。
图1 多表代换
2) 变位(排列)
另外一种密码是变位密码。在这种密码中,明文的字母被排序。比如,明文HOWAREYOU的字母被排列成WAUOEYHOR。
柱状变位密码是指明文被横着写在纸上,但竖着读出来,如图2所示。
N O W I S T H E
T I M E F O R A
L L G O O D M E
N T O C O M E T
O T H E A I D O
F T H E I R P A
R T Y
图2 柱状变位密码
竖着读取上面的密文为:NTLNOFROILTTTTWMGOHHY。这种变位密码可以通过频度分析而被破解,但是它隐藏了两个字母和三个字母的统计特性,如IS和TOO。这种特点可以防止字典攻击。
3) 维尔南密码(一次一密)
一 次一密或者维尔南Vernam密码是指通过使用一个包含随机字符串的密钥来实现,该随机字符串不会出现在重复的序列中。每个密钥字母都与明文字母用模26 算法相加。在一次一密中,每个密钥字母在一条消息中只使用一次,从不重复使用。密钥字符流的长度等于消息的长度。对于兆字节和千兆字节的消息,使用一次一 密的方法不实际。但是如果随机字符集短且有非常大的间隔的话,则是可能的。
下面是一次一密加密的例子。
明文 HOWAREYOU 7 14 22 0 17 4 24 14 20
一次一密密钥 XRAQZTBCN 23 17 0 16 25 19 1 2 13
求和 30 31 22 16 42 23 25 16 33
Mod 26求和 4 5 22 16 16 23 25 16 7
密文 E F W Q Q X Z Q H
4) 书或滚动密钥密码
这种密码使用某一来源(比如一本书)的文章来加密明文。密钥可能是这本书中某篇文章的页数和行数,发送者和目标接收者都知道它。这个“密钥”文章与明文中的字母相匹配,然后再用mod 26加法来进行加密。
虽然滚动密钥密码去除了周期性,但利用密钥中的冗余却可以破解它。
5) 代码
代码是指用相应的一组数字或字母来代替单词和词组。比如数字587可能意思是“已发货”。
5. 对称密钥加密基础
秘 密密钥加密是一种多数人熟悉的加密方法。在这种加密方法中,发送者和接收者都知道一个秘密密钥。发送者用这个秘密密钥对明文消息进行加密,接收者用同一个 秘密密钥对消息解密。显而易见,较为难做的是如何把这个秘密密钥既提供给发送者和接收者,而又不危及该密钥的安全。为了提高安全性,这个秘密密钥应该定期 更换。理想情况下,一个特定的秘密密钥只应该使用一次。图3描述的是一个对称密钥加密系统。
图3 对称密钥加密系统
秘密密钥加密系统由公共信息和私有信息组成。公共信息通常包含下列内容:
● 加密已加密消息的明文副本的算法
● 可能的话,明文副本和相关密文
● 可能的话,非目标接收者选中的加密明文
私有信息包括:
● 密钥或者暗号
● 众多可能的转换中的一个特定加密转换
任 何秘密密钥加密系统的重要特点是同一密钥既可以加密也可以解密这个消息。如果使用的密钥较大(大于128比特),秘密密钥系统则非常难以破解。这些系统也 相对较快,可以用来加密大容量数据。由于这一点,才产生了许多对称密钥算法。使用这种对称密钥系统的问题是因为发送者和接收者必须共享相同密钥,因此发送 者需要为每个目标接收者提供各自不同的密钥。如果有n个人的话,则每个人需要有n(n-1)/2个密钥才能秘密地与其他任何参与者联系。一个常用的方法是 使用公钥加密来传输对称会话密钥,该密钥可用于发送者和接收者之间的会话中。会话密钥可以配有一个时间戳,从而使得它在某一具体时间段内有效。时间戳可以 对抗截获会话密钥并在稍后使用的重放攻击。然而,对称密钥系统并不提供身份验证和不可抵赖机制。曾经盛行的众所周知的对称密钥系统是数据加密标准 (Data Encryption Standard,DES)。DES是从IBM的Lucifer加密系统演化而来,在20世纪70年代早期用于商业用途中。
1) 数据加密标准
DES 是一个对称密钥加密系统,是1972年IBM公司的Horst Feistel开发的Lucifer算法的一个变体。他在此技术上获得了专利。DES后来被广泛用于商业和各种用途上。DES描述了数据加密算法 (DataEncryption Algorithm,DEA),于1977年被拟为联邦信息处理标准(Federal InformationProcessing Standard,FIPS)46-1,并以DES这个名称向社会公布。DEA也被定义为ANSI标准X3.92。1993年美国国家标准和技术协会 (National Institute of Standards and Technology,NIST)对DES进行了重新认证。在此之后,DES没有被再认证过,后来被高级加密标准(AdvancedEncryption Standard,AES)替代。
DEA使用64位数据块和56位密钥加密。它开始是用一个64 位的密钥,然后去除掉8位奇偶校验位。奇偶校验位从数据位中产生,用来判断数据是否已经变得与原来的值不一样了。DEA是一个16圈加密系统,起初的目的 是为在硬件中使用。如果DEA使用56位密钥,那么在蛮力攻击中,攻击者必须尝试256或者70千兆个可能的密钥才能破解它。尽管 这个数非常巨大,但是大量计算机通过Internet合作也能穷尽所有可能的密钥组合。由于这一弱点,美国政府从1998年11月开始就不再使用DES 了。三重DES—— 即用DEA进行三次加密—— 替代了DES,一直到后来的高级加密标准(Advanced Encryption Standard,AES)被采用。我们回顾DES安全的历史很有用,因为它表明了曾经被认为是安全的一些加密系统后来是如何被破解的。
DES之所以被破解,是因为现在有了超大规模集成芯片(Very LargeScale Integration,VLSI),计算能力提高了,相应的计算成本下降了。下面总结了主要的破解DES的几次大事:
① 1997年,分布式软件用时90天,蛮力搜索了DES的密钥空间(256或者72千兆个密钥),破解了DES。这次搜索每天大概运行14 000台计算机,速度为每秒钟平均搜索232个密钥。
② 1998年,分布式软件用时39天,蛮力搜索DES的密钥空间(256或者72千兆个密钥)。这次搜索的平均运行速度是每秒234个密钥。
③ 1998年,电子前沿基金会(ElectronicFrontier Foundation,EFF)斥资25万美元建立了一个硬件DES解密机,每秒钟可以测试900亿个密钥。这个破解机器对DES密钥空间执行了一次蛮力 搜索。该设备包括1856个自定义的DES破解芯片,这些芯片安装在共29个电路板上(每个电路板上装有64个芯片)。这个项目需要18个月大概10个人 兼职才能完成。
④ 1998年7月,EFF DES机器以每秒搜索236个密钥的速度用时56.05小时发现了DES密钥。
⑤ 1999年1月,EFF DES机器与Internet上分布在全世界的大约10万台计算机合作,以每秒平均搜索237个密钥的速度用时22.25小时发现了DES密钥。
⑥ 2001年,现场可编程门阵列(FieldProgrammable Gate Array,FPGA)设计以33.33兆赫兹运行,执行了DES密钥的蛮力搜索,速度为每秒225个密钥。有了这种硬件,根据密钥所在的密钥空间的位置,DES密钥可以在最少25小时最多到10天的范围内被找到。
2) 三重DES
我们已经知道,用一个DES密钥加密明文之后再用另一个DES密钥加密它比只用一个DES密钥加密也没安全到哪里去。乍一看,如果两个密钥有n个位数,使用蛮力攻击尝试所有可能的密钥需要尝试2n×2n或者22n个不同的组合。然而,Merkle和Hellman说明对于一个已知的明文,用中间相遇攻击法可以用2n+1个尝试便可以破解双倍加密。这种攻击从一端加密,从另一端解密,然后在中间对比结果。因此,人们使用三重DES来获取更强大的加密。
三重DES对一个消息加密3次。这种加密可以通过几种方式实现。比如,消息可以用密钥1加密,用密钥2解密(其实是另一种加密),然后再用密钥1加密:
[E{D[E(M,K1)],K2},K1]
在DES算法中,加密和解密被同等对待,不同之处是密钥输入进这个算法的方向(MSB或LSB)。
这种方式的三重DES加密是指DES-EDE2。如果用两个密钥执行3次加密,叫DES-EEE2:
[E{E[E(M,K1)],K2},K1]
同样,E{E[E(M,K1)],K2},K3是指用3个不同密钥执行三重加密的DES-EEE3。这种加密是三重DES的最安全的形式。
3) 高级加密标准
高 级加密标准(Advanced Encryption Standard,AES)是一种被作为联邦标准来替代DES的分组密码。但预计三重DES在短时间内仍将是美国政府批准使用的一种算法。三重DES和 DES被发布在FIPS 46-3中。AES首先在1997年1月由NIST发布,之后作为候选加密算法被征求提议。在1998年8月29日,由NIST公布了15个AES候选算 法。1999年,NIST公布了5个最终的候选者。这5个候选者为MARS、RC6、Rijndael、Serpent和Twofish。NIST在 2000年5月15日关闭了第2轮对这些算法的公开分析。
在2000年10月2日,NIST 宣布选用Rijndael分组密码为拟提议的AES算法,该算法是由比利时密码学家Joan Daemen博士和Vincent Rijmen博士设计。Rijndael最终于2001年11月26日被确定为高级加密标准,发布于联邦信息处理标准197(FIPS PUB 197)。FIPS PUB 197中陈述到:“本标准可以在联邦部门和机构判断有敏感信息(P.L.100-235中有定义)需要加密保护时使用。除这个标准之外,还可以应用其他 FIPS批准的加密算法替代这个标准。”根据使用的3个密钥的不同,这个标准还叫做AES-128、AES-192或AES-256。AES被美国国内外 的其他私人组织和公共组织所广泛采用。
Rijndael算法设计有下列属性:
● 在设计之时可抵御所有已知的攻击。
● 设计简单。
● 代码的简洁和速度适合各种平台。
Rijndael密码可以被归类为迭代分组密码,块的长度和密钥的长度可以变化,可以独立选择使用128、192或256个位数。用十进制术语表示,大概有3.4×1038个可能的128位密钥、6.2×1057个可能的192位密钥和1.1×1077个可能的256位密钥。
AES规定了3个不同大小的密钥(128、192和256位)和一个固定大小的块(128位)。
对于Rijndael加密算法的相对强度,我们可以这样比量:如果一台计算机可以以每秒钟尝试256个密钥的速度破解DES加密,那么,同样的一台计算机需要149万亿(149×1012)年才能破解Rijndael。而宇宙的年龄据估计不到200亿年(20×109)。
4) IDEA密码
国 际数据加密算法(International Data Encryption Algorithm,IDEA)密码是一个安全的、秘密的、密钥-分组密码算法,由JamesMassey 和Xuejia Lai共同开发。它于1992年从叫做建议加密标准(Proposed EncryptionStandard)和改进的建议加密标准(ImprovedProposed Encryption Standard)的早期算法中演变而来。IDEA运行于64位的明文块,使用128位的密钥。
因为使用128位密钥,IDEA密码的破解比DES困难得多。IDEA的运作模式和DES描述的相同,适合用于Phil Zimmerman开发的完美隐私(Pretty Good Privacy,PGP)电子邮件加密系统中。
来源:oschina
链接:https://my.oschina.net/u/552047/blog/78954