现代密码学翻译第一章

现代密码学

第一章 概述

1.1 密码学和现代密码学

在《牛津英语词典》中密码学被定义为“书写或解决编码的艺术”。在《牛津英语词典》成书的那个年代,这是准确的,但是在现在,这一描述已经不能准确概括现代密码学如今的宽度和科学基础了。这个定义仅仅关注了在几个世纪以来被用于秘密通信的编码,但是目前密码学的范围已经远超如此:确保完整性的机制、交换密钥的技术、认证用户的协议、电子拍卖和选举、数字现金等等。简而言之,我们会说,现代密码学是涉及保护数字信息、系统和分布式计算对抗对抗攻击的研究。

字典的定义也把密码学定义为一种艺术。直到20世纪末,密码学实际上还一直是一门艺术。依赖于创造力和对代码如何工作的意识,密码专家们构建优秀的编码或者破解现成的密码。很长一段时间以来,密码学几乎没有可以依赖的理论,什么是好的编码也没有准确的定义。但是从20世纪70年代和80年代开始,这种密码学的图景有了根本性的变化。一套严谨且丰富的理论开始出现,使得密码学作为一门科学或者说作为一门数学学科来进行严格研究成为可能。这一套理论又反过来影响了密码学研究人员对计算机安全这一更广泛领域的看法。

经典密码学(比如说,在20世纪80年代之前)和现代密码学之间的另一个非常重要的区别与它的应用场景有关。在历史上,密码学的主要应用机构是军事组织和政府。现在,密码学无处不在!输入密码登录账号,通过信用卡购买东西,或者下载你的操作系统的验证更新,你无疑都应用了密码学。而且,越来越多的菜鸟程序员们被要求通过在程序中加入加密机制来“保护”他们编写的应用程序。

简而言之,现在密码学已经从仅用于军方秘密通信的艺术变成了一种为全球所有人提供系统保护的科学。这也意味着密码学已经成为计算机科学中一个更重要的话题。

本书的目标

我们的目标是让计算机科学、电气工程或数学的学生能够使用现代密码学的基本原理;帮助那些想要将密码学纳入他们正在开发的系统或软件的专业人士;以及任何有着成熟的数学基础,并且对密码学这一迷人领域感兴趣的人。在读完了这本书之后,读者应该可以知晓常用的密码学原语和它们的内容和旨在实现的内容,并能够根据新的密码学方案背后的安全性证明和与安全性证明相关的数学原理(或许其实缺乏安全性证明)来给新的密码学方案进行基本的评估。我们的目的并不是让读者在读完这本书后成为专家,或者能够设计新的密码系统,但我们也提供了术语和基础材料,以供感兴趣的读者随后研究该领域更高级的参考文献。

这一章节

虽然本书的重点是介绍关于现代密码学的正式研究,但我们在本章却是以对“经典”密码学的非正式讨论而作为开始的。讨论经典密码学除了让我们轻松地进入内容之外,我们在这一章中的处理也将有助于激励我们在其余部分中对密码学采用更严格的方法。我们本章的意图不是详尽地去讨论经典密码学,因此,这一章主要并不是关于经典密码学的。对经典密码学感兴趣的读者可以阅读本章末尾的书籍来进行更加深入的了解。


1.2私钥加密的设置

经典的密码学是关于设计和使用编码(也称为密码),使双方能够在窃听者面前秘密通信,其中窃听者可以监视他们之间的所有通信。而在现代密码学中,编码被称为加密方案,这也是我们在这里使用的术语。几乎所有经典加密方案的安全性都依赖于一个秘密——密钥——,而它事先由通信方共享,窃听者却不知道。这种场景被称为私钥加密,而私钥加密只是在这次设置中使用的加密中的一个实例。在描述一些历史加密方案之前,我们将更进一步地,详细地探讨私钥加密。

在私钥加密设置中,双方共享一个密钥,并在秘密通信时使用此密钥。其中加密方要发送一个消息,这个消息被称作明文(plaintext),明文通过共享的密钥进行加密(encrypt)后发送给接收者,加密后的明文被称作密文(ciphertext),而接收方也使用共享的密钥对密文进行解密(decrypt)并且将之还原。值得注意的是,相同的密钥被加密方和解密者同时应用,这就是为什么这也被称为对称密钥设置,其中的对称性在于双方都持有用于加密和解密的相同的密钥。这就与非对称加密(asymmetric)或公私钥加密(public-key)(在第10章中介绍)相反,在那里加密和解密使用不同的密钥。

图1.1:私钥密码学(这里是加密)的一个常见设置是:双方共享一个用于安全通信的密钥

如前所述,加密的目标是在窃听者可以监视通信通道和观察密文的情况下保护明文。我们将在本章的后面更详细地讨论这个问题,并在第2章和第3章中花大量的篇幅来正式定义这个目标。

私钥加密方案有两个规范的应用场景。第一个是在两个不同的地方进行秘密通信,比方像是一个工作人员在重庆和她在三亚的同事进行沟通,可以参考图1..这两个使用者需要满足一个前提,即她们需要在通信前把共享密钥安全地交换(请注意,如果一方只是通过公共通信信道将密钥发送给另一方,那么窃听者也会获得密钥!),通常而言,这很容易做到,让双方在一个安全的地点见面,鬼鬼祟祟地分享密钥就可以了;就在刚刚给的例子里面,她们作为同时,可以在她们经常碰头的咖啡店里面共享密钥。但是在其他的很多场景中,分享密钥是桩困难得多的事情,不过在接下来的几章中,我们只是简单地假设共享一个密钥是可能的。我们会重新回顾这个问题在第十章中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图1.2:私钥密码(还是加密)的另一个常见设置:单个用户可以随着时间的推移安全地存储数据。

私钥密码学的第二个广泛应用涉及到同一一方随着时间的推移与自己通信。(见图1.2)这听起来很奇怪,不过想想一下,比如像是说磁盘加密,即用户加密一些明文,并将生成的密文存储在他们的硬盘上;过段时间之后用户想要查看之前的那些明文,那么他就可以通过自己的设置的密码进行解密。这里,你的加密硬盘就扮演了一个通信信道,窃听者可以是拿到你的加密硬盘的人,显而易见,在这里,分享密钥这一过程在这里是根本不存在的,但是用户依旧需要安全和可靠的方式来保护自己的数据。

  1. 密钥生成算法Gen是一种概率算法,它输出根据某种分布选择的密钥k。
  2. 加密算法Enc以一个密钥k和一个消息m作为输入,并输出一个密文c。我们用Enck (m)表示使用密钥k对明文m的加密。
  3. 解密算法Dec以一个密钥k和一个密文c作为输入,并输出一个明文m。我们用Deck(c).表示使用密钥k对密文c的解密

加密方案必须满足以下正确性要求:对于Gen输出的每个密钥k和每条消息m∈M,都要满足下式:

Dec k(Enc k(m)) = m.

通俗的说就是:解密出的信息需要和加密前的消息是一样的。

密钥生成算法输出的所有可能的密钥的集合称为密钥空间,用K表示。在大多数情况下,Gen过程(生成密钥)只是从密钥空间中选择一个统一的密钥。事实上,在这种情况下,可以假设这是没有损失普遍性的。(见练习2.1)

回顾我们之前的讨论,希望进行通信的双方可以使用如下的加密方案。首先,运行Gen获得双方共享的密钥k。之后,当一方想要将明文m发送到另一方时,她会计算c= Enck (m),并将生成的密文c通过公共通道发送给另一方。在接收到c后,另一方计算m=Deck (c)来恢复原始明文。

密钥和柯克霍夫(Kerckhoff)的原则。根据上文的讨论,不难想象一旦窃听者有了密钥k之后,所有的加解密都是形同虚设。正是因为这个原因,通信方必须安全地共享密钥k,并对其他人完全保密k。那么他们是否应该对Dec的解密算法保密呢?如果上面这个问题答案是对的,那么对加密方案的所有细节保密难道不是更好吗?

在19世纪末,奥古斯特·柯克霍夫(Auguste Kerckhoffs)在一篇论文中提出了相反的观点,该论文阐述了军事密码的几种设计原则。其中最重要的那个原则,现在也被称作柯克霍夫原则:

密码方案不能是秘密,而且密码方案必须落入敌人手里面。

The cipher method must not be required to be secret, and it must be able to fall into the hands of the enemy without inconvenience.

也就是说,一个加密方案应该被设计为安全的,即使窃听者知道该方案的所有细节,只要攻击者不知道被使用的密钥,那明文就不能被得到。换句话说,安全不应该依赖于加密方案的保密;相反,柯克霍夫原则要求安全完全依赖于密钥的保密。

有三个主要论点支持柯克霍夫原则。第一个论点是,双方对一个短密钥的保密比对他们正在使用的(更复杂的)算法保密要容易得多。想象一下如果我们使用加密来保护某个组织中所有的员工对之间的通信,难道所有员工都要使用不同的加密方案吗?更何况有关加密算法的信息可能会被这些员工之一泄露(比如,在被解雇后),或者由攻击者使用逆向工程获得。简而言之,假设加密算法将保持保密是完全不现实的。

PS:我们使用“:=”表示确定的赋值分配,并假设Enc是确定性的。在书的后面可以有一个常见的符号列表找到。

其次,如果交流的双方的共享的密钥被泄露了,要求他们更改密钥要比替换加密方案容易得多。(请考虑一下,您是会选择更新文件还是安装新的加解密程序。)此外,生成一个新的随机密钥是相对简单的任务,而设计一个新的加密方案将是一项巨大的任务。

最后,对于大规模部署,所有用户依赖相同的加密算法/软件(具有不同的密钥)比每个人使用自己的自定义算法要容易得多。(即使是对与几个不同方通信的单个用户也是如此。)事实上,我们希望对加密方案进行标准化,这样子既确保兼容性,也可以让加密方案的安全性得到保障。

如今,柯克霍夫的原则被理解为主张将密码设计完全公开,这与“模糊保密”(security by obscurity)的概念形成了鲜明对比,后者认为对算法保密也可以提高安全性。柯克霍夫原则任务使用一种专有的“自酿”(home-brewed)算法是非常危险的。(自酿:即由某家公司秘密设计的非标准化算法)相比之下,已发表的加密方案需要经过公众审查,因此是更加安全的。多年的经验表明,一般人很难构建出更好的加密方案。因此,如果我们对一个方案进行了广泛的研究(由方案设计者以外的专家进行),并且没有发现任何弱点,那么我们对这个方案的安全性的信心要比“自酿”算法的信心要高得多。虽然这个道理很显然,但开放密码设计原则(即克霍夫原则)却被一再忽视,并且多次带来了灾难性的后果。幸运的是,今天有足够的安全、标准化和广泛可用的密码系统,我们没有理由使用其他算法来自寻烦恼。


1.3历史上的密码方案和对他们的分析

在我们对“经典”密码学的研究中,我们将列举一些历史上著名的加解密方案,并证明它们是不安全的。我们的主要目的是

  1. 强调那些“点对点”密码算法的弱点,从而激励你去阅读本书剩余部分提到的更加现代的,严格的加密方案
  2. 证明过于简单的方法实现安全加密是不太可能成功的。
在这一路上,我们将介绍一些密码学的核心原则,受这些历史方案的弱点的启发。

在本节中,明文字符用小写字母书写,密文字符用大写字母书写,以使印刷版更加清晰

凯撒密码被记录的最古老的密码,尤利乌斯凯撒,罗马共和国末期杰出的军事家、政治家。该密码被记载在大约公元110年前。


Aut Caesar,aut nihil

不为恺撒 宁为虚无

尤利叶斯·凯撒通过移动字母表中的字母向后移动3个位置来加密:a被替换为d,b被替换为E,以此类推。在字母表的最后,字母表后面再接一个一样的字母表,所以z用c替换,y用B替换,x用a替换。例如,对下文进行加密,首先删除空格,有:

EHJLQWKHDWWDFNQRZ

这个密码的一个直接问题是,加密方法是固定的;没有密钥。因此,任何了解凯撒如何加密他的信息的人都能够毫不费力地解密。

有趣的是,这种密码的一种变体叫做ROT-13(其替换位置是向后移13个位置,而不是3)现在仍然在各种线上论坛上使用。据了解,它的目的并非提供任何密码安全;它仅仅是用来确保文本(例如,电影剧透)是难以理解的,除非读者有意识地选择解密它。

移位密码和充分密钥空间原理。移位密码都可以看作是凯撒密码的变体。具体来说,在移位密码中,密钥k可以由一个介于0到25之间的数字来表示。为了加密,字母会像凯撒密码一样向后移动,不过现在移动了k个位置,而不是3个位置。将其映射到前面描述的加密语法,消息空间由任意长度的英语字母字符串组成,去掉标点、空格和数字,不区分大写和小写。算法Gen输出一个统一的密钥k∈{0,…,25};算法Enc的参数是一个密钥k和一个明文,并将明文中的每个字母向后移动k个位置(会在字母表的末尾进行循环);算法Dec的参数是一个密钥k和一串密文,并将密文的每个字母向前移动k个位置解密成明文。

一个更数学的描述是通过将英语字母表与集合{0,…,25}进行一一映射(a映射为0,b映射为1,以此类推)。消息空间M是这个集合中任意有限的整数序列。使用密钥k加密消息m = m1···ml(其中mi∈{0,…,25}),表示为下式:

Enck(m1 · · · ml ) = c1 · · · cl, 其中ci = [(mi + k) mod 26]

(符号[a mod N]表示a对N进行取余操作,其中0≤[a mod N] < N。我们把a映射到[a mod N]的过程称作取余操作,我们将在第八章详细介绍与之相关的内容),用密钥k对密文c = c1 · · · cl可以用下式表现:`

Deck(c1 · · · cl) = m1 · · · ml, 其中 mi = [(ci − k) mod 26].

那么,移位密码安全吗?在继续阅读之前,请尝试解密使用移位密码和密钥k生成的以下密文:

OVDTHUFWVZZPISLRLFZHYLAOLYL.

是否有可能在不知道密钥k的情况下恢复明文?事实上,这易如反掌!原因是只有26个可能的密钥。因此,可以尝试穷举每个可能的密钥来解密密文,从而获得一个包含26个候选明文的列表。正确的明文肯定会在这个列表上;此外,如果密文“足够长”,那么正确的明文很可能是列表上唯一“有意义”的候选文本。(后者并不一定是正确的,但大多数时候都是正确的。即使不是这样,这次攻击也会将潜在的明文集缩小到最多26种可能性。)通过列举候选文本列表,可以很容易地恢复原始的明文。

一种涉及尝试所有可能的密钥的攻击被称为暴力攻击或穷举攻击。显然,为了使一个加解密方案更加安全,它不应该容易受到这样的攻击。上述这一结论被称为充分密钥空间原理(sufficient key-space principle):

任何安全的加密方案都必须有一个足够大的密钥空间,才能使穷尽搜索攻击不可行。

Any secure encryption scheme must have a key space that is sufficiently large to make an exhaustive-search attack infeasible.

当然,有人会争论什么样的程度的努力仍不能破解才能被称之为“不可行”,实际上,要确定什么是可行性取决于潜在攻击者的资源以及发送者和接收者希望确保其通信保密的时间长度。如今,攻击者可以使用超级计算机、数千上万台的PC或者显卡的算力(gpu)来加速暴力攻击。因此,为了防止此类攻击,密钥空间必须非常大——比如说,至少有 2 70 2^{70} 270个大小,如果人们担心针对资金充足的攻击者的长期安全问题,甚至要使用更大的密钥空间。

充分密钥空间原理给出了安全性的必要条件,但不是充分条件。下一个案例将演示这一点。

注意:在某些地方,凯撒密码也可以泛指移位密码

简单(单字母)替换密码(The mono-alphabetic substitution cipher)。在移位密码中,密钥定义了从(明文)字母表中的每个字母到(密文)字母表中的每个字母的映射,其中映射是由密钥决定的固定移位决定的。而在单字母替换密码中,密钥还定义了字母表上的映射,但现在允许映射是任意位置的,由于它是一对一的,以便可以解密。因此,密钥空间由字母表自身的所有双射。例如,定义以下排列的键:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(例如明文a映射成密文X,等等等等)将我的明文加密。这个密码的名称来自于这样一个事实,即该加解密方案为明文中的每个单个字符都定义了一个(固定的)替换。

假设使用英文字母,密钥空间大小是26!= 26·25·24···2·1,大约是 2 88 2^{88} 288,根据上文提到的充分密钥空间原理,暴力攻击是不可行的。然而,这并不意味着密码是安全的!事实上,正如我们接下来将展示的,即使这个方案有很大的密钥空间,也很容易破坏这个方案。

假设英语文本是被加密的(即,文本是在语法上正确的英语书写,而不仅仅是使用英语字母表中的字符书写的文本)。然后,可以利用英语语言的统计数据来攻击简单替换密码。(当然,同样的攻击也适用于任何语言。)这次攻击所依据的事实是:

  1. 对于任何键,每个字母的映射都是固定的,因此如果e映射到D,那么e在明文中的每一次出现都会导致D在密文中的出现。
  2. 英语中单个字母的频率分布是已知的(见图1.3)。当然,非常短的文本可能会偏离这种分布,但即使是只有几个句子组成的文本的字母频率分布也往往非常接近平均分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图1.3:英语文本的平均字母频率。

攻击的工作原理是将密文中字符的频率分布制表,即记录A出现11次,B出现4次,以此类推。然后将这些频率与普通英语文本的已知字母频率进行比较。然后,我们就可以根据观察到的频率来猜测由该密钥定义的部分映射。例如,由于e是英语中最常见的字母,所以我们可以猜出密文中最常见的字符对应于明文字符e,以此类推。虽然有些字母的猜测可能是错误的,但大部分的字母猜测一般会是正确的,这样可以实现相对快速的解密(特别是还可以利用其他英语知识,例如u通常出现在q后面,h更有可能出现在t和e之间)。我们的结论是,虽然简单替换密码有一个很大的密钥空间,但它仍然是不安全的。

简单替换密码可以很快被破解并不是件奇怪的事情,因为基于这个密码的谜题经常会出现在报纸上的趣味板块里面(很多人吃早饭的时间就可以解决这个问题)。我们建议您尝试解读以下的密文——这应该会让您相信执行攻击是多么容易。(不妨参考一下图1.3)

JGRMQOYGHMVBJWRWQFPWHGFFDQGFPFZRKBEEBJIZQQOCIBZKLFAFGQVFZFWWEOGWOPFGFHWOLPHLRLOLFDMFGQWBLWBWQOLKFWBYLBLYLFSFLJGRMQBOLWJVFPFWQVHQWFFPQOQVFPQOCFPOGFWFJIGFQVHLHLROQVFGWJVFPFOLFHGQVQVFILEOGQILHQFQGIQVVOSFAFGBWQVHQWIJVWJVFPFWHGFIWIHZZRQGBABHZQOCGFHX

对转换密码的改进攻击。我们可以使用字母-频率表来改进对移位密码的攻击。我们之前对shift密码的攻击需要使用每个可能的密钥解密密文,然后检查哪个密钥会产生“有意义”的明文。这种方法的一个缺点是,要实现自动化有点困难,因为计算机很难检查一个给定的明文是否“有意义”。(我们并不说这是不可能的,因为攻击可以使用有效的英语单词词典自动进行。我们只是说自动化不是很简单的。)此外,也可能有一些情况——我们稍后会看到——有些明文字符虽然像英语文本一样分布,但是很不幸,明文本身不是有效的英语,在这种情况下,检查“有意义”的明文本将不起作用。

我们现在介绍一个没有这些缺点的攻击。和前面一样,将英语字母表中的字母与0…25的集合一一映射,设 p i p_i pi,0≤ p i p_i pi​≤1,表示普通英语文本中第i个字母的频率(忽略空格、标点符号等)。使用图1.3进行计算,得出:

∑ p i 2 ≈ 0.065 ( 1.1 ) \sum p_i^{2}\approx 0.065(1.1) pi20.065(1.1)

现在,假设我们得到一串密文,用 q i q_i qi表示字母表中第i个字母的频率;也就是说, q i q_i qi是字母表中第i个字母的出现次数除以密文的长度。如果密钥是k,那么 p i p_i pi应该大致等于在密钥k的 q i + k q_{i+k} qi+k,因为第i个字母映射到(i+k)第h个字母。(我们这里使用i+k来代替书写更加麻烦的[i+kmod26],这里这两个其实是一个东西。),因此,我们计算:
I j = d e f ∑ i = 0 25 p i ∗ q i + j I_j\overset{def}{=}\sum_{i=0}^{25}p_i*q_{i+j} Ij=defi=025piqi+j
对于每个j∈{0,…,25},如果 I j I_j Ij越接近0.065,那么j就是k的概率就越大,所以自动化的方法就是计算所有的可能j,然后输出 I j I_j Ij​最接近0.065的j,那个j大概率就是k。

维吉尼亚(多字母移位)密码前文提到,之所以可以对单字母替换密码进行统计攻击,是因为密钥定义了一个固定的映射,这种映射关系会把明文的统计规律映射到密文里面去。但是这种统计攻击可以通过使用多字母移位来预防,其中密钥定义了一个应用于明文字符块(多个明文)的映射。例如,在这个例子里面,一个密钥可以将2个字符长度的字符块ab映射到DZ,同时将ac映射到TY;请注意,观察上例,明文字符a不会映射到一个固定的密文字符(在第一个ab中它映射成了D,在ac中它映射成了T)。多字母替换密码“平滑”了密文中字符的频率分布,使统计分析的进行更加困难。

维吉尼亚密码,就是上述的多字母移位密码的一种特殊情况,也称为多字母移位密码,通过顺序应用移位密码的几个独立实例来工作。密钥现在被视为一串字母;加密是通过移动每个明文字符的在密钥中所指示的数量,其中如果长度超过上限则进行取余操作。(如果密钥的长度为1,则这将退化为移位密码。)例如,使用密钥cafe对消息tellhimaboutme的加密工作如下:

明文tellhimaboutme
密钥(不断重复)cafecafecafeca
密文VEQPJIREDOZXOE

(密钥并不一定是英语单词。)加密第一、第五、第九…第4n+1个字符的方法完全相同,都是使用移位密码和密钥的字符c;同样的,第二、第六、第十…第4n+2个字符的方法是完全相同的,都是s;第三、第七…f字符;第四、第八,…有e的字符。注意,在上面的例子中,可以看到l第一次映射到Q,第二次映射到p。此外,密文字符E有时从e获得,有时从a获得。所以,密文的字符频率如愿“平滑”了。

如果密钥足够长,破解这个密码是令人生畏的。事实上,很多人认为这是不可破译的密码,尽管它是在16世纪发明的,但直到数百年后才有人对该密码进行了有系统的攻击。

攻击维吉尼亚密码攻击者研究了维吉尼亚密码,他们对维吉尼亚密码的第一个观察结果是,如果密钥的长度已知,那么攻击密码是相对容易的。具体来说,首先讲密钥的长度,这也被称为周期,设之为t。将密钥k写成k = k 1 ⋅ ⋅ ⋅ k t k_1···k_t k1⋅⋅⋅kt,其中每个 k i k_i ki都是字母表中的一个字母。观察到的密文c = c 1 c 2 c_1c_2 c1c2···可以分为t部分,每个部分都可以视为是仅使用移位密码加密的。具体来说,对于所有j∈{1,…t},有密文字母
c j , c j + t , c j + 2 t , . . 组成, c_j,c_{j+t},c_{j+2t},..组成, cjcj+tcj+2t..组成,
所有这些都是由于通过 k j k_j kj位置移动明文的相应字符。我们将上述字符序列称为第j个流。剩下的就是确定密钥k的中的每一个字符,由于每一个流都是一个简单移位密码,所以可以解密出密文的每一个字符。这与前文的简单移位密码虽然相似,但仍有区别,首先,不难想象出每一个流实际上是没有意义的,所以对它进行判断语义是否有意义是不能判断自己的破解是否是成功的;另一个问题是,穷举攻击在密钥t够长的情况下也是不可行的,它将会被尝试 2 6 t 26^t 26t次。然而,我们依旧可以用前文提到的字母-频率表的攻击法来对维吉尼亚进行逐个字母的解密。也就是说,对于每个流,我们对每个流进行字母频率表攻击,从而确定密钥k,通过这种方法,它把攻击的复杂度从 2 6 t 26^{t} 26t优化到了26t。

当密钥长度已知时,上述的方法可以成功地进行攻击。那么如果密钥的长度未知怎么办?

首先要注意,只要密钥的最大长度T不是太大,我们就可以简单地重复上述攻击T次(对于每个可能的值t从1开始进行穷举)。这导致最多会有T个不同的候选明文,而其中真正的明文是很容易识别。所以未知的密钥长度并不是一个严重的障碍。

还有一些更有效的方法可以通过观察到的密文来确定密钥长度。一种是使用19世纪中期由卡西斯基发明的方法。这里的第一步是识别密文中长度为2或3的重复模式。这些很可能是在经常在明文中出现的某些常用两字母单词和三字母单词的结果。例如,考虑一下常见的单词“the”,这个单词在明文中经常出现,虽然它在密文中映射的时候会有不同的形式。但是,如果它在密钥相同的相对位置出现两次,那么它将被映射成相同的密文字符。因此,对于足够长的明文,很有可能“the”将重复映射到相同的密文字符。

考虑以下具体例子(为清晰起见,已添加空格来对明文进行单词分割):

词“the"有时映射到ULE,有时映射到LII,有时映射到XHH。然而,它被两次映射到LII上,不难想象在一个足够长的文本中,它很可能会被多次映射到每种可能性上。卡西斯基的观察结果是,这种重复出现的映射(假设它们不是巧合)之间的距离一定是密钥长度的倍数。(在上述例子中,周期为5,LII的两次出现之间的距离为30,是周期的6倍。)因此,重复序列之间的距离的最大公约数(假设它们不是巧合)将产生密钥长度t或密钥t的倍数。

另一种方法,被称为符合指数方法,更具有系统性,因此也更容易自动化。回想一下,如果密钥的长度为t,那么密文字符
c 1 , c 1 + t , c 1 + 2 t , . . . . c_1,c_{1+t},c_{1+2t},.... c1,c1+t,c1+2t,....
如果密钥的长度猜测是正确的(或者是正确密钥长度的倍数),那么根据前面提到的,每个流中的字母出现的频率应该符合大部分的明文规律,那么它的字母频率的值应该符合下式:
∑ p i 2 ≈ 0.065 ( 1 ) \sum p_i^{2}\approx 0.065(1) pi20.065(1)
而如果密钥的长度是错误的,那么每个流中每个字母出现的次数应该都接近1/26,在这种情况下,它的字母频率值应该符合下式

∑ ( 1 26 ) 2 ≈ 0.038 ( 2 ) \sum {(\frac{1}{26})}^{2}\approx 0.038(2) (261)20.038(2)
可以看到1式和2式得到的结果差距还是非常大的,因此,我们可以对每个可能长度的不同流进行计算,如果每个流都比较接近0.065,那么它更有可能是密钥的长度或密钥长度的倍数,反之,如果该值非常接近0.038,那么它更有可能不是密钥的长度或密钥长度的倍数。

针对密文长度和密码的分析攻击上述对维吉尼亚密码的攻击需要比对以前方案的攻击更长的密文。例如,符合指数法要求c1,c1+t,c1+2t(其中t是实际的键长度)足够长,以确保观察到的频率符合预期;我们需要的密文长度必须是t的好几倍。类似地,我们对单字母替换密码的攻击需要比对shift密码的攻击更长的密码文(它甚至可以用于对单个单词的加密)。这说明,一个较长的密钥通常需要密码分析人员获得更多的密文来进行攻击。(事实上,只要密钥足够长,那么维吉尼亚密码就是安全的。我们将在下一章中看到类似的现象。)

结论在本节我们只展示了几个历史密码。除了为了满足历史兴趣之外,我们展示它们的目的是要说明一些重要的教训。也许最重要的一点教训是,设计安全的密码是很困难的。维吉尼亚密码有很长一段时间没有损坏。它还使用了相较之于其他密码更复杂的方案。但是一个更加复杂的方案不一定是更加安全的,几乎所有历史上的密码都被破解了。
\rule{20cm}{0.05em}\\

1.4现代密码学的原理

从前一节中可以清楚地看出,密码学在历史上更像是一门艺术,而不是一门科学。方案以一种特别的方式设计,并根据人们对这个方案破解难度的感性的感知来判断这个方案到底是不是安全的。分析一个方案的方法是看看是否可以发现任何攻击;如果发现了攻击的方法,设计者对该方案进行“修补”来抵御发现了的攻击方法,不断重复上述过程来增加密码的安全性。如果对于一个密码方案有了攻击的方法,那么人们会认为这个方案是不安全的,但对于“安全”计划应该满足什么要求并没有一致的概念,也没有办法去证明一个具体的方案是安全的。

但是在过去的几十年里,密码学已经发展成为一门科学。现在以更系统的介绍方式开发和分析方案,最终目标是给出一个严格的证明,证明一个给定的结构是安全的。为了清楚的说明上面的证明是什么样子的,我们首先需要正式的定义来:什么是“安全”;这样的定义本身是有用和有趣的。事实证明,大多数密码证明依赖于关于某些数学问题的没有解决的假设;任何这样的假设都必须明确并精确地陈述。强调定义、假设和证明,将现代密码学与经典密码学区分开来;我们将在下面的章节中更详细地讨论这三个原则。

原则1:正式的定义

现代密码学的关键贡献之一是认识到安全的正式定义对于正确设计、研究、评估和密码原语的使用至关重要。直白地说:

如果你不明白你想要实现什么,你怎么可能知道你是否实现了它呢?

正式的定义需要明确描述该算法需要应对的安全威胁以及需要提供的安全保证。因此,定义可以帮助指导加密方案的设计。实际上,最好是在设计开始之前明确所需要的内容,而不是在设计完成后再提出一个定义。后者容易让设计者耗尽耐心后(而不是在达到目标时)结束设计阶段的风险,或者可能以牺牲效率为代价设计出超过所需要的安全方案。

定义还提供了一种评估和分析所构建的内容的手段。有了合适的定义,就可以通过判断它是否达到了期望的保证来评估一个已经提出的方案;在某些情况下,甚至可以通过证明它符合定义来证明给定的设计是安全的(见第1.4.3节)。反之,定义也可以用来证明一个给定的方案是不安全的,只要该方案不满足该定义。特别注意,上一节提到的攻击其实并不能证明那些能被破解的方案都是“不安全的”。例如,对维吉尼亚密码的攻击的前提是有足够长的英文文本被加密,但是如果被加密的英文文本很短或者是压缩文本(被压缩的文本具有大致统一的字母频率)被加密,攻击方案就失效了,那么维吉尼亚密码就是“安全”的吗?如果没有一个正式的定义,这是难以判断的。

正式的定义可以让不同的方案进行有意义的比较。正如我们将看到的,可以有多种(有效的)方法来定义安全性;“正确的”与否取决于使用的场景。一个满足较弱安全定义的方案可能比另一个满足较强定义的方案更有效;有了精确的定义,我们就可以正确地评估这两种方案之间的权衡。同样地,定义也支持方案的安全使用,考虑定义可以让我们选择在大型应用场景中究竟应该使用何种加密方案。解决这个问题的一个合理方法是,首先了解该应用场景需要提供怎么样的安全,然后找到一个满足该需求的加密方案。这种方法的一个好处是模块化:设计者可以“交换”一种加密方案,并替换为另一种加密方案(也满足必要的安全定义),而不必担心影响整个应用程序的安全性。

写一个正式的定义迫使人们思考对于手头的问题哪些东西是必要的,而又有哪些属性是无关的。通过这个过程,往往可以让我们发现问题中那些乍看之下难以发现的细节。接下来,我们将会为加密的情况进行说明。。

示例:安全加密一个常见的错误是认为正式的定义其实是不需要的,或者是微不足道的,因为“每个人都对安全有一个直观的含义”。但事实并非如此。作为一个例子,我们考虑了加密的情况。(读者也许应该在这里停下来,思考一下,读者可能想在这里停下来思考一下,他们将如何正式定义什么是安全加密。)虽然我们在这里不会给出安全加密的正式定义(它会在接下来的两章被提到),但我们要在这里非正式地描述这样的定义应该具备什么条件。

一般来说,安全定义有两个组成部分:安全保证(或者,从攻击者的角度来看,什么是对方案的成功攻击)和威胁模型。安全保证定义了防止攻击者执行的方案,而威胁模型描述了对手的力量,即假设攻击者能够执行什么行动。

让我们从第一个问题开始。一个安全的加密方案应该保证什么呢?以下是一些观点:

  • 攻击者应该永远无法拿到密钥。我们之前观察到,如果攻击者可以使用某种方案确定双方共享的密钥,那么该方案就不是安全的。然而,很容易提出一个攻击者拿不到密钥,但该方案明显不安全的反例。考虑,例如,其中Enck (m) = m的方案。密文没有泄露关于密钥的信息(因此如果密钥足够长,密钥就无法恢复),但是消息直接以明文发送!因此,我们看到,密钥是不可能被得到其实并不足以保证安全。这告诉了我们一个道理:加密的目的是保护消息;密钥是实现这一目标的一种手段,但它本身并不重要。
  • 攻击者应该不可能根据密文来恢复整个明文。这个定义比前者好多了,但仍然不能令人满意。按照这个定义来想象一下,如果密文显示了90%的明文,只要10%的明文仍然难以识别,那么这个定义将认为加密方这种方案还是安全的。这在大多数常见的加密场景中显然是不可接受的;例如,当加密一个工资数据库时,如果90%的员工工资被泄露,那他当然是不安全的!
  • 攻击者应该不可能从密文中恢复明文的任何字符。这看起来是一个很好的定义,但仍然不够。回到加密工资数据库的例子,如果加密方案显示员工的工资是否高于或低于10万美元,即使它不会显示该员工工资的任何特定数字,我们也不会认为加密方案是安全的。同样,我们不希望加密方案来揭示员工a的收入是否比员工b多。另一个问题是如何形式化“恢复明文字符”。如果攻击者通过纯粹的运气或外部信息,正确地猜测出某人的薪水中最不重要的数字是0呢?显然,这不会使加密方案不安全,因此任何可行的定义都必须以某种方式排除成功攻击的行为。
  • “正确”的答案是:无论攻击者已经拥有了任何信息,密文都不应该泄露关于基础明文的任何信息。这个非正式的定义包含了上面概述的所有问题。特别注意,它没有试图定义关于明文的哪些信息是“有意义的”;它只是要求不泄露任何信息。这一点很重要,因为这意味着一个安全的加密方案需要适用于所有需要保密的潜在应用程序。

    在这个非正式的定义中,缺少一个精确的、数学的定义公式。我们应该如何获取攻击者关于明文的先验知识?(不)泄露信息意味着什么?我们将在接下来的两章中回到这些问题;尤其参见定义2.3和3.12。

既然我们已经确定了一个安全目标,它仍然需要指定一个威胁模型。威胁模型需要明确攻击者拥有的”权力“,而不是提前针对对手的策略。这是一个重要的区别:我们明确说明了我们对对手能力的假设,但我们没有假设它如何使用这些能力。因为我们不可能预见攻击者会使用何种策略,而历史已经证明,针对对手策略的方案一定会失败的。

通常而言,威胁模型有几个看似合理的假设;按照攻击者力量从小到大的顺序排序:

  • 纯密文攻击:这是最基本的攻击,指的是对手只能看到密文(或多个密文)并试图确定有关底层明文(或明文)的信息的情况。这是我们在上一节讨论经典加密方案时隐含假设的威胁模型。
  • 已知明文攻击:在这里,对手能够使用某个密钥来生成明文密文对,然后,对手的目的是推导出使用相同密钥生成的其他密文的底层明文。
    在这种假设下,前面提到的所有明文都可以说是毫无卵用的
  • 选择明文攻击:在此攻击中,对手可以获得其选择的明文的明文/密文对(如上所述)。
  • 选择密文攻击:最后一种类型的攻击是对手能够额外获得其选择的密文的解密(一些信息),例如,攻击者选择的某些密文的解密是否产生有效的英语密钥。对手的目标再次是学习有关其他密文的底层明文的信息(对手无法直接获得其解密)。

这些威胁模型本身并没有谁更优秀的区别;选择哪一个需要取决于部署加密方案的环境。

前两种攻击类型是最容易进行的。在纯密文的攻击中,对手唯一需要做的事情就是窃听发送加密消息的公共通信通道。在已知明文攻击中,假定对手也以某种方式获得与已知明文相对应的密文。这通常很容易实现,因为不是所有加密的消息都是保密的,至少不会是无限期保密的。举一个比较简单的例子,双方可能总是在他们开始通信时加密一个“你好”消息。再举一个情况更复杂的例子,季度收益报告一般是加密的,但是到了发布日期,它就不是保密的了;在这种情况下,任何窃听密文的人都会在未来获得相应的明文。

而后两种攻击,假定对手能够获得其所选择的明文/密文的加/解密。对于这种场景,乍一听是难以理解的,我们将对这些攻击及其实用性的更详细的讨论推迟到3.4.2节(选择明文攻击)和3.7节(选择密文攻击)。

原则2:精确的假设

大多数现代密码结构不能无条件地被证明是安全的;这样的证明需要解决算法复杂性理论中的问题,而这些问题在今天似乎还远没有得到回答。这种不幸状况造成的结果是,安全性的证明通常依赖于假设。现代密码学要求任何这样的假设都必须得到明确和数学上的精确。在最基本的层面上,这仅仅是因为安全的数学证明需要这样做。但还有其他原因:

  1. 假设的可靠性就其本质而言,假设是指没有被证明,被推测为真实的陈述。为了加强我们对假设其实是真实的信心,我们有必要研究这个假设。这个假设被检验却不能被反驳的次数越多,这个假设就越可能是正确的。此外,对一个假设的研究可以为它的有效性提供证据,通过与它相关的其他被广泛研究而不能反驳的假设来暗示它是真实的。

    如果所依赖的假设没有被精确地陈述,那么它就不能被研究,也不能被反驳,它的真实性自然是可疑的。因此,增加我们对假设的信心的一个先决条件是对假设的确切内容有一个精确的陈述。

  2. 方案的比较在密码学中,我们经常会提出两种方案,它们都可以被证明满足某些定义,每种方案都基于不同的假设。假设除了假设之外的其他条件都相等,我们应该选取哪种方案?如果第一个方案的假设是弱于第二个方案的假设(比如:第二个假设是由第一个假设推断的),那么我们应该选取第一个方案,因为很有可能日后会证明第二个假设是错误的,但第一个假设却是正确的。如果两种方案使用的假设没有可比性,那么一般规则是选择基于研究更充分的假设的方案,因为它有更大的可信度。
  3. 理解必要的假设:一个加密方案可能是基于一些基础的构建块。如果后来在构建块中发现了一些弱点,我们如何知道加密方案是否仍然安全?如果明确说明关于构建块的基本假设是证明方案安全性的一部分,那么我们只需要检查所需的假设是否受到所发现的新弱点的影响。

有时会出现一个问题:与其基于其他假设来证明一个方案是安全的,为什么不简单地假设构建的方案本身就是安全的呢?在某些情况下,例如,当一个方案成功抵御攻击多年时,这可能是一种合理的方法。但这种方法从来都不是首选,而且在引入新计划时非常危险。以上原因有助于解释这一点。首先,人们比起新的、特别的方案更喜欢采用那些经过几年测试的方案。其次,人们普遍倾向于更容易陈述的方案,因为这些方案更容易研究和反驳。因此,例如,假设某个数学问题很难解决,比假设加密方案满足复杂的安全定义更容易研究和评估。依赖“较低级别”的假设(而不仅仅是假设一个方案的构造是安全的)的另一个优点是,这些较低级别的假设通常可以用于其他结构的方案。最后,低级假设可以提供模块化。考虑一个加密方案,其安全性依赖于其构建块之一的某些假定属性。如果基础构建模块不满足所述假设,则仍然可以使用被认为满足必要要求的不同组件来实例化加密方案。

1.4.3原则3 安全性的证明

上面描述的两个原则允许我们实现我们的目标,即提供一个严格的证明,即一个构造在某些特定的假设下满足一个给定的定义。这样的证明在密码学中尤其重要,因为有一个攻击者正在积极地试图“破坏”某种方案。根据定义和假设,可靠的安全证据可以保证攻击者不会成功;这比采取无原则或启发式的方法来解决问题要好得多。如果没有证据证明拥有指定资源的对手能够破坏某些方案,我们就只能凭直觉知道这就是情况。经验表明,在密码学和计算机安全方面的直觉是灾难性的。有无数个未经证实的方案被破解的例子,有时是立即出现的,有时是在方案被开发出好几年之后。

总结:严格证明的安全方案 vs 即兴的针对问题的安全方案

依赖于定义、假设和证明构成了一种严格的密码学方法,它不同于经典密码学的非正式方法。不幸的是,没有原则的“即兴”解决方案仍然是由那些希望快速解决问题的人,或者那些只是无知的人设计和部署的。我们希望这本书将有助于人们认识到严格的方法及其在发展可证明的安全方案方面的重要性。

1.4.4可证明的安全性和现实世界的安全

现在,许多的现代密码科学都建立在健全的数学基础上。但这并不意味着这个领域已经完全与艺术无关了。严格的方法为开发适合当代应用和环境的定义,提出新的数学假设或设计新的原语,以及构建新的方案并证明它们的安全性提供了创造性的空间。当然,也总会有攻击已部署的加密系统的艺术,即使它们被证明是安全的。接下来我们将扩展这一点。

现代密码学所采取的方法已经彻底改变了这一领域,并有助于为在现实世界中部署的密码学方案的安全性提供信心。但重要的是不要夸大安全证明的含义。安全性的证明总是与正在考虑的定义和正在使用的假设有关。如果安全保证与需要的东西不匹配,或者威胁模型没有捕捉到对手的真实能力,那么证明可能是不相关的。同样地,如果所依赖的假设被证明是错误的,那么安全证明也是没有意义的。

关键是,一个方案的可证明安全性并不一定意味着该方案在现实世界中的安全性。虽然有些人认为这是可证明安全性的一个缺点,但我们乐观地认为这也说明了这种方法的优势。要在现实世界中攻击一个可证明安全的方案,只需将注意力集中在定义上(即,探索理想化的定义与部署方案的现实世界环境有何不同)或基本假设(即,看看它们是否成立)就足够了。反过来,密码学家的工作是不断完善他们的定义,以更接近现实世界,并调查他们的假设来测试它们的有效性。可提供的安全性并没有结束攻击者和防御者之间由来已久的战斗,但它确实提供了一个框架,用来帮助防御者获胜。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值