第一章 简介和古典密码(粗略版) - 现代密码学导论 Introduction to Modern Cryptography_red1y-程序员秘密

技术标签: 现代密码学导论  安全  密码学  

Chapter 1 简介和古典密码

1.1 密码学和现代密码学

​    简明牛津字典(2006)将密码学定义为“编写或破解密码”的艺术。这个定义在历史上上可能是准确的,但它并没有抓住现代密码学的本质。首先,它只关注秘密通信的问题。这一点可以从以下事实中看出:定义中指明的“密码”,在其他地方被称为“预先安排的信号系统,特别是用于确保传输信息的保密性”。其次,该定义将密码学视为一种艺术。的确,直到20世纪(可以说直到该世纪末),密码学是一门艺术。无论是构建好的密码,或是破解现存的,都依赖于创造力和个人技巧。可以依据的理论非常少,甚至没有一个关于是什么构成了好的密码的明确概念。

​    在20世纪末,这种密码学的景象发生了根本性的变化。丰富的理论的出现,使密码学作为一门科学得到了严格的研究。此外,现在的密码学所包含的内容远远超过了秘密通信,包括消息认证,数字签名,密钥交换协议,认证协议,电子拍卖和选举,数字货币。事实上,现代密码学可以说是关注任何可能遭受内外部攻击的分布式计算系统中可能出现的任何问题。在不试图为现代密码学提供一个完美定义的情况下,我们可以说,这是对保护数字信息,交易,和分布式计算的技术的科学研究。

    另一个非常重要的古典密码学(说明,在1980s之前)和现代密码学的区别是使用者不同。历史上,密码学的主要消费者是军队和智慧组织。然而,今天,密码学无处不在!依赖密码学的安全机制是几乎任何计算机系统不可分割的一部分。用户(通常并不知道)每一次访问安全站点时都依赖密码学。密码学方法在多用户操作系统中作为强制访问控制使用,并且,阻止盗贼从盗取的笔记本中提取贸易机密。软件保护方法也使用加密,授权,和其他工具防止抄袭。这些内容数之不尽。

​    简短的说,密码学已经从一门军队处理秘密通信的艺术转变为一门帮助全球普通群众保护系统的科学。这也意味着密码学正成为计算机科学内一门越来越重要的主题。

    本书的焦点是现代密码学。但我们也将通过测试上文提到的改变之前的密码学开始我们的研究。除了缓解了材料的压力,它也将提供一种对密码学起点的理解,使得我们可以在后面看到它的变化是如此之大。关于古典密码学的研究(都是密码的特定结构,并且破解它们相对较容易)为激发出我们将要在本书中剩余部分讨论的更加严谨的方法服务。

1.2 私钥加密设置

​    如上所述,历史上密码学关注秘密通信。特别是,密码学关注在两个提前共享一些信息的政党间提供秘密通信的密码的构建(现在称为加密方案)。这种通信的政党之间提前共享一些秘密信息设定,在今天被称作私钥设置。在描述一些历史密码之前,我们讨论在更普遍的时期的私钥设定和加密方式。

​    在私钥设定中,两个党派分享一些称之为“密钥”的秘密信息,并在它们希望和彼此秘密通信时使用这个密钥。一个政党发送一条信息之前,使用密钥加密(或“scramble”)这条信息。之后,接收者收到信息后使用相同的密钥解密(或“unscramble”)并复原这条信息。信息本身常被称作“明文(plaintext)”,并且从发送者到接收者实际传输的加密(“scrambled”)信息叫作“密文(ciphertext)”;观察插图1.1。用于区别通信政党和其他政党之间的共享的密钥可能在通信过程中被窃听(eavesdropping)(通常在公共信道中假定会发生)。

在这里插入图片描述

​    我们强调在这种设定中,相同的密钥被用来转换明文和密文。这解释了为何这种设定也被称作对称密钥(symmetric-key)设定,这种对称基于两个政党持有相同的密钥用于加密和解密这一事实。这正好与非对称(asymmetric)加密(在第九章中介绍)相反,发送者和接收者没有共享任何秘密,并使用不同的密钥来加密和解密。 私钥设定是古典的一类,正如我们将在这一章后面看到的那样。

​    一个任何使用私钥加密系统中都隐含的假设是:通信政党之间已经有一些方式用于最初秘密共享一个密钥(注意如果一个政党简单的在公共通道上向其他政党发送密钥,窃听者也可以得到这个密钥!)。在军队设置中,这不是一个严重问题,因为通信部队间有能力为达成一个密钥共识在一个秘密的地点见面。然而,在许多现代密码学设定中,政党间不能够安排任何像这样的实际会面。正如我们将在第九章介绍的那样,这是我们热烈关心的一个源头,并且实际上限制了仅仅依赖私钥方式的密码学系统的应用。尽管如此,仍有许多私钥方式占领(suffice)并广泛使用的设定。一个例子是磁盘加密,相同的用户(仅仅时间点不同)使用一个固定的密钥从磁盘上读写文件。我们将在第十章中进一步探讨,私钥加密也联合非对称加密被广泛使用。

加密的语法。现在我们让上述讨论更形式化一些。一个私钥加密方案,或者密码,由三部分算法构成:首先是产生密钥的程序,其次是加密的程序,第三是解密的程序。这些算法有以下功能:

  1. 密钥生成算法(key-generation algorithm) G e n Gen Gen 是一个,根据方案确定的分布,选择输出密钥 k k k 的概率算法。
  2. 加密算法(encryption algorithm) E n c Enc Enc 以一个密钥 k k k 和一份明文 m m m 作为输入,输出一份密文 c c c。我们记用密钥 k k k 对明文 m m m 的加密为 E n c k ( m ) Enc_k(m) Enck(m)
  3. 解密算法(decryption algorithm) D e c Dec Dec 以一个密钥 k k k 和一份密文 c c c 作为输入,输出一份明文 m m m。我们记用密钥 k k k 对密文 c c c 的解密为 D e c k ( c ) Dec_k(c) Deck(c)

生成密钥的程序定义了一个密钥空间 K K K (即,所有可能密钥的集合)。加密方案是定义在一些记为 M M M 的可能明文的集合之上,并称之为明文空间。因为任何密文都是通过使用密钥加密明文获得的,所以 K K K M M M 实际上定义了一个所有可能密文的集合,我们记为 C C C。注意,一种加密方案通过明确这三种算法 ( G e n , E n c , D e c ) (Gen, Enc, Dec) (Gen,Enc,Dec) 以及明文空间 M M M 从而被完整定义。

​    任何加密方案的基本正确要求是:对于每一个通过 G e n Gen Gen 输出的密钥 k k k 以及每一个明文 m ∈ M m \in M mM,有:
D e c k ( E n c k ( m ) ) = m Dec_k(Enc_k(m)) = m Deck(Enck(m))=m

换句话说,一个加密方案必需有这样的性质:解密一份密文(使用正确的密钥),产生被加密的原始明文。

    回顾我们之前的讨论,一个加密方案将会被两个希望通信的政党按以下方式使用。首先,运行 G e n Gen Gen 获得一个政党间共享的密钥 k k k 。当一方想要给另一方发送明文 m m m 时,他将计算 c : = E n c k ( m ) c := Enc_k(m) c:=Enck(m) ,并发送获得的密文 c c c,另一方计算 m : = D e c k ( c ) m := Dec_k(c) m:=Deck(c) 来还原最初的明文。

密钥和Kerckhoffs原则。从上述公式化表述可以清晰看到,如果一个窃听敌人知道通信双方使用的 D e c Dec Dec 算法和密钥 k k k ,那么这个敌人将能够解密这些政党间的所有通信。正是由于这个原因,通信双方必须秘密地分享密钥 k k k ,并且保证 k k k 完全不被其他人知道。但是它们或许也应该保密 D e c Dec Dec?对于这个问题,或许所有构成加密方案的算法(比如, G e n Gen Gen E n c Enc Enc 等)都应该被保密?(注意,明文空间 M M M 通常被假定为已知,比如说,它可能由英文句子组成)

​    在19世纪后期,Auguste Kerckhoffs 在一份公开发表的概述有关军队密码重要设计原则的论文中给出了他对于此问题的观点。这其中一个最重要的原则(如今简单的称为Kerkhoffs原则)是这个:

加 密 方 法 一 定 不 能 要 求 保 密 , 而 且 它 必 须 有 能 力 , 在 被 敌 人 掌 握 后 , 不 造 成 任 何 的 不 便 。 加密方法一定不能要求保密,而且它必须有能力,在被敌人掌握后,不造成任何的不便。 便

换句话说,加密方案自身不应该被保密,只有密钥应该组成通信政党所共享秘密信息。

    Kerckhoffs的意思是,一个加密方案的设计应该仍是安全的,即便敌人知道方案的所有组成算法的细节,只要这个敌人不知道使用的密钥是什么。换种方式表述,Kerckhoffs原则要求:安全性只依赖于密钥的安全。但为什么是这样呢?

    有两个主要的论据支持Kerckhoffs原则。第一个是:维护一个短密钥的安全比维护一个算法的安全简单的多。共享一个密钥串(比如说,100-bit的)并秘密地存储它,比共享和保密一个数千倍大的程序要容易。此外,一个算法的细节可以泄露(或许被一个内鬼)或者被逆向工程师所学习;但是当秘密信息采取一种随机生成字符串的形式的时候,这不太可能。

​    第二个论据是:当密钥暴露的时候,对于老实的政党来说,更换一个密钥比替换所使用的算法要容易的多。事实上,频繁地更新密钥,即便在其尚未暴露之时,是很好的安全实践,相反,替换使用的软件将会更加繁琐。最后,在有许多对用户(比如在一个公司中)需要加密它们的通信的情况下,对所有组合而言,使用相同算法,不同密钥将明显比每个人都使用一种不同的程序更加轻松(这种情况下,还需要依据他们是在和谁通信)。

​    今天,Kerckhoffs原则被理解为,不仅提倡安全不应该依赖于所用算法的保密,而且要求这些算法被公开。这与“隐匿安全”的主张形成鲜明对比,后者认为,通过将加密算法隐藏于大众视野之外,可以实现更高的安全性。在公开算法说明的情况下,“开放加密设计”的一些优势包括:

  1. 公开的设计经受了公共审查,并因此可能更加强壮。多年的经验已经展示了构建好的加密方案是非常困难的。因此,在一个方案经历了广泛的研究并经受住了大量的攻击尝试后,我们对于其在安全方面的自信会更强。
  2. 安全漏洞被“道德骇客”揭露并公布,比仅仅被恶意组织了解要更好
  3. 如果系统安全依赖于算法的安全,那么对密码的逆向工程(或工业间谍造成的泄露)将会对安全构成严重威胁。这与不作为程序一部分的密钥相反,并因此不易受到逆向工程的影响。
  4. 公开设计使标准得以建立。

虽然可能听起来简单明了,开放密码设计的原则(比如Kerckhoffs原则)却被一次又一次的忽视,并付出了惨重的代价。我们强调,使用一个私有的算法(比如,某些公司秘密设计的非标准的算法)是非常危险的,只有被公开的尝试并测试过的算法应该被使用。幸运的是,有足够多的标准且没有专利权的好算法,因此无论如何,没有理由使用其他的。

​    我们也提一下Kerckhoffs概述的其他原则,其中一个说:一个系统必须是实际地,如果不是数学地,无法破解的。正如将要在随后看到的,现代密码学正基于这个模式,并且(除了完美保密加密方案,将在下一张介绍)所有现代加密方案在给定充足时间(比如数千年)的情况下,理论上都是可破解的。这样一来,这些方案在数学意义上是可破解的,但实际却无法实现。

攻击场景。总结我们对加密的通式讨论,并顺带一个针对加密方案的一些基本攻击类型的简要讨论(这些在下一节将会派上用场)。按严重程度排序,它们是:

  • 仅知密文攻击:这是最基础的攻击类型,指敌手仅仅观察密文并尝试确定被加密的明文的场景。
  • 已知明文攻击:这里,敌手掌握一或多对相同密钥加密的明文/密文对。敌手的目的是确定被加密的明文,以给出一些其他的密文(而并不知道对应的明文)
  • 选择明文攻击:在这种攻击中,敌手有能力对他选择的任何明文加密。之后尝试确定被加密的明文,来给出一些其他密文。
  • 选择密文攻击:最后一种攻击类型是,敌手甚至被赋予了获得解密他选择的任何密文的能力。敌手的目的是,又一次,确定被加密的明文以给出其他密文(这些密文的解密敌手不能直接获得)

注意前两种攻击类型是被动的,敌手仅仅接收一些密文(也可能有一些对应的明文),之后进行他们的攻击。相比之下,后两种攻击类型是主动的,敌手可以自适应地要求加密和/或解密其选择。

​    上面描述的前两种攻击类型显然是实际的。一个仅密文攻击是最容易在实践中进行的;敌手唯一需要做的事情是在加密信息被发送的公共信道上监听。在一个已知明文攻击中,假定敌手也通过某种方式在他观察的一些密文中获得了被加密的明文。通常来讲,这也是切实的,因为并非所有加密了的信息都是重要的,至少不是绝对的。作为一个尝试的例子,两个党派可能总是在他们开始通信时,加密一条“你好”信息。作为一种更复杂的例子,加密可能被用来季度性的保密收入结果直到它的发布日期。在这种情况下,任何监听并获得密文的人将在随后获得对应的明文。任何合理的加密方案因此必须在敌手能够实施已知明文攻击时保持安全。

​    后两种主动攻击看起来可能有些奇怪,需要解释一下(什么时候通信方会跟据敌手的希望加密和解密任何东西呢?)。我们暂缓对这些攻击的更细节的讨论,直到书中形式化定义了针对这类攻击的安全性的地方:选择明文攻击在Section 3.5,选择密文攻击在Section 3.7。

​    我们注意到不同设定针对不同攻击类型可能需要弹性,并由此得出结论。并不总是那种针对“最强大”攻击类型的安全加密方案应被使用,特别是因为它可能比一个针对“弱一些”攻击类型的安全加密方案低效;后者也许更受欢迎,如果它对于手头的应用来说是足够的。

1.3 历史密码和相关密码分析

    在我们有关“古典密码学”的研究中,我们将会测试一些历史密码并证明他们是完全不安全的。如前所述,我们展示这些材料的主要目的是(a)突出以一种特定方式加密的脆弱性,并由此推出将在后续章节讨论的现代,严格的方法,(b)表明试图以“简单方法”达到安全加密是不可能成功的,以及这样的原因。一路上,我们将展示一些能够从这些历史加密方案的脆弱性中学到的密码学重要原则。

​    在这一节(且仅在这一节),使用小写字母书写明文字符,并且密文字符是大写的。当描述对方案的攻击时,我们总是应用Kerckhoffs原则并假定敌手了解加密方案(但并不知道使用的密钥)。

凯撒密码(Caesar’s cipher)。记载的最古老的密码之一,被称为凯撒密码,在“De Vita Caesarum, Divus Iulius”(凯撒大帝的生活,戴德-朱利安)中记载,约为公元110年:

	这也是他给西塞罗的信件,也是他在隐私事务上的暗语,并且之后,如果他要说任何重要的事情,他
都用密文书写,这是说,通过变换字母在字母表中的顺序,这样就一个单词也认不出来了。如果任何人想
要解密,明白他们的意思,他必须将字母表中的第四个字母,即D,替换为A,对于其他字母也这样做。

就是说,朱利安凯撒通过将字母表中的字母旋转3位来加密:a用D替代,b用E代替,如此类推。当然,在字母表的最后,字母循环替代,x就被替换为A,y为B,z为C。举个例子,这条短消息"begin the attack now",通过移位变换,将被加密为:
E H J Q W K H D W W D F N Q R Z EHJQWKHDWWDFNQRZ EHJQWKHDWWDFNQRZ
这让它难以理解。

    使用他这种加密的一个亟待解决的问题是:加密方法是固定的。因此,任何掌握凯撒如何加密他的信息的人将有能力不费吹灰之力地解密。也可以看出,如果一个人将凯撒密码代入先前描述的加密语法中:密钥生成算法毫不重要(相当于什么也没干),并且根本没有密钥可言。

​    有趣的是,此算法的一个叫作ROT-13的变种(移位数变成了13而不是3)在不同的线上论坛中被广泛使用。显而易见,这种方案没有提供任何的密码学安全,并且ROT-13仅仅用于确保文本(比如,电影剧透)是难以理解的,除非这条信息的读者有意识地选择解密它。

移位密码和充分密钥空间原则。卡萨密码来自于总是以相同的方式加密,且没有密钥的事实。移位加密和凯撒密码类似,但是引入了密钥。特别的,移位密码以这样的方式使用:密钥是一个 0 − 25 0 - 25 025之间的数;加密时,字母旋转(像凯撒密码那样) k k k个位置。将这种加密映射到前面描述的加密语法之中,这意味着 G e n Gen Gen算法从集合 { 0 , … , 25 } \{0,\dots,25\} { 0,,25}中输出一个随机值 k k k E n c Enc Enc算法使用密钥 k k k和一个使用英文字母书写的明文并将明文中的每个字母向前移动 k k k个位置(由z到a循环); D e c Dec Dec算法使用密钥 k k k和用英文字母书写的密文,并将密文的每个字母向后移动 k k k个位置(这一次由a向z循环)。明文空间 M M M被定为所有由英文字母表中的字符构成的有限字符串(注意数字,标点,或者其他字符在这个方案中是不允许的)。

    对于这种方法的一个更加数学化的描述可以通过将字母表视为数字 0 , … , 25 0,\dots,25 0,,25(而不是英文字符)获得。首先,一些记号:如果 a a a是一个整数并且 N N N是一个大于1整数,我们定义 [ a m o d N ] [a\quad mod \quad N] [amodN] a a a除以 N N N的余数。注意 [ a m o d N ] [a \quad mod \quad N] [amodN]是一个包含在 0 0 0 N − 1 N-1 N1之间的整数。我们称将 a a a映射为 [ a   m o d N ] [a \quad \ mod \quad N] [a modN]的过程为规约模数 N N N;关于规约模数 N N N,我们有更多要说的,从第七章开始。

    使用这种记号,使用密钥 k k k对明文字符 m i m_i mi的加密产生了密文字符 [ ( m i + k ) m o d 26 ] [(m_i + k)\quad mod \quad 26] [(mi+k)mod26],对密文字符 c i c_i ci的解密定义为 [ ( c i − k ) m o d 26 ] [(c_i - k) \quad mod \quad 26] [(cik)mod26]。在这种观点中,明文空间 M M M被定义为任何在 { 0 , … , 25 } \{0,\dots,25\} { 0,,25}范围内的有限的整数串。

​    移位密码安全吗?在继续阅读之前,尝试解密一下使用移位密码和密钥 k k k(我们不会透露其值)加密的信息:
O V D T H U F W V Z Z P I S L R L F Z H Y L A O L Y L OVDTHUFWVZZPISLRLFZHYLAOLYL OVDTHUFWVZZPISLRLFZHYLAOLYL
在不知道 k k k的情况下,破解密文可能吗?事实上,这是小事一桩!原因在于仅有26个可能的密钥。这样,尝试每个密钥是很容易的,观察哪个密钥将密文解密称“有意义”的明文。这样的对于一种加密方案的攻击被称为暴力破解穷举搜索。显然,对于这种暴力攻击,任何加密方案必须不能是脆弱的。否则,它完全可以被破解,不管加密算法多么复杂。这为我们带来一条简单的,但是重要的原则,叫作:“充足的密钥空间原则”:
任 何 安 全 加 密 方 案 必 须 有 一 个 对 于 穷 举 搜 索 来 说 并 不 脆 弱 的 密 钥 空 间 。 任何安全加密方案必须有一个对于穷举搜索来说并不脆弱的密钥空间。
在当今时代,穷举搜索可能使用非常强大的计算机,或者遍布全球的数千台计算机。因此,可能的密钥数量必须非常大(至少为 2 60 2^{60} 260 2 70 2^{70} 270)。

​    我们强调上述原则给出了一个关于安全的必要条件,但这还不够。事实上,我们将在接下来看到一个具有非常大密钥空间的加密方案仍旧可能不安全。

Mono-alphabetic substitution。移位密码将明文的每个字符映射为一个不同的密文字符,但是每次映射总是使用相同的移位数(由密钥决定的值)。莫罗单表替换密码的想法是:通过一种随意的方式,映射每个明文字符为不同的字符,仅仅遵从为了能够解密,映射必须一对一的事实。因此密钥空间由所有字母表的排列组成,意味着密钥空间的大小是 26 ! 26! 26!(大约是 2 88 2^{88} 288),如果我们在英语字母表中使用。作为一个例子,密钥

在这里插入图片描述

a a a映射为 X X X,诸如此类,将把信息"tellhimaboutme" 加密为"GDOOKVCXEFLGCD"。针对这种加密在这个密钥空间上的暴力攻击将会花费比一生还长的时间,即便使用当今已知的最强大的计算机。然而,这还不足够意味着这个加密是安全的。事实上,我们现在将展示,破解这个方案是很容易的,即使它拥有一个非常大的密钥空间。

​    假设被加密的是英文文本(即,文本是语法正确的英语文章,不仅仅是用英文字母书写的)。那通过利用英语的统计模式(当然,这个攻击对其他任何语言也一样)攻击莫罗单表替换加密就是可能的了。在攻击中使用的针对这种加密的两个属性是:

  1. 在这种加密中,每个字母的映射是固定的,也就是说,如果 e e e被映射为 D D D,那么明文中出现的每一个 e e e都将造成 D D D在密文中的出现。
  2. 英语(或任何语言)中单个字母概率分布是可知的。这就是说,不同英文字母的平均频率计数对于不同文本来说基本没什么不同。当然,越长的文本,频率数值数将越接近平均值。然而,即便是相对短的文本(仅由10个单词组成)也具有“足够接近”平均值的概率分布。

这个攻击通过制作密文概率分布表并将其和已知的英文文章(看插图)中的字母概率分布比较来工作。攻击中制作的概率分布表就是简单的每个字母在密文中出现的频率计数(即,一张说明A出现4次,B出现11次的等的表格)。然后,我们根据这些频率计数,做一个最初的由该密钥定义的映射的猜测。特别的,因为e是英语中出现频率最高的字母,我们将猜测密文中出现最频繁的字母指的就是明文中的字符e,诸如此类。除非密文足够长,否则一些猜测很可能是错误的。然而,即便对于非常短的密文,这些猜测也足够使我们较快的解密(特别是使用英语知识,比如在t和e之间,h很可能出现,以及u总跟着q事实)。

在这里插入图片描述

​    事实上,莫罗单表替换密码可以被很快破解不应令人非常惊讶,因为基于此加密的谜题出现在了报纸上(并且在早茶之前就被一些人破解了)!。我们建议你尝试解密以下信息 - 这将有助于向你证明进行这种攻击是多么的简单(当然,你应该利用插图的帮助):

在这里插入图片描述

​    总结来说,虽然莫罗单表替换密码有一个巨大的密钥空间,它也完全不安全。这是给我们上的另一堂重要的课。换句话说,即便一个巨大的密钥空间对于任何安全加密都是必须的,但仍离足够的安全非常遥远。

一个对移位密码的改进攻击。我们可以使用字符频率表来给出一个改进的针对移位密码的攻击。特别是,我们之前对于移位密码的攻击需要我们使用所有可能的密钥解密密文,之后检查哪个密钥产生了一个“有意义”的明文。这种方式的一个缺点是,实现自动化是非常困难的,因为对于计算机来说,检查明文是否“有意义”很困难(我们没有宣称这是不可能的,因为通过使用一个有效英文单词字典,这当然可以完成。我们只是说这并不简单)。此外,可能会有这些情况 - 我们将在下面看到其中一种 - 明文字符是依据英语文本分布的,但明文自身并不是一段有效的英语文章。

​    像之前那样,将英文字母表和数字0到25联系起来。记 p i p_i pi,对任意 0 ≤ i ≤ 25 0\le i\le 25 0i25,为第 i i i个字母在普通英文文本中的概率。一个使用已知 p i p_i pi值的简单的计算给出
∑ i = 0 25 p i 2 ≈ 0.065 ( 1.1 ) \sum_{i=0}^{25}p_i^2 \approx 0.065\quad(1.1) i=025pi20.065(1.1)
现在,我们被给定了一些密文,并记 q i q_i qi为密文中第 i i i个字母出现的概率( q i q_i qi就是简单的第 i i i个字母出现次数除以密文长度)。如果密钥是 k k k,那么我们预计对于每一个 i i i来说 q i + k q_{i+k} qi+k应该大致等于 p i p_i pi(我们使用 i + k i + k i+k代替更琐碎的 [ i + k m o d    26 ] [i + k \mod 26] [i+kmod26])。等价于,如果我们计算
I j = def ∑ i = 0 25 p i ∗ q i + j I_j \overset{\text{def}}{=} \sum_{i=0}^{25}p_i * q_{i+j} Ij=defi=025piqi+j
j ∈ 0 , … , 25 j \in {0, \dots, 25} j0,,25的每一取值,接着我们预计可以找到 I k ≈ 0.065 I_k \approx 0.065 Ik0.065,这个 k k k就又是实际上使用的密钥了。这导致了一个易于实现自动化的密钥发现攻击:对所有的 j j j计算 I j I_j Ij,之后输出 I k I_k Ik接近 0.065 0.065 0.065 k k k值。

Vigenere(多表置换)密码。我们已经描述过,针对莫罗单表替换密码的统计学攻击因为每个字母的映射是固定的而得以实施。因此,这类攻击可以通过,对相同明文字符的不同实例,映射不同密文字符,来防止。这产生了“抹平”密文中字符概率分布的效果。举例来说,注意这种情形: e e e有时被映射为 G G G,有时是 P P P,有时是 Y Y Y。这样,密文中的字符 G , P , Y G, P,Y G,P,Y将几乎不可能因更多的出现频率而突出,因为其也将映射到那些出现频率较少的字符上。因此,计算字符频率将不会提供关于映射的更多信息。

    Vigenere密码通过应用多表依次替换加密来工作。这是说,一个短的,保密单词被选作密钥,之后明文通过,“增加”明文中的每个字符,密钥中下一个字符个字符(就像在移位密码中那样),加密,当需要时循环使用密钥。作为一个例子,信息"tellhimaboutme"使用密钥"cafe"加密将会像下面这样工作:

在这里插入图片描述

(注意密钥不需要是一个实际的英文单词。) 恰好,加密第一个、第五个、第九个等字符使用移位密码且密钥 k = 3 k = 3 k=3,第二个、第六个、第十个等字符使用密钥 k = 1 k = 1 k=1,第三个、第七个等字符使用 k = 6 k = 6 k=6,第四个、第八个等字符使用 k = 5 k = 5 k=5。因此,这是一种使用不同密钥的循环移位密码。注意在上面的例子中 l l l一次被映射为 R R R,另一次映射为 Q Q Q。此外,密文字符 F F F有时来自于 e e e,有时来自于 a a a。因此,密文中这些字符的频率被“抹平”了,如预期的那样。

如果密钥是一个足够长的单词(随机选择),那么,攻击这种密码看起来是一项艰巨的任务。确实,它被许多人视为是一种不可能破解的加密,并且虽然它在16世纪被发明,针对这种方案的系统攻击只是在数百年之后才被设计出来。

破解Vigenere密码。攻击Vigenere密码的首要观察是,如果密钥长度已知,那这项任务相对简单。特别是,假定密钥的长度是 t t t(有时称为周期)。那么密文可以被分为 t t t部分,每一部分可以被视作一个移位密码的实例。也就是,令 k = k 1 , … , k t k = k_1, \dots, k_t k=k1,,kt作为密钥(每一个 k i k_i ki是一个字母),令 c 1 , c 2 , … c_1, c_2, \dots c1,c2,作为密文。那么,对于每一个 j ( 1 ≤ j ≤ t ) j(1 \le j \le t) j(1jt)我们知道如下集合
c j , c j + t , c j + 2 t , … c_{j}, c_{j+t}, c_{j+2t}, \dots cj,cj+t,cj+2t,
全部是使用密钥 k j k_j kj同过移位加密的。因此所剩的工作就是,对每一个 j j j,检查26个可能的密钥中,哪一个是正确的。这并不像移位密码的情况那样简单,因为通过猜测密钥的一个单一的字母,不可能确定其解密结果是否“有意义”。此外,检查所有可能的密钥将需要穷举搜索 2 6 t 26^t 26t个可能的不同密钥(这对于大于15的 t t t来说就是不可行的)。尽管如此,我们仍可以使用前面描述的统计学攻击方式。也就是说,对于每一个关于给定密钥的密文字符集合(也就是一个给定的 j j j值),构建字符频率表并检查26个可能的移位次数中,哪一个给出了“正确的概率分布,是可能的。因为这可以分别对每个密钥( k i k_i ki)实施,攻击可以被很快的实行;现在唯一所需的就是构建 t t t个频率表(一个字符的子集一个)并将他们与真实的概率分布比较。

​    一种可选的,某种层面上更容易地方法,是使用之前展示的改进的攻击移位密码的方法。回想这种改进的攻击不依赖检查明文是否是“有意义”的,仅仅依赖明文中字符的基本概率分布

​    当已知密钥长度时,以上任何一种方法都可以实现成功的攻击。还需说明如何确定密钥的长度。

​    一个方法是使用Kasiski方法解决这个问题(这种攻击在19世纪中叶被发表)。这个攻击的第一步是识别密文中长度为2或3的重复模式。由于某些二元或三元组在英语中频繁出现,这些很可能找到。举例来说,关注单词"the",在英文文本中非常频繁的出现。显然,"the"将被映射为不同的密文字符,取决于它在文本中的位置。然而,如果它在相同的相对位置出现两次,那么它将被映射为相同的密文字符。这就是说,如果它出现在位置 t + j t + j t+j 2 t + i 2t + i 2t+i( i ≠ j i \ne j i=j),那么它将被映射为不同字符。然而,如果它出现在位置 t + j t + j t+j 2 t + j 2t + j 2t+j,那么它将被映射为相同的密文字符。在一个足够长的文本中,"the"被重复地映射为相同密文有很大可能。

    考虑以下具体的例子,使用密钥"beads"​(为了清楚起见,空格已被添加):

在这里插入图片描述

注意单词 t h e the the有时被映射为 W M F WMF WMF,有时 M J J MJJ MJJ,有时为 Y I S YIS YIS。然而,它两次被映射为 M J J MJJ MJJ,并且,在一个足够长的文本中,每个可能的映射都很可能被映射多次。Kasiski主要的发现是,像这样的多次出现之间的距离(除了一些巧合)应该是周期长度的倍数。在上面的例子中,周期长度是5,并且 M J J MJJ MJJ的两次出现之间的距离是40(周期长度的8倍)。因此,所有重复串之间距离的最大公约数应该就是周期的长度 t t t

    一种可选的方法称为重合指数法,是一种更算法的,且因此更容易自动化的方法。回顾,如果密钥长度是 t t t,那么密文

c 1 , c 1 + t , c 1 + 2 t , … c_1, c_{1+t}, c_{1+2t}, \dots c1,c1+t,c1+2t,
被使用相同的移位数加密。这意味着这个序列中的字符频率预计和标准英文文本中的字符频率相同,只是有一些偏移。更细节地说,令 q i q_i qi记为第 i i i个英文字母在上述序列中的频率(再次说明,就是简单的第 i i i个字母的出现次数除以序列中字母的总数)。如果此处使用的位移是 k 1 k_1 k1(就是密钥的第一个字符),那么我们预计 q i + k 1 q_{i+k_1} qi+k1应该几乎和 p i p_i pi相同,对于所有的 i i i来说,这里的 p i p_i pi仍是第 i i i个字母在标准英文文本中的频率。但是,这意味着序列 p 0 , … , p 25 p_0, \dots, p_{25} p0,,p25就是序列 q 0 , … , q 25 q_0, \dots, q_{25} q0,,q25移动了 k 1 k_1 k1个位置的结果。结论是,我们预计 ∑ i = 0 25 q i 2 \sum_{i=0}^{25}q_i^2 i=025qi2应该几乎等于(观察等式(1.1)) ∑ i = 0 25 p i 2 ≈ 0.065 \sum_{i=0}^{25}p_i^2 \approx 0.065 i=025pi20.065

    这引出了一个确定密钥长度 t t t的非常好的方法。对于 τ = 1 , 2 , … \tau = 1, 2,\dots τ=1,2,,观察密文字符序列 c 1 , c 1 + τ , c 1 + 2 τ , … c_1, c_{1+\tau}, c_{1+2\tau}, \dots c1,c1+τ,c1+2τ,和由这个序列制作的表 q 0 , … , q 25 q_0, \dots, q_{25} q0,,q25,计算
I τ = d e f ∑ i = 0 25 q i 2 I_{\tau} \overset{def}{=} \sum_{i=0}^{25}q_i^2 Iτ=defi=025qi2
τ = t \tau = t τ=t时,我们预计能够得到像上面讨论的 I τ ≈ 0.065 I_{\tau} \approx 0.065 Iτ0.065。反过来说,对于 τ ≠ t \tau \ne t τ=t,我们预计(大致来说),所有字符将大致以相似的频率出现在序列 c 1 , c 1 + τ , c 1 + 2 τ , … c_1, c_{1+\tau}, c_{1+2\tau}, \dots c1,c1+τ,c1+2τ,中,并且我们预计 q i ≈ 1 / 26 q_i \approx 1/26 qi1/26,对于所有 i i i。在这种情况下,我们将得到
I τ ≈ ∑ i = 0 25 1 26 ≈ 0.038 I_{\tau} \approx \sum_{i=0}^{25}\frac{1}{26} \approx 0.038 Iτi=0252610.038
这与0.065已经足够不同了,对于运行这个技术来说。

密文长度和密码分析攻击。注意以上对于Vigenere密码的攻击相比于之前的,需要一个很长的密文文本。比如,需要一个很大的密文文本用来确定周期,如果使用Kasiski的方法。此外,对 t t t个不同的密文部分,统计分析也是需要的,并且信息的频率表收敛至平均值,随着长度的增长(并且因此密文需要大约 t t t倍长于破解莫罗单表替换的情况)。类似的,我们使用的针对莫罗单表替换的攻击也需要一段很长的密文,相比于移位密码来说(仅仅需要一个单独的单词就可以实现)。这种现象不是巧合,在我们在下一章学习完美保密后,其原因将变得更加明显。

唯密文攻击 VS 已知明文攻击。上面描述的这种攻击都是唯密文攻击(回顾,这是最容易在实践中实施的攻击类型)。一个重要的发现是,所有上述密文都是很容易破解的,当敌手能够运行一个已知明文攻击。我们将这个过程留作练习。

结论和讨论。我们只是介绍了几个历史上的加密方案,除了它们共有的历史趣味性,我们展示它们的目的是学习一些重要的关于加密设计的经验教训。简单表述,这些经验是:

  1. 充足密钥空间原则:假设足够长的信息被加密了,在一个合理的时间之内,一个安全的加密方案必须具有一个不能被穷举搜索的密钥空间。然而,一个大的密钥空间并不意味着安全(比如,莫罗单表替换密码有一个非常大的密钥空间,但是却很容易破解)。因此,一个大的密钥空间是一个必要条件,但不是充分条件。
  2. 设计安全加密是一项艰巨的任务:Vigenere密码在很长一段时间内没有被破解,部分是由于它被认定的复杂性(本质上是将一系列数字组合在一起)。当然,更复杂的方案也被使用了,像德国Enigma。尽管如此,这种复杂性也不意味着安全,并且所有这些历史加密方案都是可以被完全破解的。通常,设计一个安全加密方案是困难的,这样的设计应该被留给专家。

古典加密方案的历史令人着迷,无论是在其使用的方法上面,还是其在密码学和密码分析方面对世界历史(比如第二次世界大战)的影响。这里,我们仅仅尝试给出了一些更加基础的方法,我们的重点是现代密码学可以从中学到什么。

1.4 现代密码学的基本原则

​    本书中,我们强调现代密码学的科学性。在这一节中我们将列出区别现代密码学,和,在之前章节中我们学习的古典密码学,的主要原则和规范。我们确定了三条主要原则:

  1. 原则1 - 处理任何加密问题的第一步是一个严格、精确的对安全的形式化定义。
  2. 原则2 - 当一个加密结构的安全性依赖于一个未被证明的假设时,假设必须被精确陈述。此外,假设应该尽可能少。
  3. 原则3 - 加密结构应该结合一个,关于在原则1中的形式化定义,和在原则2中所陈述的假设(如果需要假设),的严格的安全性证明。

现在我们更深度的讨论这些原则。

1.4.1 原则1 - 精确定义的制定

​    现代密码学最重要的智力贡献之一是意识到,形式化定义安全,是设计,使用,研究任何加密原理和协议的重要的前提条件。让我们依次解释这些:

  1. 对设计的重要性:我们对构建一个安全加密方案很感兴趣。如果我们没有一个对于我们想要达成的是什么的坚定的理解,我们如何能够知道是否(或何时)能够实现它呢?在脑海中有一个定义,使我们能够评估我们构建的东西的质量,并且引领我们建造正确的东西。特别是,首先定义需要什么,再开始设计阶段更好,而不是在完成了设计之后再想出一个我们实现了什么的定义。后者经受这样的风险:在设计者没有耐心时(而不是达成目标)时就终止设计,或者得到一个实现了比所需更多的,并因此可能比一个更好的方案低效的结构。
  2. 对使用的重要性:假定我们想要在一个大系统中使用一种加密方案。我们如何知道使用哪一种呢?如果给出一种加密方案,我们如何论述它是否满足我们的应用?有了一个某个加密方案所达到的安全的精确定义,(附带一个基于在原则2和3中讨论的形式化陈述的假设的安全证明),这使我们得以回答上述问题。特别是,我们能够定义我们在系统中需要(看上面的第一点)的安全,之后验证一个给定的加密方案所满足的定义对我们的目的来说是否足够。此外,我们可以提出我们需要加密方案所满足的定义,进而寻找满足这个定义的加密方案。注意,选择“最安全”的方案可能并不明智,因为一个稍弱的安全可能对于我们的应用来说就足够了,并且后者提供了更好的效率。
  3. 对研究的重要性:给出两种加密方案,我们如何比较它们?没有安全的定义,唯一可比的是效率;但是单看效率高低是一个劣质的标准,因为一个高效但完全不安全的方案是没有用处的。方案对其所达到的安全等级的精确说明提供了另外的比较点。如果两个方案的效率是一样的,但是前一个相比后一个,满足更强的安全定义,那么前一个就是更好的。另外,有关安全和效率可能需要一个平衡(看之前的两点),但是至少通过精确的定义,我们能够明白这种取舍的意义。

也许最重要的是,精确定义使严格证明(我们将在原则3中讨论)成为可能,但上述原因与此无关。

​    因为“我们有一个直观的,安全意味着什么的想法”,而认为形式化定义是不必要的,这是错误的,而且,将这种直观转换为一个形式化定义并不困难。一方面,两个人可能各自有一个对于安全是什么的不同认识。即使是一个人也可能有多个关于此的直观想法,取决于具体情形。(在第三章我们将研究四种不同的私钥加密的安全定义,每一个在不同的情形中都是有用的)。最后,通常来说结果是,将直觉转变为一个“好”的定义并不简单。举个例子,当需要加密时,我们知道我们想要加密方案有这种效力:只有那些知道密钥的人能够读懂加密后的信息。但你会如何形式化这个东西?读者可能想要停下来并在继续阅读前好好思考一下这个问题。

​    事实上,我们已经问了学生很多次,应该如何定义安全加密,并收到了以下回答(通常按以下顺序排列):

  1. 答案1 - 一个加密方案是安全的, 如果没有敌手能发现密钥,当给定一份密文时。像这样的一个加密定义完美错过了要点。加密的目的是保护被加密的信息,而密钥只是达到目的的方法。考虑一种忽视密钥而仅仅输出明文的加密方案,这能把这种想法带到荒唐可笑的程度。显然,这样的话,就没有敌手可以找到密钥了。然而,显然,这也不能够提供任何的秘密性。

  2. 答案2 - -一个加密方案时安全的,如果没有敌手能够找到对应于密文的明文。这个定义看起来已经好多了,并且甚至能够在一些密码学的材料中找到类似的。然而,在经过一些思考后,它与令人满意之间还有很大的距离。比如,一个显示90%明文的加密方案,在这种定义下仍将被视为是安全的,只要得到剩余的10%是困难的。但是这显然对于大多数一般的加密应用来说不可接受。比如,雇佣合同几乎是标准的文本,并且只有薪水可能需要保密;如果薪水在哪90%被揭示的明文中,那么加密就什么也没有获得。

    如果你觉得上面的反例很愚蠢,参见脚注5。(你可能会说“你举的例子不是我的意思”,很好,这就是关键之处:形式化一个人的意图总是没那么容易)

  1. 答案3 - 一个加密方案是安全的,如果没有敌手能够找到任何对应密文的明文。这已经看起来很像一个优秀的定义了。然而,其他微妙之处将会出现。回到雇佣合同的例子上,确定真实的薪水也许是不可能的。然而,当以某种可能的方式获得了加密的薪水大于或者小于十万美元一年时,加密方案应该被视为安全的吗?显然不能,这导致了下一个意见。

  2. 答案4 - 一个加密方案是安全的,如果没有敌手可以从密文获得关于明文的任何有意义的信息。这已经很接近实际的定义了。然而,它仍缺少一个方面:它没有定义“有意义”的信息代表什么。不同的信息可能在不同的应用中是有意义的。这导致了加密原理中一个关于安全定义的非常重要的原则:安全的定义对于所有潜在的应用都应该是充分的。这是重要的因为一个人永远不会知道将来可能出现什么应用。此外,方案实现通常成为通用密码库的一部分,在不同的场景中、为许多不同的应用使用。理想情况下,应该保证所有可能使用者的安全。

  3. 最终答案 - 一个加密方案是安全的,如果没有敌手能够从密文中计算任何关于明文的函数。这提供了一个非常强的保证,并且,当正确的形式化后,如今被视为对于加密安全的“正确”定义。

当然,即使我们现在找到了安全加密的正确要求,从概念上讲,仍需要数学化的、形式化的陈述这种要求,并且,这本身就是一项非容易的任务(我们将在第2、3章中更详细的讨论)。

    此外,我们的形式化定义也必须明确攻击模式;比如,我们假定一个仅密文攻击还是选择明文攻击。这说明了形式化加密定义时使用的另一个通用的原则。特别是,为了完全定义一些加密任务的安全,有两个不同的问题必须被明确的论述。首先是什么被视为“破解”,其次是对敌手的能力假设是什么。关于破解,这就是我们在上面讨论的;比如,一个加密方案视为被破解了,如果敌手从密文中获得了一些关于明文的函数。敌手的能力涉及到对敌手有能力实施的行动的假设,也包括敌手的计算能力。前者指向这些考虑:敌手是否被假定只有能力监听加密信息(如仅密文攻击),或者是否假定敌手也能主动的请求加密任何它喜欢的明文(如选择明文攻击)。第二个必须关注的问题是敌手的计算能力。对于本书的所有部分,(除了第二章,我们将试图,对于任何高效的敌手,都确保安全),我们的意思是任何敌手的攻击运行在多项式时间内(这一点的完整讨论出现在3.1.2节)。当将这些转换到具体的条件时,我们也许需要,对于任何利用超级计算机进行数十年计算的敌手的安全。

    作为总结,任何安全定义将使用以下通用形式:

一 个 加 密 方 案 , 对 于 一 个 给 定 任 务 , 是 安 全 的 , 如 果 没 有 具 有 指 定 能 力 的 敌 手 可 以 实 现 一 个 指 定 的 破 解 。 一个加密方案,对于一个给定任务,是安全的,如果没有具有指定能力的敌手可以实现一个指定的破解。

    我们强调,定义从未假设任何关于敌手的策略。这是一个重要的区别:我们希望假设敌手的能力是什么(如,有能力实施一个选择明文攻击而不能进行选择密文攻击),但是我们不希望假定任何有关于它“如何”使用它的能力。我们将其称为“任意敌手原则”:安全必须保证,对于任何属于拥有指定能力的敌手类中的敌手的安全。这个原则很重要因为预见敌手在一次攻击中可能使用什么策略是不可能的(且历史已经证明这样的尝试注定失败)。

数学和真实世界。一个需要注意的重要问题是,安全的定义本质上意味着提供一个现实世界问题的数学形式。如果这个数学定义没有适当地刻画真实世界,那么这个定义可能是毫无意义的。比如,如果敌手的能力定的太弱了(且现实中的敌手有更强的能力),或者破解是这样的:允许不可预见(如同关于加密的最早的回答之一)的真实攻击,那么,就没有获得“真正的安全”,即便使用了一个“数学安全”的结构。简短的说,一个安全的定义必须精确的刻画真实世界的安全需求,以便实现其对于安全的数学承诺。

    这样的例子时刻在实际中发生。作为一个例子,一个已经被证明安全的(相对于一些我们在上面讨论过的定义)加密方案也许在一个智能卡上被实现。敌手也就可能监视智能卡的电源使用(比如,电量使用随时间如何变化),并使用这个信息确定密钥。这种情况下,在安全定义或者证明该方案满足安全定义上没有任何问题;问题仅仅在于,定义没有精确刻画该方案在现实世界的智能卡上的实现。

​    这不应被用来说明该定义(或证明,对于这个问题)没有用。定义 - 并且该方案满足它 - 也许对于其他设置仍是合适的,比如,当加密在一个电量不能被监视的终端主机上运行时。此外,一种在智能卡上实现安全加密的方式将会进一步刷新定义,因此它将电量分析计算在内。而且,也许对电源分析的硬件反制技术可被发展,使得原始的定义(以及原始的方案)能够适合智能卡。重点是:凭借一个定义,你至少知道你依赖什么,即便定义中没有精确的刻画使用方案的某种特殊的设定,但,没有定义的话我们甚至不清楚哪里出现了问题。

    数学模型和它应该刻画的现实失联的可能性对密码学来说并不特别,而是贯穿整个科学的东西。从计算机科学中举另一个例子,考虑一个数学证明的意义,证明存在完善定义,而计算机无法解决的的问题。一方面,这样的证明很有趣。然而,出现的首要问题是“什么是计算机?”特别是,一个数学证明只能在有一些关于什么是计算机的数学定义(更准确的说,计算的过程是什么)下被提供。问题是,计算是一个现实过程,有许多不同的计算方式。为了我们能够真正证明“不可解决的问题”真的是不可解决的,我们必须证明,我们对计算的数学定义抓准了现实世界的计算过程。我们如何知道这何时发生呢?

​    这种继承困难被艾伦图灵注意到,其研究计算机能解决以及不能解决哪些问题。我们引用自他最初的论文(方括号中的文本替换了原始的,以便于阅读):

还没有人尝试证实【那些我们已经证明可以被计算机解决的问题】,明确包括【那些本质上被认为是可计算的问题】。所有能够给出的论据从根本上说,必然是,凭借直觉,正因如此,无法令人在数学上满意。问题的关键在于“什么是在计算中可以被实施的可能的过程?”

我应该使用的论据有三种:

(a) 一个直观的直觉

(b) 一个关于两种定义的等价性证明

(c) 给出一大类【对于一个给定的可计算定义,可以被解决的问题】的例子

某种意义上,图灵面对和我们同样的问题。他开发了一个可计算的数学模型,但是需要以某种方式确定它是好的模型。同样的,在密码学中,我们能够定义安全,并需要事实证明这可以应用在现实世界中。与图灵一样,我们使用以下工具确顶这样的事实:

  1. 直觉:考虑一个安全的新定义首先使用的工具是:看它是否满足我们直观上预计的安全的属性。这是最低的要求,因为(在我们关于加密的讨论中已经看到)我们的直觉通常导致一个过于弱的安全概念。
  2. 等价证明:经常是这种情形:一个新的安全定义通过证明其和之前的、更熟悉的、或者更直观的吸引人的定义等价(或更强)来判定。
  3. 举例:使一个安全定义的充足性被确信的一个有效途经是:证明该定义涵盖了我们所熟悉的不同的真实攻击。

除上述之外,也许是最重要的,我们依靠测试时间和这样的事实:随着时间的推移,研究者和从业这的审查以及调查都会证明一个定义的合理性。

1.4.2 原则2 - 依靠精确假设

    大多现代密码学结构不能被证明无条件安全。这是由于这样的事实:它们的存在依赖于那些看起来远不可能被解答的计算复杂性理论方面的问题。这种不幸状态的结果是,安全通常依靠一些假设。现代密码学的第二个原则陈述了假设必须被精确表述。对此有两个主要原因:

  1. 对假设的验证: 从本质上说,假设是还未证明但猜测为真的表述。为了加强这种推测,有必要研究这些假设。基本的理解是:假设看起来越不可能被成功否定,我们就有更多信心相信假设是正确的。此外,对于假设的研究,还能通过展示它被一些其他的广泛相信的假设所引用,提供有关其效力的积极证据。

    如果依赖的假设没有被精确的陈述和表示。就不能被研究和(可能)推翻。因此,一个增强我们对于一个假设的信心的前提条件是对我们的假设是什么的精确陈述。

  1. 比较方案:通常在密码学中,我们可能被展示两个方案,它们都被证明满足一些定义,但是具有不同的假设。假定两种方案在效率上相同,更推荐哪一个方案呢?如果一个方案基于的假设弱于第二个(比如,第二个假设暗含了第一个的),那么将更推荐第一个,因为可能当第二个假设是错误的时候,它仍能保持为真。如果两个方案使用的假设不可比较,那么通用的法则是,所基于的假设被更好研究过的(原因是在以前的段落中被高亮的部分)那个方案更加推荐。

  2. 利于安全证明:如前所述,并且在原则3中将被进一步讨论,现代密码学结构与其安全性证明是一起被展示的。如果方案的安全性不能被无条件证明而必须依赖一些假设,那么一个数学证明,证明“如果假设为真,那么该结构就是安全的”,仅在对于假设有精确陈述的情况下能够提供。

    一个观察是:仅仅假设一个结构自身是安全的总是可能的。如果安全被完善定义了,这也是一个精确的假设(而且对于该结构来说,证明安全性也是小菜一碟)!当然,这在密码学(大多数部分)中,因为一些原因,不可能被实际接受。首先,像上面提到的,更推荐一个已经被测试数年的假设,相比于一个新的,引进仅仅为了证明一个结构的安全性的假设。第二,我们都更喜欢容易表述的假设,因为这样的假设容易研究和推翻。因此,举个例子,一个一些数学问题很难解决类型的假设比一个满足复杂(很可能不自然)安全定义加密方案的假设更容易研究和工作。当一个简单的假设被详细的研究之后,仍不能推翻它,我们对于其是正确的就更有信心。另一个依靠“更低级”假设(而不是仅仅假设方案是安全的)的优势是,这些低级假设通常可以在一些结构中被共享。如果一个指定的假设实例被证明是错误的,它可以在更高级的结构中被该假设的其他实例替换。(低级的假设更灵活)

    以上的方法论在本书中贯穿使用。比如,第3、4章展示了如何实现安全通信(通过一些方法),假定一个原理,一种称为“伪随机函数”的存在。在这些章节中,不会讨论任何有关这些原理如何构建的内容。在第五章将会展示在应用中,伪随机函数如何构建,并在第六章展示为随机函数甚至可以从更低级的元素中构建。

1.4.3 原则三 - 安全的严格证明

​    上述讨论的前两个原则自然的引导至现在这一个。现代密码学强调对于备选方案严格证明的重要性。使用精确定义和精确假设的事实意味着这样一个严格的安全证明是可行的。然而,为什么一个证明是不可缺少的呢?主要的原因是,一个结构或者协议的安全不能以通常的检测软件的方式检查。比如,加密和解密“work”且密文看起来混乱的事实,不代表一个老练的敌手不能破解该方案。离开了一个,没有被赋予指定能力的敌手可以破解该方案,的证明,我们就只能靠我们的直觉认为情况就是这样。当然,直觉通常是有很大问题的。事实上,经验已经表明,在密码学和计算机科学方面的直觉是惨不忍睹的。我们有不计其数的未被证明的方案被破解了(有时是立刻,有时是在方案被发表甚至部署数年后)。

    另一个为什么安全的证明是如此重要的原因是关于使用一个不安全系统可能导致的潜在的危险。虽然软件漏洞的代价有时是很大,但某些人破解银行的加密方案或者认证机制的潜在的威胁是巨大的。最后,我们注意到即使软件中存在许多漏洞,基本的工作仍能运转,因为用户通常不会尝试让他们的软件崩溃。相反,攻击者使用复杂的不可思议的方式(利用这些结构的一些特别属性)带着非常清晰的破解的目的,尝试攻击安全机制。因此,虽然正确性证明在计算机科学中总是理想化的,但它们在密码学和计算机安全的领域中绝对是必不可少的。我们强调以上的观察不只是假设,而是根据数年的经验证据和直觉不可相信的经验得到的结论。

规约法。我们的总结是,大多数现代密码学的证明使用一种被称为规约的方法。给出一个具有以下形式的理论
给 定 假 设 X 为 真 , 依 据 给 定 的 定 义 , 结 构 Y 是 安 全 , 给定假设X为真,依据给定的定义,结构Y是安全, XY,
一个证明通常展示了如何把由假设 X X X给出的问题规约到破解结构 Y Y Y的问题(即如何使用那些使 X X X不成立的条件来破解 Y Y Y)。有关这一点的更多,证明通常展示(通过一个结构性的论据)任意破解结构 Y Y Y的敌手可以使用那种方式作为一个子例程来违反假设 X X X。在3.1.3节,我们对此有更多讨论。

总结 - 严格 vs. 特殊 的安全方法

    上述三个原则的组合,构成了一种密码学的严格方法,并区别于那些在我们的研究中作为例子举出的古典加密(不幸的,有时仍在使用)的临时性方法。特殊的方法可能不满足以上三原则中的任一个,但是通常它们都忽略了所有。幸运的是,随着时间推移,将会看到关于严格方法的必要性的意识的提升。此外,仍能发现一些特定的、临时的实现,特别是那些希望得到一种“快速且混乱”的解决问题的方式的人(或者是那些仅仅意识不到的人)。我们希望本书能够在提升对严格方法的重视,以及其在现代密码学中取得的成功的意识上做出贡献。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39578432/article/details/120352562

智能推荐

多线程共用一个Connection插入数据_luanwuxiaose的博客-程序员秘密_connection共用

如题,测试多线程共用一个Connection是否会影响sql语句的执行结果package com.zw.mgt;import org.junit.Test;import org.voovan.dbutil.DbOperate;import org.voovan.tools.TSQL;import org.voovan.tools.log.Logger;import java.s...

mysql经常锁表 导致程序内存溢出_MySQL业务频繁出现死锁导致程序性能存在严重问题..._咕咕32814的博客-程序员秘密

客户反馈系统性能存在严重问题,需要协助排查排查发现系统有大量锁持有资源时间过长临时手工KILL产生死锁源头的会话,协助排查死锁产生的原因发现,业务提交至此节点,项目二开嵌套了一个其他事务导致死锁频发。死锁产生的原因:①会话A,update 1 nocommit②会话B,update 2 nocommit③会话A,update 2 wait①④会话B,update 1 wait②死锁产生,必...

CK11N标准成本评估相关问题_Willie Y的博客-程序员秘密

核算逻辑: 物料主数据中的标准成本来自于每月月结后的标准成本发布。

e​m​a​i​l​三​种​编​码​标​准_weixin_33908217的博客-程序员秘密

一、编码的必要性E-mail只能传送ASCII码(美国国家标准信息交换码)格式的文字信息,ASCII码是7位代码,非ASCII码格式的文件在传送过程中就需要先编成7位的ASCII代码,然后才能通过E-mail进行传送;如果不经过编码,则在传送过程中会因为ASCII码7位的限制而被分解,分解之后只会让收信方看到一堆杂乱的ASCII字符。经过编码后的文件...

汇编中esp和ebp在函数栈空间的保存和变化 call的参数和局部变量的关系详解_小手琴师的博客-程序员秘密_汇编ebp

目录espebpespcall执行跳入子程序以后栈顶寄存器,一直指向栈顶ebpcall执行过跳入子程序以后,一直指向栈底看下面例子模拟一个有2个参数的函数.例如函数参数1是 5, 参数2是6push 6 //参数2push 5 //参数1call 子程序地址//子程序开始以后的栈的内容操作push eip// 这里栈内显示是:"返回到" 因为call语句执行时候的把eip压入栈,这样当子程序结束的时候可以通过retn语句的时候 找到call下面的语句,就是通过这个eip找到的.因为re

Base编码系列_慎铭的博客-程序员秘密_base编码

Base编码系列: Base64 Base32 Base16我们以Base编码为例。Base64编码是使用64个可打印的ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串。另有"="符号用作后缀用途。Base64将输入字符串按字节切分,取得每个字节对应的二进制值(若不足8比特则高位补0),然后将这些二进制数值串联起来,再按照6比特一组进行切分(因为2^6=64),最后一组若不足6比特则末尾补0。将每组二进制值转换成十进制,然后在上述表格中找到对应的符号并串联起来

随便推点

mysql经常锁表 导致程序内存溢出_MySQL业务频繁出现死锁导致程序性能存在严重问题..._咕咕32814的博客-程序员秘密

客户反馈系统性能存在严重问题,需要协助排查排查发现系统有大量锁持有资源时间过长临时手工KILL产生死锁源头的会话,协助排查死锁产生的原因发现,业务提交至此节点,项目二开嵌套了一个其他事务导致死锁频发。死锁产生的原因:①会话A,update 1 nocommit②会话B,update 2 nocommit③会话A,update 2 wait①④会话B,update 1 wait②死锁产生,必...

STM32CubeMX的使用_liht_1634的博客-程序员秘密_stm32cubemx

本内容包括STM32系列的库简介(标准化外设库、HAL库、LL库),软件下载、安装与设置,STM32CubeMX的使用(含输入捕获)等。

转载----如何掌握程序语言_zeroman0的博客-程序员秘密

非常犀利,佩服作者的研究精神,以及对事物的思考~! 链接: http://kb.cnblogs.com/page/152132/如何掌握程序语言作者: 王垠  发布时间: 2012-08-12 12:21  摘要:这篇文章曾经叫做《初学者程序语言的选择》,但是后来我发现,这里给出的看法其实不只是给初学者看的,甚至可能会让初学者看不懂。而就我在 Google 实习

java image 设置大小_java截取图片-设置方位+设置大小_Zack Snyder的博客-程序员秘密

java截取图片-设置方位+设置大小package com.onegrid.darj.test;import java.awt.Rectangle;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java....

Java 中JSON字符串与Java对象的互换【记录】_你好像很好吃a的博客-程序员秘密

1、在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML、JSON等,JSON作为一个轻量级的数据格式比XML效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好,下面先看下JSON的格式。JSON可以有两种格式:一种是对象格式,另一种是数组对象。{"name":"JSON","address":"北京市西城区","age":25} //JSON的对象格式的字符串[{"name":"JSON","address":"北京市西城区","age":25}] //数

vs2013-chromium完整源码任意节点编译_qq_41489640的博客-程序员秘密

#推荐阅读chromium官网win编译:https://www.chromium.org/developers/how-tos/get-the-code网上例子1:https://www.cnblogs.com/diligenceday/p/5747879.html网上例子2:https://juejin.im/post/5a45ab5651882525ab7c17ef#环境:*64位...

推荐文章

热门文章

相关标签