密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记

第4章 分组密码和数据加密标准

学习目标

  • 理解流密码和分组密码之间的差异。
  • 简要介绍Feistel密码,并说明解密为何是加密的逆过程。
  • 简要介绍数据加密标准。
  • 解释雪崩效应。
  • 讨论DES的密码学强度。
  • 总结主要的分组密码设计原理。

本章介绍现代对称密码的基本原理,主要探讨使用得最广泛得对称密码——数据加密标准(Data Encryption Standard, DES)。尽管DES之后出现了大量的对称密码,并且高级加密标准(Advanced Encryption Standard, AES)注定会取代DES,但DES依然是一个及其重要的算法。此外,详细讨论DES算法可以帮助我们深刻地理解其他对称密码的原理。

本章首先研究对称分组密码的一般原理(注意本书所说的对称密码主要是对称分组密码,除了第8章的流密码外),然后研究完整的DES;讨论这个具体的算法后,再一般性地讨论分组密码设计问题。

4.1 传统分组密码结构

事实上,现在使用的大多数对称分组加密算法都是基于Feistel分组密码结构的。因此,研究Feistel密码的设计原理非常重要。下面首先比较流密码和分组密码,然后讨论Feistel结构分组密码的设计动机,最后讨论他的一些含义。

4.1.1 流密码与分组密码

流密码每次加密数据流的一位或一字节。古典流密码的例子有密钥自动生成的\small Vigen\grave{e}re密码和Vernam密码。理想情况下,可以使用一次一密版本的Vernam密码,其中密钥流(\small k_{i})和明文流(\small p_{i})一样长。若密钥流是随机的,则除非获得了密钥流,否则这个密码是不可破的。然而,密钥流必须提前以某种独立、安全的信道提供给双方。待传递的数据流量很大时,会带来不可逾越的障碍。

相应地,出于实用的原因,位流必须以算法程序的方式实现,以便双方都能生成具有密码学意义的位流。位流生成器是一个由密钥控制的算法,它必须生成密码学意义上的强位流。现在,两个用户只需共享生成的密钥,各自都可以生成密钥流。

分组密码加密一个明文分组,通常得到的是与明文等长的密文分组。典型的分组大小是64位或128位。与流密码一样,两个用户共享一个对称加密密钥。第7章中会讲到,使用某种工作模式,分组密码可以获得与流密码相同的效果。

人们已对分组密码进行了大量研究。一般来说,分组密码的应用范围要比流密码的广泛。绝大部分基于网络的对称密码应用使用的是分组密码。因此,本章及本书讨论的对称密码将集中于分组密码。

4.1.2 Feistel密码结构的设计动机

分组密码作用于n位明文分组,产生n位密文分组。共有\small 2^{n}个不同的明文分组,由于加密是可逆的(即可以解密),因此每个明文分组将唯一地对应一个密文分组。这样地变换称为可逆变换或非奇异变换。

理想分组密码,允许生成最大数量地加密映射来映射明文分组。是分组密码地最一般形式,能用来定义明密文之间的任意可逆变换。

但是,应用这种方法存在实际的困难。对于像n=4这样的较小分组,密码系统等价于传统代替密码。如我们所见,用明文的统计分析方法攻击它很容易。这种脆弱性并非来自代替密码,而是因为使用的分组规模大小。如果n足够大,并且允许明密文之间采用任意的可逆变换,那么明文的统计特征将被掩盖,从而不能用统计方法来攻击这种体制。

然而,从实现和运行的角度来看,采用大规模分组的任意可逆代替密码(即理想分组密码)是不可行的。因为对于这样的变换,映射本身就是密钥。 一般来说,对于n位代替分组密码,密钥的规模是\small n \times 2^{n}位。

考虑到这些困难,Feistel指出,我们需要的是对理想分组密码体制(分组长度n较大)的一种近似体制,它可以在易于实现部件的基础上逐步建立。在讨论Feistel的方法之前,我们先进行其他讨论。我们可以使用一般的分组代替密码,但为了实现方便,我们只讨论\small 2^{n}!个不同的可逆映射的一个子集。

4.1.3 Feistel密码

Feistel建议使用乘积密码的概念来逼近理想分组密码。乘积密码是指依次使用两个或以上的基本密码,所得结果的密码强度强于单个密码的强度。这种方法的本质是开发一个分组密码,密钥长度为k位,分组长度为n位,采用\small 2^{k}个变换,而不是理想分组密码的\small 2^{n}!个可用变换。(略微不太好理解。。。)

特别地,Feistel建议的密码要能交替地使用代替和置换。代替和置换的定义如下。

  • 代替  每个明文元素或元素组被唯一地替换为相应的密文元素或元素组。
  • 置换  明文元素序列被替换为该序列的一个置换。也就是说,序列中没有元素被添加、删除或替换,但序列中元素出现的顺序改变了。

实际上,这是Claude Shannon提出的交替使用混淆和扩散的乘积密码的实际应用。

混淆和扩散  Shannon引进混淆和扩散这两个术语来表征任何密码系统的两个基本构建。他关注的是如何挫败基于统计方法的密码分析。理由如下:假设攻击者拥有明文统计特征的知识,如某种人类语言的可读信息,其不同字母的频率分布是已知的,或者已知信息中极有可能出现某些单词或短语。如果这些特征以任何形式出现在密文中,那么密码分析者就有可能推导出密钥或密钥的一部分,至少是包含确切密钥的一个密钥集。在Shannon所指的强理想密码中,密文的所有统计特征都是独立于所用密钥的。前面所讲的任意代替密码(理想分组密码)就是这样一种密码,不过,正如我们所见,它是不可能获得实际应用的。

舍弃对理想系统的追求,Shannon提出了两种对付统计分析的方法:扩散和混淆。扩散是指使明文的统计特征消散在密文中,这可通过让每个明文数字尽可能地影响多个密文数字获得,等效于每个密文数字被许多明文数字影响。

每个分组密码都是明文分组到密文分组的变换,而这个变换又是依赖于密钥的。扩散的方法是尽可能地使用明文和密文之间的统计关系变得复杂,以挫败推导出密钥的企图。另一方面,混淆则是尽可能使密文和加密密钥间的统计关系变得复杂,以阻止攻击者发现密钥。因此,即使攻击者拥有一些密文的统计特征信息,利用密钥生成密文的方法的复杂性也会使得推导密钥变得及其困难。这可用一些复杂的代替算法来实现,简单的线性代替函数几乎增加不了混淆。

Feistel密码结构 图4.3中描述了Feistel提出的结构。加密算法的输入是长度为2w位的明文分组和密钥K。明文分组被分为等长的两部分:\small LE_{0}\small RE_{0}。等长的这两部分数据经过n轮迭代后,组合成密文分组。第i轮迭代输入\small LE_{i-1}\small RE_{i-1}来自上轮迭代的输出;输入的子密钥\small K_{i}是由整个密钥\small K推导出来的。一般来说,\small K_{i}不同于\small K,也互不相同。尽管可以使用任意的轮数,但图4.3使用了16轮。

每轮迭代都有相同的结构。代替作用在数据的左半部分。它将轮函数F作用于数据的右半部分后,与左半部分的数据进行异或运算。每轮迭代的轮函数是相同的,但输入的子密钥\small K_{i}不同。换句话说,是长度为w位的右半分组及长度为y位的子密钥的函数,输出w位的值\bold{F(RE_{i},K_{i+1})}。代替之后,交换数据的左右两半,完成置换。这种结构是Shannon提出的代替置换网络(Substitution-Permutation network,SPN)的一种特殊形式。

Feistel结构的具体实现依赖于一下参数和特征。

  • 分组长度         分组长度意味着安全性越高(其他数据不变),但会降低加解密的速度。这种安全性的增加来自更好的扩散性。一般来说,64位分组长度比较合理,在分组密码设计中常用。然而,高级加密标准使用的是128位分组长度。
  • 密钥长度         密钥较长同样意味着安全性较高,但会降低加解密速度。这种安全性的增加来自更好的抗穷尽攻击能力和更好的混淆性。现在一般认为64位密钥不够。通常使用的密钥长度是128位。
  • 迭代轮数          Feistel密码的本质是单轮加密不能提供足够的安全性,而多轮加密可获得很高的安全性。迭代轮数的典型值是16。
  • 子密钥生成算法              子密钥生成越复杂,密码分析就越困难。
  • 轮函数F            同样,轮函数越复杂,抗攻击的能力就越强。

 密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记_第1张图片

 图4.3 Feistel加密和解密(16轮)

设计Feistel 密码还有两个其他方面的考虑。

  • 快速软件加解密    在许多情况下,加密算法被嵌入应用程序,以避免硬件实现的麻烦。因此,算法执行的速度很重要。
  • 简化分析难度    尽管我们喜欢把算法设计得使密码分析仅可能困难,但将算法设计得容易分析也有好处。也就是说,如果算法描述起来简洁清楚,那么分析其脆弱性也就容易一些,因而可以开发出更强得算法。不过DES并没有容易得分析方法。

Feistel解密算法  Feistel密码的解密过程本质上与加密过程一致。规则如下:将密文作为算法的输入,但逆序使用子密钥K_{i}。也就是说,第一轮使用K_{n},第二轮使用K_{n-1},最后一轮使用K_{1}。这是一个很好的特点,因为我们不需要分别实现加密和解密两个算法。

图4.3中显示了用逆序密钥和相同算法解密的过程。加密过程在图的左边,自上而下,解密过程在图的右边,自下而上,共进行16轮算法(无论多少轮,结果都是相同的)。为清楚起见,我们用LE_{i}RE_{i}表示加密过程中的中间数据,用LD_{i}RD_{i}表示解密过程的中间数据。图中表明,每轮的解密过程中间值与加密过程中间值左右互换的结果是相同的。换句话说,第i轮加密的输出是LE_{i}||RE_{i},解密的第16-i轮的对应输入是RE_{i}||LE_{i}LD_{16-i}||RD_{16-i}

下面按照图4.3,通过计算来证明上述说法的正确性。加密过程的最后一轮迭代后,输出数据的两部分互换,所以密文是RE_{16}||LE_{16}。现在将它作为同一个算法的输入。第一轮的输入是RE_{16}||LE_{16},它应等于加密过程第16轮输出左右部分互换的值。

4.2 数据加密标准

在2001年高级加密标准(AES)提出之前,数据加密标准(DES)一直是使用得最广泛的加密方案。DES于1977年被美国国家标准局(National Bureau of Standards,NBS),即现在的美国国家标准和技术协会(National Institute of Standards and Technology,NIST)采纳为联邦信息处理标准46(FIPS PUB 46)。这个算法本身指的是数据加密算法(Data Encryption Algorithm,DEA)。DES采用了64位的分组长度和56位的密钥长度。它将64位的输入经过一系列变换后,得到64位的输出。解密则使用了相同的步骤和相同的密钥。

经过多年的发展,DES已经成为主流的对称加密算法,特别是在金融领域应用广泛。1994年,NIST决定将DES联邦使用期延长了5年。NIST推荐在一般商业应用中使用DES,而不用DES来保护官方机密。1999年NIST颁布了标准的新版本(FIPS PUB 46-3),新版本规定DES只能用于(历史)遗留系统和3DES中。第7章将介绍3DES。因为DES与3DES的加解密算法是相同的,所以理解DES算法仍然有很重要的意义。有关这一内容的详细描述,有兴趣的读者可以参阅附录C。

4.2.1 DES加密

图4.5显示了DES加密的整个机制。对于任意的加密方案,总有两个输入:明文和密文。DES的明文长度为64位,密钥长度为56位。

从图4.5的左半部分可以看出明文的处理经过了三个阶段。首先,64位明文经过初始置换IP被重新排列。然后进行16轮相同函数的作用,每轮作用都有置换和代替。最后一轮迭代的输出有64位,他是输入明文和密钥的函数。左半部分和右半部分互换产生预输出。最后预输出被与初始置换IP互逆的置换IP^{-1}作用产生了64位密文。除了初始和末尾的置换,DES的结构与图4.3所示的Feistel密码结构完全相同。

图4.5的右半部分给出了使用56位密钥的过程。首先,密钥经过了一个置换,再经过循环左移和一个置换,分别得到各轮子密钥K_{i}用于各轮的迭代。每轮的置换函数是相同的,但密钥的循环移位会使得各轮的子密钥互不相同。

密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记_第2张图片

 4.2.2 DES解密

Feistel密码的解密算法与加密算法是相同的,只是子密钥的使用次序相反。此外,初始置换和最终置换是相反的。

4.3 DES的一个例子

密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记_第3张图片

4.3.1结果 

密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记_第4张图片

密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记_第5张图片

4.3.2 雪崩效应

 密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记_第6张图片

 密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记_第7张图片

4.4 DES的强度

自从DES被采纳为联邦标准后,人们对它的安全性就一直争论不休,焦点主要集中在密钥长度和算法本身的性质上。

4.4.1 56位密钥的使用

密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记_第8张图片 密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记_第9张图片

 所幸的是,存在大量DES的替代算法,最重要的有AES和3DES,分别详见第6章和第7章。

4.4.2 DES算法的性质

密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记_第10张图片

4.4.3 计时攻击 

密码编码学与网络安全——原理与实践(第八版)------第4章 学习笔记_第11张图片

4.5 分组密码的设计原理

 尽管在设计具有强密码学意义的分组密码方面有了很大的进展,但是自20世纪70年代早期Feistel和DES设计小组所做的工作以来,基本设计原理并无大的改变。本节重点讨论分组密码设计的三个主要问题:迭代轮数、函数F的设计和密钥的使用方案。

4.5.1 迭代轮数

Feistel密码的强度来自三个方面:迭代轮数、函数F和密钥使用算法。首先介绍轮数的选择。

迭代轮数越多,密码分析就越难,即使F相对较弱也同样适用。一般来说,迭代轮数的选择标准是使密码分析的难度大于简单穷举攻击的难度。DES的设计中当然使用了这个标准。Schneier观察发现[SCHN96],对16轮迭代的DES,差分密码分析要比穷举攻击的效率差一些:差分密码分析需要2^{55.1}次操作,而穷举攻击平均需要2^{55}次操作。如果DES只用15轮或更少的轮数,那么差分密码分析的效率就要比穷举攻击的效率高一些。

这个标准很有吸引力,因为它使得判别算法强度和比较算法优劣变得容易。如果在密码分析方面没有突破,那么任何满足这个标准的算法强度要根据密钥长度进行判断。

4.5.2 函数F的设计

Feistel密码的核心是函数F。函数F给Feistel密码注入了混淆的成分,因此难以破解由F实现的这个代替密码函数的功能。前面讲过,F的一个明显准则是非线性。F的非线性成分越多,分析就越困难。非线性有多种度量方法,但这个话题超出了本书的范围,此处不多赘述。粗略来说,越难将F近似表示为某些线性公式,F的非线性度就越高。

设计F时还应考虑其他几个准则。我们希望算法有较好的雪崩效应,即输入的一位变化应该引起输出的多位变化。一个更严格的定义是严格雪崩效应准则(Strict Avalanche Criterion,SAC)[WEBS86],即对所有的i和j,它要求若S盒的输入的任意一位i发生变化,则输出的任意一位j发生变化的可能性为1/2(见附录对S盒的讨论)。尽管SAC是针对S盒而言的,但作为一个准则,它同样使用于整个F函数。当F中不含S盒时,这条准则很重要。

文献[WEBS86]中建议的另一个准则是位无关准则(Bit Independence Criterion,BIC),即对任意的i,j,k,当输入中的位i发生变换时,输出中的位j和位k的变化是彼此无关的。SAC和BIC的目的是为了加强混淆的有效性。

4.5.3 密钥扩展算法

对于任何Feistel分组密码,密钥都被用来为每轮迭代产生一个子密钥。一般来说,子密钥的选择应该加大推导子密钥及密钥种子的难度。目前还没有这一方面的一般性原理见诸报道。

Adams认为[ADAM94],密钥扩展算法至少应保证密钥和密文符合严格雪崩效应准则和位无关准则。

你可能感兴趣的:(自学密码学,密码学)