应用密码学--基础知识

第一章 基础知识

1.1 专业术语
发送者和接收者
假设发送者想发送消息给接收者,且想安全地发送信息:她想确信偷听者不能阅读发送的消息。

消息和加密
消息被称为明文。用某种方法伪装消息以隐藏它的内容的过程称为加密,加了密的消息称为密文,而把密文转变为明文的过程称为解密。图1.1表明了这个过程。
(如果你遵循ISO 7498-2标准,那就用到术语“译成密码(encipher)”和“解译密码(decipher)”。某些文化似乎认为术语“加密(encrypt)”和“解密(decrypt)”令人生厌,如同陈年腐尸。)


图1.1 加密和解密

使消息保密的技术和科学叫做密码编码学,从事此行的叫密码编码者,密码分析者是从事密码分析的专业人员,密码分析学就是破译密文的科学和技术,即揭穿伪装。作为数学的一个分支的密码学包括密码编码学和密码分析学两者,精于此道的人称为密码学家,现代的密码学家通常也是理论数学家。
明文用M(消息)或P(明文)表示,它可能是比特流(文本文件、位图、数字化的语音流或数字化的视频图像)。至于涉及到计算机,P是简单地二进制数据(除了这一章节外,这本书本身只涉及二进制数据和计算机密码学)。明文可被传送或存储,无论在哪种情况,M指待加密的消息。
密文用C表示,它也是二进制数据,有时和M一样大,有时稍大(通过压缩和加密的结合,C有可能比P小些。然而,单单加密通常达不到这一点)。加密函数E作用于M得到密文C,用数学表示为:
E(M)=C.
相反地,解密函数D作用于C产生M
D(C)=M.
先加密后再解密消息,原始的明文将恢复出来,下面的等式必须成立:
D(E(M))=M
鉴别、完整性和抗抵赖
除了提供机密性外,密码学通常有其它的作用:.
-鉴别
消息的接收者应该能够确认消息的来源;入侵者不可能伪装成他人。
-完整性
消息的接收者应该能够验证在传送过程中消息没有被修改;入侵者不可能用假消息代替合法消息。
-抗抵赖
发送者事后不可能虚假地否认他发送的消息。
这些功能是通过计算机进行社会交流,至关重要的需求,就象面对面交流一样。某人是否就是他说的人;某人的身份证明文件(驾驶执照、医学学历或者护照)是否有效;声称从某人那里来的文件是否确实从那个人那里来的;这些事情都是通过鉴别、完整性和抗抵赖来实现的。
算法和密钥
密码算法也叫密码,是用于加密和解密的数学函数。(通常情况下,有两个相关的函数:一个用作加密,另一个用作解密)
如果算法的保密性是基于保持算法的秘密,这种算法称为受限制的算法。受限制的算法具有历史意义,但按现在的标准,它们的保密性已远远不够。大的或经常变换的用户组织不能使用它们,因为每有一个用户离开这个组织,其它的用户就必须改换另外不同的算法。如果有人无意暴露了这个秘密,所有人都必须改变他们的算法。
更糟的是,受限制的密码算法不可能进行质量控制或标准化。每个用户组织必须有他们自己的唯一算法。这样的组织不可能采用流行的硬件或软件产品。但窃听者却可以买到这些流行产品并学习算法,于是用户不得不自己编写算法并予以实现,如果这个组织中没有好的密码学家,那么他们就无法知道他们是否拥有安全的算法。
尽管有这些主要缺陷,受限制的算法对低密级的应用来说还是很流行的,用户或者没有认识到或者不在乎他们系统中内在的问题。
现代密码学用密钥解决了这个问题,密钥用K表示。K可以是很多数值里的任意值。密钥K的可能值的范围叫做密钥空间。加密和解密运算都使用这个密钥(即运算都依赖于密钥,并用K作为下标表示),这样,加/解密函数现在变成:
EK(M)=C
DK(C)=M.
这些函数具有下面的特性(见图1.2):
DK(EK(M))=M.


图1.2 使用一个密钥的加/解密

图1.3 使用两个密钥的加/解密

有些算法使用不同的加密密钥和解密密钥(见图1.3),也就是说加密密钥K1与相应的解密密钥K2不同,在这种情况下:
EK1(M)=C
DK2(C)=M
DK2 (EK1(M))=M
所有这些算法的安全性都基于密钥的安全性;而不是基于算法的细节的安全性。这就意味着算法可以公开,也可以被分析,可以大量生产使用算法的产品,即使偷听者知道你的算法也没有关系;如果他不知道你使用的具体密钥,他就不可能阅读你的消息。
密码系统由算法、以及所有可能的明文、密文和密钥组成的。
对称算法
基于密钥的算法通常有两类:对称算法和公开密钥算法。
对称算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加/解密密钥是相同的。这些算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加/解密。只要通信需要保密,密钥就必须保密。
对称算法的加密和解密表示为:
EK(M)=C
DK(C)=M
对称算法可分为两类。一次只对明文中的单个比特(有时对字节)运算的算法称为序列算法或序列密码。另一类算法是对明文的一组比特亚行运算,这些比特组称为分组,相应的算法称为分组算法或分组密码。现代计算机密码算法的典型分组长度为64比特--这个长度大到足以防止分析破译,但又小到足以方便使用(在计算机出现前,算法普遍地每次只对明文的一个字符运算,可认为是序列密码对字符序列的运算)。
公开密钥算法
公开密钥算法(也叫非对称算法)是这样设计的:用作加密的密钥不同于用作解密的密钥,而且解密密钥不能根据加密密钥计算出来(至少在合理假定的长时间内)。之所以叫做公开密钥算法,是因为加密密钥能够公开,即陌生者能用加密密钥加密信息,但只有用相应的解密密钥才能解密信息。在这些系统中,加密密钥叫做公开密钥(简称公钥),解密密钥叫做私人密钥(简称私钥)。私人密钥有时也叫秘密密钥。为了避免与对称算法混淆,此处不用秘密密钥这个名字。

 用公开密钥K加密表示为

EK(M)=C.

虽然公开密钥和私人密钥是不同的,但用相应的私人密钥解密可表示为:

DK(C)=M

有时消息用私人密钥加密而用公开密钥解密,这用于数字签名(见2.6节),尽管可能产生混淆,但这些运算可分别表示为:

EK(M)=C

DK(C)=M



密码分析

密码编码学的主要目的是保持明文(或密钥,或明文和密钥)的秘密以防止偷听者(也叫对手、攻击者、截取者、入侵者、敌手或干脆称为敌人)知晓。这里假设偷听者完全能够接获收发者之间的通信。

密码分析学是在不知道密钥的情况下。恢复出明文的科学。成功的密码分析能恢复出消息的明文或密钥。密码分析也可以发现密码体制的弱点,最终得到上述结果(密钥通过非密码分析方式的丢失叫做泄露。)

对密码进行分析的尝试称为攻击。荷兰人A.Kerckhoffs最早在19世纪阐明密码分析的一个基本假设,这个假设就是秘密必须全寓于密钥中[794]。Kerckhoffs假设密码分析者已有密码算法及其实现的全部详细资料(当然,可以假设中央情报局(CIA)不会把密码算法告诉摩萨德(Mossad)(译注:以色列的情报组织),但Mossad也许会通过什么方法推出来)。在实际的密码分析中并不总是有这些详细信息的??应该如此假设。如果其他人不能破译算法,即便了解算法如何工作也是徒然,如果连算法的知识都没有,那就肯定不可能破译它。

常用的密码分析攻击有四类,当然,每一类都假设密码分析者知道所用的加密算法的全部知识:

(1) 唯密文攻击。密码分析者有一些消息的密文,这些消息都用同一加密算法加密。密码分析者的任务是恢复尽可能多的明文,或者最好是能推算出加密消息的密钥来,以便可采用相同的密钥解出其他被加密的消息。

已知:C1=EK(P1),C2=EK(P2),LL,CI=EK(Pi)

推导出:P1,P2,L,Pi;K或者找出一个算法从Ci+1= EK(Pi+1)推出Pi+1。

(2) 已知明文攻击。密码分析者不仅可得到一些消息的密文,而且也知道这些消息的明文。分析者的任务就是用加密信息推出用来加密的密钥或导出一个算法,此算法可以对用同一密钥加密的任何新的消息进行解密。

已知:P1,C1=Ek(P1),P2,C2=Ek(P2),L,Pi,Ci=Ek(Pi),

推导出:密钥k,或从Ci+1= Ek(Pi+1)推出Pi+1的算法。

(3)选择明文攻击。分析者不仅可得到一些消息的密文和相应的明文,而且他们也可选择被加密的明文。这比已知明文攻击更有效。因为密码分析者能选择特定的明文块去加密,那些块可能产生更多关于密钥的信息,分析者的任务是推出用来加密消息的密钥或导出一个算法,此算法可以对用同一密钥加密的任何新的消息进行解密。

已知:P1,C1=Ek(P1),P2,C2=Ek(P2),L,Pi,Ci=Ek(Pi)

其中P1,P2,L,Pi是由密码分析者选择的。

推导出:密钥k,或从Ci+1= Ek(Pi+1)推出Pi+1的算法。

(4)自适应选择明文攻击。这是选择明文攻击的特殊情况。密码分析者不仅能选择被加密的明文,而且也能基于以前加密的结果修正这个选择。在选择明文攻击中,密码分析者还可以选择一大块被加了密的明文。而在自适应选择密文攻击中,他可选取较小的明文块,然后再基于第一块的结果选择另一明文块,以此类推。

另外还有至少三类其它的密码分析攻击。

(5)选择密文攻击。密码分析者能选择不同的被加密的密文,并可得到对应的解密的明文,例如密码分析者存取一个防窜改的自动解密盒,密码分析者的任务是推出密钥。

已知:C1,P1=Dk(C1),C2,P2=Dk(C2),L,Ci,Pi=Dk(Ci),

推导出: k。

这种攻击主要用于公开密钥体制,这将在19.3节中讨论。选择密文攻击有时也可有效地用于对称算法(有时选择明文攻击和选择密文攻击一起称作选择文本攻击。)

(6)选择密钥攻击。这种攻击并不表示密码分析者能够选择密钥,它只表示密码分析者具有不同密钥之间的关系的有关知识。这种方法有点奇特和晦涩,不是很实际,将在12.4节讨论。

(7)软磨硬泡(Rubber-hose)攻击。密码分析者威胁、勒索,或者折磨某人,直到他给出密钥为止。行贿有时称为购买密钥攻击。这些是非常有效的攻击,并且经常是破译算法的最好途径。

已知明文攻击和选择明文攻击比你想象的更常见。密码分析者得到加了密的明文消息或贿赂某人去加密所选择的消息,这种事情时有所闻。如果你给某大使一则消息,也可能发现该消息已加密了,并被送回他的国家去研究。此时你会去贿赂某人;密码分析者也许知道,许多消息有标准的开头和结尾。加密的源码特别脆弱,这是因为有规律地出现关键字, 如出现:#define,struct,else,return等。加了密的可执行代码也有同样问题,如:调用函数、循环结构等等。已知明文攻击(甚至选择明文攻击)在二战中已被成功地用来破译德国和日本的密码。David Kahn的书中有此类攻击的历史例子[794,795,796]。

不要忘记Kerckhoffs的假设:如果你的新的密码系统的强度依赖于攻击者不知道算法的内部机理,你注定会失败。如果你相信保持算法的内部秘密比让研究团体公开分析它更能改进你的密码系统的安全性,那你就错了。如果你认为别人不能反汇编你的代码和逆向设计你的算法,那你就太天真了(1994年RC4算法就发生了这种情况-见17.1节)。最好的算法是那些已经公开的,并经过世界上最好的密码分析家们多年的攻击,但还是不能破译的算法(国家安全局对外保持他们的算法的秘密,但他们有世界上最好的密码分析家在内部工作,你却没有。另外,他们互相讨论他们的算法,通过执著的审查发现他们工作中的弱点)。



密码分析者不是总能知道算法的。例如在二战中美国人破译日本人的外交密码--紫密(PURPLE)[794]就是例子,而且美国人一直在做这种事。如果算法用于商业安全程序中,那么拆开这个程序,把算法恢复出来只是时间和金钱问题;如果算法用于军队的通讯系统中,购买(或窃取)这种设备,进行逆向工程恢复算法也只是简单的时间和金钱的问题。



那些因为自己不能破译某个算法就草率地声称有一个不可破译的密码的人要么是天才,要么是笨蛋,不幸的是后者居多。千万要提一味吹嘘算法的优点,但又拒绝公开的人,相信他们的算法就像相信骗人的包医百病的灵丹妙药一样。

好的密码分析家总会坚持审查,以图把不好的算法从好的算法中剔除出去。



算法的安全性

根据被破译的难易程度,不同的密码算法具有不同的安全等级。如果破译算法的代价大于加密数据的价值,那么你可能是安全的。如果破译算法所需的时间比加密数据保密的时间更长,那么你可能是安全的;如果用单密钥加密的数据量比破译算法需要的数据量少得多,那么你可能是安全的。

我说“可能”是因为在密码分析中总有新的突破。另一方面,大多数数据随着时间的推移,其价值会越来越小,而数据的价值总是比突破保护它的安全性的代价更小,这点是很重要的。

Lars Knudsen把破译算法分为不同的类别,安全性的递减顺序[858]为:

1. 全部破译。密码分析者找出密钥K,这样DK(C)=P。

2. 全盘推导。密码分析者找到一个代替算法A,在不知道密钥K的情况下,等价于

DK(C)=P。

3. 实例(或局部)推导。密码分析者从截获的密文中找出明文。

4. 信息推导。密码分析者获得一些有关密钥或明文的信息。这些信息可能是密钥的几个比特、有关明文格式的信息等等。



如果不论密码分析者有多少密文,都没有足够的信息恢复出明文,那么这个算法就是无条件保密的,事实上,只有一次一密乱码本(参看1.5节),才是不可破的(给出无限多的资源仍然不可破)。所有其它的密码系统在唯密文攻击中都是可破的,只要简单地一个接一个地去试每种可能的密钥,并且检查所得明文是否有意义,这种方法叫做蛮力攻击(见7.1节)。

密码学更关心在计算上不可破译的密码系统。如果一个算法用(现在或将来)可得到的资源都不能破译,这个算法则被认为在计算上是安全的(有时叫做强的)。准确地说, “可用资源”就是公开数据的分析整理。

你可以用不同方式衡量攻击方法的复杂性(见11.1节):

1. 数据复杂性。用作攻击输入所需的数据量。

2. 处理复杂性。完成攻击所需要的时间,这个经常叫做工作因素。

3. 存储需求。进行攻击所需要的存储量。

作为一个法则,攻击的复杂性取这三个因数的最小化,有些攻击包括这三种复杂性的折中:存储需求越大,攻击可能越快。

复杂性用数量级来表示。如果算法的处理复杂性是2128,那么破译这个算法也需要2128次运算(这些运算可能是非常复杂和耗时的。)。假设你有足够的计算速度去完成每秒钟一百万次运算,并且用100万个并行处理器完成这个任务,那么仍需花费1019年以上才能找出密钥,那是宇宙年龄的10亿倍。

当攻击的复杂性是常数时(除非一些密码分析者发现更好的密码分析攻击),就只取决于计算能力了。在过去的半个世纪中,我们已看到计算能力的显著提高,并且没有理由认为这种趋势不会继续。许多密码分析攻击用并行处理机是非常理想的:这个任务可分成亿万个子任务,且处理之间不需相互作用。一种算法在现有技术条件下不可破译就简单地宣称该算法是安全的,这未免有些冒险。好的密码系统应设计成能抵御未来许多年后计算能力的发展。



过去的术语

历史上,将处理语言单元的密码系统称为密本:字、短语、句子等。例如,单词 “OCELOT”可能是整个短语“TURN LEFT 90 DEGREES,”的密文,单词“LOLLIPOP”可能是“TURN RIGHT 90 DEGREES”的密文,而字“BENT EAR”可能是“HOWITZER”的密文。这种类型的密本在本书里没有讨论。密本在特殊环境中才有用,而密码在任何情况下都有用;密码本中若没有“ANTEATERS“这一条,那么你就不能提它。但你可以用密码来指代任何东西。

1.2 隐写术
隐写术是将秘密消息隐藏在其它消息中,这样,真正存在的秘密被隐藏了。通常发送者写一篇无伤大雅的消息,然后在同一张纸中隐藏秘密消息。历史上的隐写方式有隐形墨水,用小针在选择的字符上刺小的针眼,在手写的字符之间留下细微差别,在打印字符上用铅笔作记号、除了几个字符外,大部分字符用格子盖起来等等。
最近,人们在图象中隐藏秘密消息,用图象的每个字节的最不重要的比特代替消息比特。图象并没有怎么改变-大多数图象标准规定的颜色等级比人类眼睛能够觉察得到的要多得多--秘密消息却能够在接收端剥离出来。用这种方法可在1024ⅹ1024灰色刻度图片中存储64K字节的消息。能做此类把戏的公开程序已有好几种。
Peter Wayner的模拟函数也能使消息隐匿,这类函数能修改消息,使它的统计外形与一些其它东西相似:如纽约时报的题录部分、莎士比亚的戏剧、Internet网上的新闻组[1584,1585]。这类隐写术愚弄不了普通人,但却可以愚弄那些为特定的消息而有目的地扫描Internet的大型计算机。
1.3 代替密码和换位密码
在计算机出现前,密码学由基于字符的密码算法构成。不同的密码算法是字符之间互相代换或者是互相之间换位,好的密码算法是结合这两种方法,每次进行多次运算。
现在事情变得复杂多了,但原理还是没变。重要的变化是算法对比特而不是对字母进行变换,实际上这只是字母表长度上的改变,从26个元素变为2个元素。大多数好的密码算法仍然是代替和换位的元素组合。
代替密码
代替密码就是明文中每一个字符被替换成密文中的另外一个字符。接收者对密文进行逆替换就恢复出明文来。
在经典密码学中,有四种类型的代替密码??
(1)简单代替密码,或单字母密码:就是明文的一个字符用相应的一个密文字符代替。报纸中的密报就是简单的代替密码。
(2)多名码代替密码:它与简单代替密码系统相似,唯一的不同是单个字符明文可以映射成密文的几个字符之一,例如A可能对应于5、13、25或56,“B”可能对应于7、19、31或42,等等。
(3)字母代替密码:字符块被成组加密,例如“ABA”可能对应于“RTQ”,ABB可能对应于“SLL”等。
(4)多表代替密码:由多个简单的代替密码构成,例如,可能有5个被使用的不同的简单代替密码,单独的一个字符用来改变明文的每个字符的位置。
著名的凯撒密码就是一种简单的代替密码,它的每一个明文字符都由其右边第3个(模26)字符代替(A由D代替,B由E代替LLW由Z代替LX由A代替,Y由B代替,Z由C代替)。它实际上更简单,因为密文字符是明文字符的环移,并且不是任意置换。
ROT13是建在UNIX系统上的简单的加密程序,它也是简单的代替密码。在这种密码中,A被N代替,B被O代替等等,每一个字母是环移13所对应的字母。
用ROT13加密文件两遍便恢复出原始的文件:
P=ROT13(ROT13(P))
ROT13并非为保密而设计的,它经常用在互联网Vsenet电子邮件中隐藏特定的内容,以避免泄露一个难题的解答等等。
简单代替密码是很容易破译的,因为它没有把明文的不同字母的出现频率掩盖起来。在好的密码分析者重构明文之前,所有的密文都由25个英文字母组成[1434],破译这类密码的算法可以在[578,587,1600,78,1475,1236,880]中找到。好的计算机破译算法见[703]。
多名码代替密码早在1401年最早由Duchy Mantua公司使用,这些密码比简单代替密码更难破译,但仍不能掩盖明文语言的所有统计特性,用已知明文攻击,破译这种密码非常容易,唯密文攻击要难一些,但在计算机上只需几秒钟[710]。详情见[126]中的叙述。
多字母代替密码是字母成组加密,普莱费尔在1854年发明了这种密码。在第一次世界大战中英国人就采用这种密码[794]。字母成对加密,它的密码分析在[587,1475,880]中讨论。希尔密码是多字母代替密码的另一个例子[732]。有时你会把Huffman编码用作密码,这是一种不安全的多字母代替密码。
多表代替密码由Leon Battista在1568年发明[794],在美国南北战争期间由联军使用。尽管他们容易破译[819,577,587,794](特别是在计算机的帮助下),许多商用计算机保密产品都使用这种密码形式[1387,1390,1502]。(怎么破译这个加密方案的细节能够在[135,139]中找到,这个方案用在Word-Perfect中)。维吉尼亚密码(第一次在1586年发表)和博福特密码均是多表代替密码的例子。
多表代替密码有多个单字母密钥,每一个密钥被用来加密一个明文字母。第一个密钥加密明文的第一个字母,第二个密钥加密明文的第二个字母等等。在所有的密钥用完后,密钥又再循环使用,若有20个单个字母密钥,那么每隔20个字母的明文都被同一密钥加密,这叫做密码的周期。在经典密码学中,密码周期越长越难破译,使用计算机就能够轻易破译具有很长周期的代替密码。
滚动密钥密码(有时叫书本密码)是多表代替密码的另一个例子,就是用一个文本去加密另一个文本,即使这种密码的周期与文本一样长,它也是很容易被破译的[576,794]。

换位密码
在换位密码中,明文的字母保持相同,但顺序被打乱了。在简单的纵行换位密码中,明文以固定的宽度水平地写在一张图表纸上,密文按垂直方向读出(见图1.4),解密就是将密文按相同的宽度垂直地写在图表纸上,然后水平地读出明文。

Plaintext: COMPUTERGRAPHICSMAYBESLOWBUTATLEASTITSEXPENSIVE
COMPUTERGR
APHICSMAYB
ESLOWBUTAT
LEASTITSEX
PENSIVE
Ciphertext: CAELPOPSEEMHLANPIOSSUCWTITSBIVEMUTERATSGYAERBTX

图1.4 纵行换位密码
对这些密码的分析在[587,1475]中讨论。由于密文字符与明文字符相同,对密文的频数分析将揭示出 每个字母和英语有相似的或然值。这给了密码分析者很好的线索,他就能够用各种技术去决定字母的准确顺序,以得到明文。密文通过二次换位密码极大地增强了安全性。甚至有更强的换位密码,但计算机几乎都能破译。
在第一次世界大战中,德国人所用的ADFGVX密码就是一种换位密码与简单的代替密码的组合。在那个时代它是一个非常复杂的算法,但被法国密码分析家George Painvin所破 [794]。
虽然许多现代密码也使用换位,但由于它对存储要求很大,有时还要求消息为某个特定的长度,因而比较麻烦。代替密码要常用得多。

转轮机
在20年代,人们发明各种机械加密设备用来自动处理加密。大多数是基于转轮的概念,机械转轮用线连起来完成通常的密码代替。
转轮机有一个键盘和一系列转轮,它是Vigenere 密码的一种实现。每个转轮是字母的任意组合,有26个位置,并且完成一种简单代替。例如:一个转轮可能被用线连起来以完成用“F”代替“A”,用“U”代替“B”,用“L”代替“C”等等,而且转轮的输出栓连接到相邻的输入栓。
例如,在4个转轮的密码机中,第一个转轮可能用“F”代替“A”, 第二个转轮可能用“Y”代替“F”, 第三个转轮可能用“E”代替“Y”, 第四个转轮可能用“C”代替“E”,“C”应该是输出密文。那么当转轮移动后,下一次代替将不同了。
为使机器更安全,可把几种转轮和移动的齿轮结合起来。因为所有转轮以不同的速度移动,n个转轮的机器的周期是26n。,为进一步阻止密码分析,有些转轮机在每个转轮上还有不同的位置号。
最著名的转轮装置是恩尼格马(Enigma)。恩尼格马在第二次世界大战期间由德国人使用。其基本原理由欧洲的Arthur Scherbius和Arvid Gerhard Damn发明,它由Arthur Scherbius在美国申请了专利[1383],德国人为了战时使用,大大地加强了基本设计。
恩尼格马有三个转轮,从五个转轮中选择。转轮机中有一块稍微改变明文序列的插板,有一个反射轮导致每个转轮对每一个明文字母操作两次。像恩尼格马那样复杂的密码,在第二次世界大战期间都被破译了。波兰密码小组最早破译了德国的恩尼格马,并告诉了英国人。德国人在战争进行过程中修改了他们的密码。英国人继续对新的方案进行分析,他们是如何破译的,请见[794,86,448,498,446,880,1315,1587,690]。有关怎么破译恩尼格马的两个传奇报道在[735,796]中叙述。

进一步的读物
这不是一本经典密码学的书,因此不多讨论这些问题。计算机出现前有两本优秀的密码学著作是[587,1475];[448]提出了一些密码机的现代密码分析方法。Dorothy Denning在[456]中讨论了许多密码,而[880]对这些密码作了很多复杂的数学分析。另一本更早的讨论模拟密码的著作见[99],文献 [579]对这个学科做了很好的回顾。David Kahn的历史性密码学论著也是非常优秀的[794,795,796]。

1.4 简单异或
异或在C语言中是“^”操作,或者用数学表达式⊕表示。它是对比特的标准操作:
0⊕0 = 0
0⊕1 = 1
1⊕0 = 1
1⊕1 = 0
也要注意:
a⊕a = 0
a⊕b⊕b = a

简单异或算法实际上并不复杂,因为它并不比维吉尼亚密码多什么东西。它之所以被包括在这本书中,是因为它在商业软件包中很流行,至少在MS-DOS和Macintosh世界中是这样[1502,1387]。不幸的是,如果一个软件保密程序宣称它有一个“专有”加密算法(该算法比DES更快),其优势在于是下述算法的一个变种。
/ * usage crypto Key input-file output-fife * /
void main ((int argc, char argvl ))
* FILE * fi,* fo;
int * cp;
int c;
if((cp = argv[1])&& *cp != ‘/0’){
if((fi=fopen(argv[2],“rb”))! =NULL){
if((fo=fopen(argv[3],“wb”))!=NULL){
While((c=getc(fi)!=EOF){
if(! * cp) cp=argv[1];
C ^=*(cp + +);
Putc(c,fo);
}
fclose(fo);
}
fclose(fi);
}
}
}
这是一个对称算法。明文用一个关键字作异或运算以产生密文。因为用同一值去异或两次就恢复出原来的值,所以加密和解密都严格采用同一程序。
P ⊕ K = C
C ⊕ K = P
这种方法没有实际的保密性,这类加密易于破译,甚至没有计算机也能破译[587,1475],用计算机只需花费几秒钟就可破译。
假设明文是英文,而且假设密钥长度是一个任意小的字节数,下面是它的破译方法??
(1)用重合码计数法找出密钥长度[577]。用密文异或相对其本身的各种字节的位移,统计那些相等的字节数。如果移位是密钥长度的倍数,那么超过6%的字节将是相等的。如果不是,则只有0.4%以下的字节将是相等的(假设一随机密钥加密标准的ASCII文本;其他的明文将有不同的数值)。这叫做重合指数。指出密钥长度倍数的最小位移就是密钥的长度。
(2)按那个长度移动密文,并且和自己异或:这样就消除了密钥,留下明文和移动了密钥长度的明文的异或。由于英语每字节有1.3比特的实际信息(见11.1节),有足够的多余度去测定唯一的解密。
尽管如此,一些软件销售商在兜售这种游戏式算法时,还声称“几乎和DES一样保密”,这使人感到震惊。NSA最终允许美国的数字蜂窝电话产业界使用这个算法(有160比特的重复“密钥”)对话音保密。异或或许能防止你的小妹妹读你的文件,但却不能防止密码分析家在几分钟内破译它。

1.5 一次一密乱码本
不管你是否相信它,有一种理想的加密方案,叫做一次一密乱码本,由Major Joseph Mauborgne和AT&T公司的Gilbert Vernam在1917年发明的[794](实际上,一次一密乱码本是门限方案的特殊情况,见3.7节)。典型地,一次一密乱码本不外乎是一个大的不重复的真随机密钥字母集,这个密钥字母集被写在几张纸上,并一起粘成一个乱码本。它最初的形式是将一次一密乱码本用于电传打字机。发方用乱码本中的每一密钥字母准确地加密一个明文字符。加密是明文字符和一次一密乱码本密钥字符的模26加法。
每个密钥仅对一个消息使用一次。发方对所发的消息加密,然后销毁乱码本中用过的一页或用过的磁带部分。收方有一个同样的乱码本,并依次使用乱码本上的每个密钥去解密密文的每个字符。收方在解密消息后销毁乱码本中用过的一页或用过的磁带部分。新的消息则用乱码本的新的密钥加密。
例如,如果消息是:
ONETIMEPAD ,
而取自乱码本的密钥序列是
TBFRGFARFM ,
那么密文就是
IPKLPSFHGQ ,
因为
O + T mod26 = I
N + B mod26 = P
E + F mod26 = K
等等。
如果偷窃听者不能得到用来加密消息的一次一密乱码本,这个方案是完全保密的。给出的密文消息相当于同样长度的任何可能的明文消息。
由于每一密钥序列都是等概的(记住,密钥是以随机方式产生的),敌方没有任何信息用来对密文进行密码分析,密钥序列也可能是:
POYYAEAAZX
解密出来是:
SALMONEGGS
或密钥序列为:
BXFGBMTMXM
解密出来的明文为:
GREENFLUID
值得重申的是:由于明文消息是等概的,所以密码分析者没有办法确定哪一明文消息是正确的。随机密钥序列异或一非随机的明文消息产生一完全随机的密文消息。再大的计算能力也无能为力。
值得注意的是,密钥字母必须是随机产生的。对这种方案的攻击将是针对用来产生密钥序列的那种方法。使用伪随机数发生器是不值得考虑的,它们通常具有非随机性。如果你采用真随机源(这比第一次出现难得多,见17.14节。),它就是安全的。
另一个重要的事情是密钥序列不能重复使用,即使你用多兆字节的乱码本,如果密码分析家有多个密钥重叠的密文,他也能够重构明文。他把每排密文移来移去,并计算每个位置的适配量。如果他们排列正确,则适配的比例会突然升高(准确的百分比与明文的语种有关)。从这一点来说,密码分析是容易的,它类似于重合指数法,只不过用两个“周期”作比较[904]。所以千万别重复使用密钥序列。
一次一密乱码本的想法很容易推广到二进制数据的加密,只需由二进制数字组成的一次一密乱码本代替由字母组成的一次一密乱码,用异或代替一次一密乱码本的明文字符加法就成。为了解密,用同样的一次一密乱码本对密文异或,其他保持不变,保密性也很完善。
这听起来很好,但有几个问题。因为密钥比特必须是随机的,并且绝不能重复使用,密钥序列的长度要等于消息的长度。一次一密乱码本可能对短信息是可行的,但它决不可能在1.44Mbps的通信信道上工作。你能在一张CD-ROM中存储650兆字节的随机二进制数。但有一些问题:首先,你需要准确地复制两份随机数比特,但CD-ROM只是对大量的数据来说是经济的;其次,你需要能够销毁已经使用过的比特,而CD-ROM没有抹除设备,除非物理毁坏整张盘。数字磁带对这种东西来说是更好的媒体。
即使解决了密钥的分配和存储问题,还需确信发方和收方是完全同步的。如果收方有一比特的偏移(或者一些比特在传送过程中丢失了),消息就变成乱七八糟的东西了。另一方面,如果某些比特在传送中被改变了(没有增减任何比特,更像由于随机噪声引起的),那些改变了的比特就不能正确地解密。再者,一次一密乱码本不提供鉴别。
一次一密乱码本在今天仍有应用场合,主要用于高度机密的低带宽信道。美国和前苏联之间的热线电话(现在还在起作用吗?)据传就是用一次一密乱码本加密的。许多苏联间谍传递的消息也是用一次一密乱码本加密的。到今天这些消息仍是保密的,并将一直保密下去。不管超级计算机工作多久,也不管半个世纪中有多少人,用什么样的方法和技术,具有多大的计算能力,他们都不可能阅读苏联间谍用一次一密乱码本加密的消息(除非他们恰好回到那个年代,并得到加密消息的一次一密乱码本)。

1.6 计算机算法
计算机密码算法有多种,最通用的有三种:
--DES(数据加密标准)是最通用的计算机加密算法。DES是美国和国际标准,它是对称算法,加密和解密的密钥是相同的。
--RSA(根据它的发明者命名的,即Rivest,Shamir 和Adleman)是最流行的公开密钥算法,它能用作加密和数字签名。
--DSA(数字签名算法,用作数字签名标准的一部分)是另一种公开密钥算法,它不能用作加密,只用作数字签名。
这些就是本书所要涉及的题材。


1.7 大数
在整本书中,我用各种大数去描述密码算法中的不同内容。因为很容易忽略这些数和它们的实际意义,所以表1.1给出了一些大数的物理模拟量。
表中这些数是估计的数量级,并且是从各种资料中精选得到的,天体物理学中许多大数在Freeman Dyson的文章中有解释,该文章发表在《现代物理学评论》中,名为“时间永无止境:开放宇宙中的物理学和生物学”。汽车事故的死亡人数是根据1993年交通部统计数据每百万人中有178起死亡事故和人均寿命为75.4年计算出来的。

表1.1 大数

物 理 模 拟 量 大 数
每天被闪电杀死的可能性 90亿(233)分之一
赢得国家发行彩票头等奖的可能性 4百万(222)分之一
赢得国家发行彩票头等奖并且在同一天被闪电杀死的可能性 1/255
每年淹死的可能性
1993年在美国交通事故中死亡的可能性 6100(213)分之一
一生在美国死于交通事故的可能性 88(27)分之一
到下一个冰川年代的时间 14000(214)年
到太阳变成新星的时间 109(230)年
行星的年龄 109(230)年
宇宙的年龄 1010(234)年
行星中的原子数 1051(2170)
太阳中的原子数 1057(2190)
银河系中的原子数 1067(2223)
宇宙中的原子数(黑粒子除外) 1077(2265)
宇宙的体积 1084(2280)cm3
如果宇宙是封闭的:
宇宙的生命期 1011(237)年
1018(261)秒
如果宇宙是开放的:
到小弥撒星冷却下来的时间 1014(247)年
到行星脱离星系的时间 1015(250)年
到行星脱离银河系的时间 1019(264)年
到由引力线引起的轨道蜕变的时间 1020(267)年
到由散播过程引起黑洞湮没的时间 1064(2213)年
到所有物质在00时都为液体的时间 1065(2216)年
到所有物质都蜕变成铁的时间 年
到所有物质都收缩为黑洞的时间 年

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值