文章目录
- 更多内容及实时更新请关注我的个人技术文档分享:www.ywenrou.cn
- 如需引用请注明出处,谢谢!
第一章:Introduction and Classical Cryptography
1.1密码学和现代密码学
《牛津英语简明词典》(第9版)将密码学定义为“编写或解密密码的艺术”。这在历史上是准确的,但并没有涵盖该领域的现代科学基础和广度。该定义仅关注几个世纪以来用于保密通信的密码。但是,现代密码学涵盖的范围远不止于此:它涉及确保完整性的机制,交换秘密密钥的技术,认证用户的协议,电子投票,加密货币等等。我们不打算提供一个完整的描述,但可以说,现代密码学涉及研究数学技术以保护数字信息,系统和分布式计算免受对手攻击。
词典定义还将密码学称为一种艺术。直到20世纪后期,密码学确实在很大程度上是一门艺术。构建好的密码或破解现有密码依赖于创造力和对密码工作原理的深刻理解。长期以来,几乎没有理论可依赖,也没有关于什么是好密码的工作定义。20世纪70年代和80年代开始,密码学的这种情况发生了根本性变化。一个丰富的理论开始出现,使密码学成为一门科学和数学学科的严格研究。这种视角反过来影响了研究人员对计算机安全领域的更广泛思考。
经典密码学(例如20世纪80年代之前)和现代密码学之间的另一个非常重要的区别与其采用有关。历史上,主要的密码学消费者是军事组织和政府。今天,密码学无处不在!如果您曾通过输入密码进行身份验证,在互联网上使用信用卡购买物品,或下载经过验证的操作系统更新,那么您已经使用过密码学。而且,越来越多的程序员被要求通过采用密码机制,来“保护”他们编写的应用程序,尽管他们的经验相对较少。
简而言之,密码学已经从一组试探性技术,用于确保几个特定领域的秘密通信,发展为一门科学,有助于为世界各地的普通人更普遍地保护系统。
1.2私钥加密的设置
根据加密和解密过程所采用密钥的特点可以将加密算法分为两类:对称加密算法和非对称加密算法。在本章节中主要讲解对称加密算法。
对称加密算法也称为传统加密算法,是指解密密钥和加密密钥相同。所以这类加密算法要求通信双方在进行保密通信前,通过安全方式商定一个密钥。对称加密算法的安全性依赖于密钥的管理。
私钥加密有两种常见的应用场景:通信双方在空间上是分开的 (如图1.1),双方共享用于通信的密钥(密钥很大情况下会泄露);随着时间的推移与自身通信(如图1.2),例如用户在自己电脑加密解密自己文件(如果窃取者可以访问硬盘驱动器并赌气其内容也可能导致密钥泄露)。
(1) 密码方案的语法
- M:明文消息空间,表示所有可能明文组成的有限集
- C:密文消息空间,表示所有可能的密文组成的有限集
- K:密钥空间,密钥生成算法输出的所有可能密钥的集合
- Enc:加密算法,将密钥k和消息m作为输入,并输出密文c,通过 E n c k ( m ) Enc_k(m) Enck(m)表示
- Dec:解密算法,将密钥k和密文c作为输入,并输出明文m,通过 D e c k ( c ) Dec_k(c) Deck(c)表示
加密方案必须满足:
D e c k ( E n c k ( m ) ) = m Dec_k(Enc_k(m))= m Deck(Enck(m))=m
(2) Kerckhoffs原理
加密的方案不需要保密并且它还必须轻而易举的落入敌军手中。换句话说,安全性不应该依赖于加密方案是保密而是完全依赖于密钥的保密性
该原理有三种主要依据:
- 首先保持短密钥的保密比保密加密方案(更复杂)的容易得多,其次加密方案存在泄露(例如通信方背叛,攻击者逆向)。
- 如果通信双方得信息被暴露后,他们更改密钥比更换密钥容易得多。
- 在广泛部署加密方案之前,鼓励公众审查该方案以检查可能存在的弱点。
1.3 历史密码及其密码分析
在我们对“古典”密码学的研究,我们将研究一些历史加密方案,并表明它们是不安全的。我们展示这些材料的主要目的是(1)强调密码学启发式方法的弱点,从而引出将在书的其余部分中采取的现代、严格的方法。(2)证明实现安全加密的简单方法不太可能成功。在此过程中,我们将提出一些受这些历史方案的弱点启发的密码学的中心原则。
(1)凯撒密码
凯撒密码是目前最古老的密码之一,通过将字母表的字母移动3个位置进行加密。改加密方法是固定的,没有密钥,任何了解凯撒加密的人都能够毫不费力地解密
(2)位移密码和足够的密钥空间原理
位移密码可以看作凯撒密码的密钥变体。具体来说,在位移密码中,密钥k是0到25之间的数字。
位移密码定义如下:
E
n
c
k
(
m
1
.
.
.
m
n
)
=
c
1
.
.
.
c
n
,
c
i
=
[
(
m
i
+
k
)
m
o
d
26
]
Enc_k(m_1 ...m_n) = c_1...c_n,c_i = [(m_i + k) mod 26]
Enck(m1...mn)=c1...cn,ci=[(mi+k)mod26]
D
e
c
k
(
c
1
.
.
.
c
n
)
=
m
1
.
.
.
m
n
,
m
i
=
[
(
c
i
+
k
)
m
o
d
26
]
Dec_k(c_1...c_n) = m_1 ...m_n,m_i = [(c_i + k) mod 26]
Deck(c1...cn)=m1...mn,mi=[(ci+k)mod26]
由于位移密码只有26个可能的密钥因此在不知道密钥k的情况下通过尝试所有密钥进行破解(暴力或穷举攻击)也是可以进行解密的。因此提出足够密钥空间原则:任何加密方案都必须有一个足够大的密钥空间使穷举攻击方式不可行
(3)单字母替换密码
在位移密码中,明文字母表与密文字母表的映射关系是由密钥确定的固定位移。在单字母替换密码(也称单表位移密码)中我们可以为明文字母表和密文字母表建立一一对应的关系。如下关系:
例如:
明文:tellhimaboutme
密文:GDOOKVCXEFLGCD
假设正在使用的英文字母表的密钥空间大小为26!或大约288,显然采用穷举攻击方式计算量相当大,不太现实。但是并不意味着密码是安全的,例如由于一一对应的关系,密文中字符出现的频率和明文字符出现的频率是相同的,经过统计在英语文本中单个字母出现的频率分布是已知的(如图1.3),因此可以通过频率分析法对密码进行分析,其破解难度远远小于穷举法。
(4) 对位移密码的改进攻击
我们可以使用字母频率表改进对位移密码的攻击。在上面我们采用不断尝试可能的密钥分析出“有意义”的明文的方法,这种方法有个缺点:计算机很难理解明文是否有意义况且还存在明文本身就不是有效的语义的情况。
我们已知英语文本中单个字母出现的频率分布情况,用 0-25 分别表示英文字母 a-z,
p
i
p_i
pi表示第 i 个字母出现的频率,则可得到以下结论:
∑
i
=
1
25
p
i
2
≈
0.065
\sum_{i=1}^{25}p_i^2\approx0.065
i=1∑25pi2≈0.065
当我们得到密文后,假设
q
i
q_i
qi表示密文中字母表第 i 个字母出现的频率,如果密钥=k,那么
p
i
=
q
i
+
k
p_i=q_{i+k}
pi=qi+k,对于
j
∈
j\in
j∈ {0,…,25}的每个字母我们都可以找到对应的k使得:
∑
i
=
1
25
p
i
.
q
j
+
k
≈
0.065
\sum_{i=1}^{25}p_i.q_{j+k}\approx0.065
i=1∑25pi.qj+k≈0.065
(5)维吉尼亚(多字母替换)密码
维吉尼亚密码是一种多表移位密码,当密钥长度为 1 时退化为移位密码。该密码的原理是使用一个密钥和明文来生成密文。密钥是一个字母序列,它被用来决定每个明文字母要加密成哪个密文字母。密钥的长度可以与明文长度不同,但通常情况下,密钥长度与明文长度相同或更。示例如下:
加密过程如下:
- 将密钥重复直到与明文等长。
- 对于明文中的每一个字母,使用其在字母表中的位置和密钥中对应位置的字母在字母表中的位置相加(模 26),得到一个新的字母位置。
- 将新的字母位置对应的字母作为密文中的该位置的字母。
如果密钥足够长,破解此密码非常困难,大多数人认为是“牢不可破的”,因此尽管它是在16世纪发明的,但对它的系统攻击直到几百年后才被设计出来。
(6)对维吉尼亚密码的攻击
攻击维吉尼亚密码的第一个突破点就是知道密钥的长度,假设我们已经知道了密钥的长度(t),对于所有
j
∈
{
1
,
.
.
.
.
.
,
t
}
j\in\{1,.....,t\}
j∈{1,.....,t}密文字符,我们可以将密文分为 t 个部分:
C
j
,
C
j
+
t
,
C
j
+
2
t
,
.
.
.
C_j,C_{j+t},C_{j+2t},...
Cj,Cj+t,Cj+2t,...
我们可以对每个部分进行解密,如果试图一次猜测整个密钥k则需要通过
2
6
t
26^t
26t种可能的密钥进行暴力破解,当t很大时候这种方案是行不通的。当然也可以使用字母的频率来对每个部分进行分析找到使密文“有意义”的密钥,由于可以对每个流(即对密钥的每个字符)独立执行,因此只需要26*t次即可。
为了更容易实现自动化,上一小节已经介绍。这种攻击并不依赖于检查“有意义”的明文,而只依赖于明文中字符的潜在频率分布,更加的科学。
但是大多数情况下我们是不知道密钥的长度的,下面分别举例说明三种攻击方法:
- 频率分析法:只要密钥的长度 T 不是非常大,我们便可以重复上述攻击 T 次,而且其中正确结果将会更加好辨认。
- Kasiski 检测法:由于英语固有的语法结构,导致一些特定的双字母组和三字母组经常出现,于是我们便可以找密文中重复出现的三字母组,其间距极有可能是密钥长度 t 的倍数,例如 the 等。因为当密文足够长时,重复出现的词组可能是同一个单词被密钥的同一个部分加密的结果。
- 巧合指数法:巧合指数法(coincidence index method)是破解维吉尼亚密码的一种方法这种方法更容易实现自动化。它利用了维吉尼亚密码中的一个特点:每隔 n n n 个字符会出现一次重复,其中 n n n 是密钥长度。因此,在密文中每隔 n n n 个字符分为一组,可以得到 n n n 个子串,每个子串中的字符之间存在一定的相关性。假设已知密钥长度 n n n,可以使用巧合指数法来统计每个子串中字符出现的频率,从而推测密钥。
我个人疑惑当加密文本很短的时候,上述方法好像行不通,在现代密码学的原则中也提到,没有正式的定义
(7)总结
一般来说,更长的密钥可能需要密码分析人员获得更多的密文才能进行攻击。就像上面的维吉尼亚密码要破解需要比普通移位密码多t倍的密文。(当密钥与明文一样长时,维吉尼亚密码证明是安全的,下一章中会看到一个相关现象)
我们只介绍了一些历史密码。除了它们的历史意义之外,我们介绍它们的目的是为了阐明一些重要的教训。也许最重要的是,设计安全密码很难。维吉尼亚密码长时间未被破解。更复杂的方案也已经被使用。但是,复杂的方案不一定安全,所有历史方案都已被破解。
1.4现代密码学的原则
从前一节中可以清楚地看出,密码学在历史上更像是一门艺术,而不是一门科学。密码方案以启发式的方式设计,并根据其感知到的复杂性或聪明之处进行评估。分析一个方案,看看是否可以发现任何攻击;如果是,该方案将被“修补”以阻止攻击,这个过程将不断重复。虽然人们可能一致认为一些方案是不安全的(由一次特别具有破坏性的攻击证明),但对于“安全”方案应该满足什么要求没有一致的概念,也没有证据证明任何具体方案是安全的。
在过去的几十年里,密码学已经发展成为一门科学。密码方案现在以一种更系统的方式开发和分析,最终目标是给出一个“给定的结构是安全的”严格证明。为了清楚地描述这样的证明,我们首先需要正式的定义来确定“安全”的确切含义;这样的定义本身是有用和有趣的。事实证明,大多数密码学证明都依赖于目前关于某些数学问题的算法困难性的未经证实的假设;任何这样的假设都必须明确和准确地说明。强调定义、假设和证明,将现代密码学与经典密码学区分开来;现在我们将更详细地讨论这三个原则。
1.4.1 原则 1 — 正式定义
- 正式的定义通过明确描述让人们理解哪些威胁的范围以及需要哪些安全保障。因此,定义可以帮助知道加密方案的设计。
- 定义还提供了一种评估和分析结构的方案。有了定义,就可以研究一个给定方案,看看它是否达到了期望的保证
- 定义可以对方案进行有意义的比较。有了精确的定义,我们就可以正确地评估这两种方案之间的权衡
编写一个正式的定义迫使人们思考什么对手头的问题至关重要,什么属性是无关的。通过这个过程,往往会揭示出问题的微妙之处,但乍一看并不明显。接下来,我们将为加密的情况进行说明。
举个例子:安全加密
一个常见的错误是:认为正式的定义是不需要的,或者是微不足道的,因为“每个人都对安全有一个直观的想法。”但事实并非如此。作为一个例子,我们考虑了加密的情况。虽然我们将安全加密的正式定义推迟到后续的章节,但我们在这里非正式地描述这样的定义应该包括什么。
一般来说,安全性定义由两部分组成:安全保证(从攻击者的角度看,什么是成功的攻击)和威胁模型。安全保证定义了该计划旨在防止攻击者做什么,而威胁模型表述了对手的力量,即攻击者假设能执行什么行动。
我们先来看第一个。一个安全的加密方案应该保证什么呢?以下是一些想法:
安全保证
- 攻击者不能恢复密钥。无法恢复密钥是必要的,但不足以确保安全。这是有道理的:加密的目的是保护消息;密钥的保密是实现这一目标的一种手段,但它本身并不是目标。
- 攻击者不能从密文中恢复明文 。这个定义更好,但仍然远不能令人满意,例如当加密一个工资数据库时,如果90%的员工工资被泄露,我们将有理由感到不安!
- 攻击者应该不可能从密文中恢复明文的任何字符。如果攻击者通过纯粹的运气或外部信息,正确地猜测出某人的薪水中最不重要的数字是0呢?显然,这不应该使加密方案不安全,因此任何可行的定义都必须以某种方式排除这种行为作为成功攻击。
- 无论攻击者已经拥有的任何信息如何,密文都不应该泄露有关底层明文的其他信息。这个非正式的定义包含了上面概述的所有问题
既然我们已经确定了一个安全目标,它仍然需要指定一个威胁模型。这指定了攻击者假设拥有的“权力”,但不对对手的策略进行任何限制。在加密的背景中,威胁模型有几个合理的选项;为了增加攻击者的能力,标准的选项有:
威胁模型
- 仅密文攻击:最基本的攻击,攻击者通过观察密文试图确定有关明文信息
- 已知明文攻击:在这里,对手能够获得一个或多个使用某些密钥生成的明文/密文对。然后,对手的目的是推断出关于使用相同的密钥产生的一些其他密文的潜在明文的信息。我们所看到的所有经典加密方案,使用已知明文攻击都是常见的。
- 选择明文攻击:攻击者可以获得明文/密文对,如上所述。
- 选择密文攻击:最后一种攻击是攻击者还能够获得(有关的一些信息)对其选择的密文的解密,例如,攻击者选择的某些密文的解密是否产生有效的英文消息。再说一次,敌手的目标是学习关于使用相同密钥生成的一些其他密文(对手无法直接获得其解密)的底层明文的信息
1.4.2 原则 2 — 精确假设
现代大多数加密构造都不能无条件地证明安全;这样的证明需要解决计算复杂性理论中似乎今天远未得到解答的问题。这种不幸的情况的结果是,安全性的证明通常依赖于假设。现代密码学要求任何这样的假设都必须明确且数学上精确地表述。在最基本的层面上,这是因为安全性的证明需要这样做。但是还有其他原因:
- 假设的验证:就其本质而言,假设是指没有被证明,而是被推测为真实的陈述。为了加强我们对某个假设的信念,有必要对其进行研究:这个假设被检验而不被反驳的次数越多,我们就越有信心该假设是真实的。此外,对假设的研究可以通过显示它是由其他广泛认为为真的假设所蕴含来证明其有效性。如果所依赖的假设没有被明确地陈述,那么它就不能被有效地研究和(可能)驳斥。因此,增强我们对某个假设的信心的前提是准确陈述这个假设的具体内容。
- 假设比较:在密码学中,我们经常会遇到两个方案,它们都可以被证明满足某种定义,但基于不同的假设。如果其他条件相同,应该选择哪个方案?如果第一个方案所依赖的假设比第二个方案所依赖的假设要薄弱(即第二个假设包含第一个假设),那么应该选择第一个方案,因为第二个假设可能是错误的,而第一个假设可能是正确的。如果两个方案所使用的假设不可比较,那么通常的规则是选择基于研究更为深入、信心更高的假设的方案。
- 理解必要的假设:加密方案可能基于某些底层构建模块。如果后来发现了这些构建模块的一些弱点,我们如何判断加密方案是否仍然安全?如果构建模块的基础假设在证明方案安全性的过程中已经明确,那么我们只需要检查新发现的弱点是否影响所需的假设即可。
有时候会有这样一个问题:为什么不直接假设方案本身是安全的,而是要基于其他假设来证明方案的安全性呢?在某些情况下,比如定义简单且方案已经成功地抵御攻击多年,这可能是可接受的方法。但是,当引入新的构造时,这种方法并不被推荐,甚至是非常危险的。上面的原因可以解释为什么。首先,一个已经被研究了几年的假设比随着新构造引入的新的任意假设更可取。其次,通常更倾向于“简单”的假设——即假设某个清晰的数学问题的难度,而不是假设某个复杂的方案满足一个复杂的安全定义——因为简单的假设通常更容易理解和研究。依赖“低级别”的假设(而不仅仅是假设方案是安全的)的另一个优点是,这些低级别的假设通常可以用于其他构造。最后,低级别的假设使模块化成为可能。考虑一个加密方案,其安全性依赖于其构建模块中的某个假设属性。如果底层构建模块不能满足所述假设,那么可以使用满足必要要求的其他组件来实例化加密方案。
1.4.3 原则 3 — 安全性证明
上述两个原则使我们能够实现我们的目标,即在某些假设下提供严格的证明,证明某个构造满足给定的定义。在密码学中,这种证明尤为重要,因为存在一个攻击者正在积极尝试“破解”某些方案。安全性的证明提供了一种铁证——相对于定义和假设——即没有攻击者能够成功;这比采用不合理或试探性方法来解决问题要好得多。如果没有证明,即没有证明没有拥有特定资源的对手能够破解某些方案,那么我们只能依靠自己的直觉来判断这是否正确。经验表明,在密码学和计算机安全领域,直觉是灾难性的。有很多未经证明的方案都被攻破了,有时甚至是开发几年后才被攻破的。
总结:严格的安全方法vs启发式的安全方法
依赖于定义、假设和证明的方法构成了密码学的一种严格方法,这种方法与经典密码学的非正式方法不同。不幸的是,仍然有些人设计和部署不合理的“草率”解决方案,这些人希望快速解决问题,或者仅仅是缺乏知识。我们希望本书能够增强人们对严格方法的认识,并意识到它在开发可证明安全方案中的重要性。
1.4.4 可证明的安全和现实世界安全
现代密码学的很多基础都依赖于可靠的数学基础。但这并不意味着该领域不再是一种艺术。严格的方法留下了创造性的空间,可以开发适合现代应用和环境的定义,提出新的数学假设和设计新的基本原理,构建新颖的方案并证明它们的安全性。即使已被证明安全,攻击已部署的加密系统的艺术也将始终存在。下面我们将进一步阐述这一观点。
现代密码学采取的方法彻底改变了该领域,并有助于提高人们对实际部署的加密方案的安全性的信心。但重要的是不要夸大安全性证明的意义。安全性的证明总是相对于所考虑的定义和所使用的假设而言的。如果安全性保证与所需的不匹配,或者威胁模型无法捕捉对手的真实能力,那么证明可能是无关紧要的。同样,如果所依赖的假设被证明是错误的,那么安全性的证明就毫无意义了。
重要的是要认识到,一个方案的可证明安全并不一定意味着该方案在现实世界中是安全的。有些人将这看作是可证明安全的缺点,但我们乐观地看待这一点,因为它展示了这种方法的优势。在现实世界中攻击一个可证明安全的方案,攻击者被迫将注意力集中在定义上(即探索理想化定义与现实世界需求之间的差异)或底层假设上(即看看它们是否成立)。反过来,密码学家的工作是不断完善他们的定义,以更贴近现实世界,并研究他们的假设以测试其有效性。可证明安全并没有结束攻击者和防御者之间古老的斗争,但它确实提供了一个框架,有助于使防御者处于优势地位。