您的位置:首页 > 其它

信息安全原理与实践(第2版)--------加密基础

2013-06-07 09:20 417 查看




第二章

加密基础

2.1 引言

在这一章里,我们将要讨论密码学里的一些基本概念。这些讨论将为后面的密码技术相关章节的学习奠定基础,进而为贯穿于全书的诸多素材的理解提供有力支撑。我们将会尽可能地避免艰深晦涩的数学表达。尽管如此,这本书里仍将提供足够的细节,以便您不仅能明白“是什么”,而且还会对“为什么”有一定程度的理解。

在作为引言的本章之后,接下来的关于密码技术的几章将分别聚焦在如下4个方面的内容:

● 对称密钥加密体系

● 公开密钥加密体系

● 哈希函数

● 高级密码分析

另外,我们还会涵盖其他一些特别的专题。

2.2 何谓“加密”

说到“加密”,实际上包括如下几个基本术语:

● 密码学——制作和破解“秘密代码”的技艺和科学。

● 加密(加密系统)——“秘密代码”的制作过程。

● 密码分析——“秘密代码”的破解过程。

● 加密——根据情况不同,这个词语可以看成上述所有术语(甚至还有诸如此类的更多说法和词汇)中任何一个的同义词,具体场合的精确含义应该根据上下文来判定清楚。

“密码”或“加密系统”用于“加密”数据。对于原始的未加密的数据,我们称之为“明文”;对于加密的结果,我们称之为“密文”。通过称为“解密”的过程,我们把密文恢复成原始的明文。“密钥”是一个重要的概念,我们用它来配置密码系统以实施加密和解密。

在“对称密钥”密码体系中,加密和解密使用的是同样的密钥,如图2-1 中所示的黑盒密码系统说明了这个特性。另外,还有所谓“公开密钥”加密技术的概念,其中用到的加密和解密密钥是不同的。既然使用不同的密钥,公开加密密钥就成为可能的了——这就是公开密钥这个名字的由来 。在公开密钥加密中,加密密钥被相应地称为“公钥”,而解密密钥则需要确保机密,被称为“私钥”。在对称密钥加密中,密钥被称为“对称密钥”。我们需要区分清楚这些关于密钥的术语,以免混淆。



对于理想的密码系统,要能够确保:在没有密钥的情况下,想从密文恢复出明文是不可能的。也就是说,即使攻击者,如Trudy,完全了解系统使用的算法以及许多其他的相关信息(本书后续将进一步细化和明确说明这些内容),她也不能在没有密钥的情况下恢复出明文。这是加密系统的目标,虽然现实往往并非能够如愿以偿。

密码学的基本原则之一是:密码系统的内部工作原理对于攻击者,如Trudy,是完全可见的,唯一的秘密就是密钥。这就是所谓的Kerckhoffs原则(译者注:在密码学中,kerckhoffs原则由Anguste kerckhoffs提出:所谓密码系统是安全的,表明可以公开除了密钥之外的整个密码系统的一切内容。与之相对的原则或理念是security through obscurity,其强调通过对系统或算法的保密来实现安全),信不信由你,这个原则确实是因一个名叫Kerckhoffs的家伙而命名的。1883年,Kerckhoffs作为荷兰语言学者和密码专家,列举了6条关于密码设计和使用的基本原则(见参考文献[164])。如今以他的名字命名的原则指出:密码系统决不能强制保密,必须容许可以轻而易举地落入敌方之手(见参考文献[165]),也就是说,密码系统的设计不再是秘密。

Kerckhoffs原则的关键是什么呢?毕竟,对于Trudy来说,如果她不知道密码系统如何工作,攻击加密系统时就必定会更加困难。那么,为什么我们会想要让Trudy的日子过得更惬意呢?事实上,如果你的安全依赖于秘密设计的系统,那么至少会有下面几个问题。首先,即使可以保密,所谓“秘密”加密系统的细节也极少会长期保持机密性。逆向工程可能会被用于从软件恢复出算法实现,而且,即使算法嵌入到所谓的防篡改硬件中,有时也仍然会遭受逆向工程攻击,进而被泄露。其次,更加令人担忧的是这样一个事实:当算法本身一旦暴露在公众明察秋毫的视野之下,秘密的加密算法和系统将不再有任何安全性可言,而这样的例子由来已久,层出不穷。查阅参考文献[29],你可以找到一个相对而言比较近的例子,其中微软就违背了Kerckhoffs原则。

密码专家们不会轻易相信加密算法是值得使用的,除非经受住大量密码专家在跨度较长的一段时间内的广泛和公开的分析。最起码的一点就是任何不满足Kerckhoffs原则的加密算法都是不可信的。换句话说,对于密码系统,要假设都是有问题的,除非被证明是有效可用的。

Kerckhoffs原则常常会被极大地扩展到密码学领域之外,以至于覆盖到了安全领域的各个方面。在其他相关环境里,这个基本原则往往代表了“安全设计本身应置于公众的审视之下”的理念。这是基于这样一种信念:更多的“眼球”(译者注:关注)意味着更容易暴露出更多的安全缺陷,从而最终会使得系统更加安全(因为能够弥补所暴露出的安全缺陷)。虽然Kerckhoffs原则(包括在狭义的加密概念中的形式和更广义的扩展环境中的存在)似乎已经基本上获得了广泛认可,但是在现实世界中,仍因许多实际的诱惑使得违背这一基本原则的实例时有发生,而且几乎无一例外地伴随着灾难性的后果。贯穿本书,我们将亲眼目睹几个安全失效的例子,这些例子均是由于未能遵从可敬的Kerckhoffs先生的忠告而直接导致失败的。

接下来,我们将简要地看看几个经典的密码系统。虽然加密技术的历史是一个非常有吸引力的话题,但是这部分素材的目的还是为一些关键概念的理解提供基础的入门性引导,而这些关键概念在现代密码学领域也日益凸显。换言之,请读者注意这些有关经典密码系统的内容,因为我们在接下来的两章里和许多案例中还将再次提及所有这些关键概念,而在后续的章节中,我们也会持续地运用这些概念。

2.3 经典加密

在本节中,我们来考察4类经典的密码,它们中的每一个都分别说明了与现代密码系统密切相关的一个特性。要讨论的第一个例子是简单替换,这是最古老的密码系统之一,它的使用可以追溯到至少两千年以前,这个例子也非常适合说明一些基本的攻击类型和手段。在第二个例子中,我们要将注意力转向一类称为“双重换位加密法”的密码技术,其中包含了现代密码学中使用的一些重要概念。我们还要讨论经典的密码本方法,因为许多现代密码系统都可以看成这些经典密码本的“电子”版本。最后,我们要考察所谓的一次性密码本,这是一类可以被证明为安全的,并且有实际意义的密码系统。除此之外,本书中其他的密码系统(以及常规使用的密码系统)都不是可无法证明为安全的。

2.3.1 简单替换密码

首先,我们来考察一类称为简单替换密码的方法,我们给出一个特别简单的实现案例。在这个最简单的例子中,消息的加密是通过将当前字母替换为在常规字母表中第n个位置之后的那个字母来完成的。例如,当选择n=3时,这个替换(其中n相当于密钥)如下:



这里,我们采用如下约定:明文写成小写字母,而密文写成大写字母。在这个例子里,密钥可以简洁地以数字“3”来表示,因为轮换的偏移量就是事实上的密钥。

用这个密钥“3”,我们就可以加密如下明文消息:

fourscoreandsevenyearsago 式(2.1)

通过查找上面列表里的每一个明文字母,可以逐步完成在密文行中相应字母的替换;或者也可以简单地将每个字母逐个置换成常规字母表里该字母之后第3个位置的那个字母。对于式(2.1)中的这个特定的明文字符串,加密的结果就是:

IRXUVFRUHDAGVHYHABHDUVDIR

为了解密这个简单的替换,我们需要在密文行中查看密文字母并将其置换为明文行中的对应字母;或者也可以将每一个密文字母向前移动三个位置(当然是在常规字母表里的位置)。这个简单的“三位偏移”替换方法就是著名的凯撒密码 。

“三位偏移”的轮换算法没什么神奇的,无论多少位的轮换也都一样。如果我们限定这种简单替换密码仅在常规字母表中进行轮换,那么可能的密钥n将属于{0, 1, 2, ... , 25}这个集合的元素之一。假设Trudy截获了密文消息:

CSYEVIXIVQMREXIH

并且她猜想该密文是通过一种简单的基于“n位偏移”的替换算法加密的。那么,她就可以尝试26个可能密钥里的每一个,通过使用每一个假定的密钥来“解密”密文消息,并且检查所获得的假定结果明文是否有实际含义。如果该消息确实是通过“n位偏移”来加密的,Trudy就完全能够找到真实的明文,进而获得密钥。平均而言,这大约只需经过13次尝试。

这种强力攻击就是Trudy可以经常尝试的事情之一。假定Trudy拥有充足的时间和资源,她将会最终遍历到那个正确的密钥从而破解消息密文。这种在所有密码攻击中最基本的方法就是所谓的“穷举式密钥检索”。既然这种攻击常常会被使用,那么要使得可能的密钥数量(译者注:密钥空间的大小)足够大,以至于对Trudy来说,仅仅使用这种简单的尝试所有密钥的方法无法在任何合理的时间度量内完成,这是非常必要的(虽然有了这一切都还远远不够)。

那么,多大的密钥空间算是足够大呢?假设Trudy有一台高速的计算机(或者有一组计算机),计算能力是每秒钟完成240个密钥的测试 。这样算来,大小为256的密钥空间将会在216秒的时长内被遍历完毕,即大约耗费18个小时;而对于大小为264的密钥空间的穷举式密钥检索,则会耗费超过半年的时间;如果密钥空间大小为2128,那么遍历该空间需要超过9×1018年的漫长时间。对于现代对称密钥加密系统,典型的密钥长度一般是128位或更长,由此可以提供2128或更大的密钥空间。

现在,我们回来继续讨论简单替换密码。如果仅仅允许在常规字母表中轮换的方式,那么可能的密钥数量实在是太少了,因为Trudy可以非常快速地完成穷举式密钥检索。那么,还有什么办法能够让我们再增加密钥的数量吗?事实上,完全没有必要将简单替换操作仅局限在“常规字母表中的n位轮换方式”,因为任何一种26个字母的排列组合都可以作为密钥。例如,下面的排列组合就给出了可用于简单替换密码的密钥,这并不是基于常规字母表的轮换。



总体而言,简单替换密码可以采用字母表的任何排列组合作为密钥,这就意味着将有26!≈288个可能的密钥数量。那么利用Trudy的每秒钟可执行240次密钥计算的超级快速的计算机,要尝试完该简单替换的所有可能的密钥,就需要花费超过890万年的时间。当然,她有望利用这个时间的一半就能找到正确的密钥(就平均概率而言),也就是445万年。既然288个密钥的数量远远大于“Trudy在任何合理的时间度量内能够尝试的个数”,那么这个加密方案就满足对于任何可行的加密方案至关重要的第一个需求—密钥空间足够大,以至于穷举式密钥检索在事实上不可行。如此一来,是否就意味着简单替换密码系统是固若金汤的呢?我们在这里可以掷地有声地回答:绝非如此!在下一节我们将要介绍的安全攻击中,你将能够一目了然。

2.3.2 简单替换的密码分析

假设Trudy截获了下面的密文,她猜想该密文是通过运用简单替换加密方案生成的,而使用的密钥可能是常规字母表的任何一种排列:

PBFPVYFBQXZTYFPBFEQJHDXXQVAPTPQJKTOYQWIPBVWLXTOXBTFXQWA 式(2.2)

XBVCXQWAXFQJVWLEQNTOZQGGQLFXQWAKVWLXQWAEBIPBFXFQVXGTVJV

WLBTPQWAEBFPBFHCVLXBQUFEVWLXGDPEQVPQGVPPBFTIXPFHXZHVFAG

FOTHFEFBQUFTDHZBQPOTHXTYFTODXQHFTDPTOGHFQPBQWAQJJTODXQH

FOQPWTBDHHIXQVAPBFZQHCFWPFHPBFIPBQWKFABVYYDZBOTHPBQPQJT

QOTOGHFQAPBFEQJHDXXQVAVXEBQPEFZBVFOJIWFFACFCCFHQWAUVWFL

QHGFXVAFXQHFUFHILTTAVWAFFAWTEVOITDHFHFQAITIXPFHXAFQHEFZ

QWGFLVWPTOFFA

既然对于Trudy来说尝试288个所有可能的密钥是太大的工作量(实际上是个不可能完成的任务),那她为什么不聪明点呢?如果明文是用英语书写的,Trudy就可以利用图2-2中的英文字母频率统计,再结合式(2.2)中的密文的相应频率统计来辅助破解,该密文中相应的频率统计如图2-3所示。



2.3.3 安全的定义

关于安全的密码方案,合理的定义不止一个。理想情况下,我们当然希望能有严格的数学证明来说明针对系统不存在任何可行的攻击,但是这样的密码系统极其罕见,并且可证明为安全的密码方案对大部分应用来说都非常不切实际。

既然无法奢望对密码系统的安全性进行严格证明,那么我们所能够要求的就是已知著名的攻击行为在该系统上无效,即从所谓的计算不可行概念的含义上来思考。鉴于这看起来将是最为至关重要的一个特性,我们将使用稍微有点儿不同的定义来说明。我们称密码系统是安全的,则意味着已知的著名攻击需要耗费和穷举式密钥检索一样巨大的工作量才能破解它。换句话说,尚未发现捷径攻击。

请注意,根据我们的定义,拥有较少数量密钥的安全密码系统可能比拥有较多数量密钥的非安全密码系统更容易被攻破。虽然这看起来有悖常理,但其实对这种看似荒唐的情形也能有合理的解释。我们给出的定义,其依据是密码系统永远无法提供比穷举式密钥检索更高的安全性,因此密钥的长度可以被看成该系统安全性水平的“标签”。一旦发现捷径攻击,该密码算法就失去了确保系统能够提供密钥长度所标示的“标签”级安全水平的能力。简而言之,捷径攻击的出现表明密码系统存在设计缺陷。

另外还要注意,在实践中,我们必须选择安全的密码算法(在我们所定义的安全的意义上)并且要拥有足够大的密钥空间,以便使得穷举式密钥检索在现实中不可行。当需要选择密码系统来保护敏感数据时,上述两个因素都是需要慎重考虑的。

有需要试读电子版文档的朋友请留下邮箱,一有时间我就会发给大家的。

更多图书试读内容请持续关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: