学习笔记2

第三章 分组密码

3.1 什么是分组密码

分组密码是加密固定长度数据分组的加密函数。最新一代分组密码的分组长度为128位(16字节),这些分组密码加密128位的明文以产生128位的密文。分组密码是可逆的,有一个解密函数将128位密文解密得到原先的128位明文。明文和密文的长度总是相同,我们将它称为分组密码的分组长度。

用分组密码进行加密,我们需要一个密钥,没有密钥就无法隐藏消息。就像明文和密文一样,密钥也是一个位串,常见的密钥长度为128和256位。我们通常用E(k,p)或者E_k (p)来表示使用密钥K对明文p进行加密,用D(k,c)或D_k (c)表示用密钥K对密文c进行解密

在使用分组密码进行加密时,我们应当遵循Kerckhoff原则,加密和解密所使用的算法是公开的,只有密钥是保密的。

可以把分组密码看作一个非常庞大的密钥映射表。对于任何固定的密钥,可以计算出个查找表,用于明文到密文的映射。这个表相当巨大,对于一个分组长度为32位的分组密码,该表大小为16GB;如果分组长度为64位,那么查找表的大小为1.5亿TB;如果分组长度增至128位,表的大小将会是5×1039字节。

由于分组密码是可逆的,也就是说表中没有两项明文对应的密文是相同的,否则解密函数不可能将密文解密为唯一的明文。因此这个庞大的表将包含所有可能的密文值一次。这就是数学家所谓的置换:该表包括了所有元素的重新排列。一个分组长度为k位的分组密码对于每一个密钥都对应一个k位值的置换。

3.2 攻击类型

有关分组密码的攻击:

  • 相关密钥攻击:由 Eli Biham于1993年首次提出,相关密钥攻击假设攻击者在已知加密函数、未知密钥的情况下通过这些函数密钥之间的相关性进行攻击。
  • 选择密钥攻击:攻击者选择密钥的一部分进行攻击,对剩余部分采取相关密钥攻击。

攻击分析:
第一,相关密钥攻击是针对实际系统的攻击。事实上,在分组密码的标准协议中需要的两个密钥有如下关系:一个密钥K是随机产生的,另一个密钥K^'是K加上一个固定的常数。
第二,分组密码是非常有用的基本组件,但常常被误用。为此, Davies-Meyer提出了一种从分组密码中构造散列函数的标准技术,称为 Davies-Meyer构造。在Davies-Mayer散列函数中,攻击者可以随时选择分组密码的密钥,进行相关密钥攻击和选择密钥攻击。
任何分组密码安全的定义如果不考虑这些攻击类型(或其他任何攻击类型),都是不完整的。

3.3 理想分组密码

理想分组密码的核心是随机置换。需要明确的是:对于每个密钥值,分组密码都是一个随机置换,而且不同密钥对应的置换应该是完全独立的。理想分组密码包括了每个密钥值对应的查找表,每个表都是从所有可能的置换集合中随机选择的。

3.4 分组密码安全的定义

  • 一个安全的分组密码能够抵抗所有的攻击
  • 分组密码攻击是将分组密码从理想分组密码中分离开来的一种非通用方法
  • 理想分组密码能够为每一个密钥值实现独立选择的随机偶置换

3.5 实际分组密码

这些年来人们已设计了数百种分组密码。设计一种新的分组密码很容易,但是设计出好的新分组密码就十分困难了。不仅仅需要考虑安全性,因为设计分组密码要考虑安全性是不言而喻的,设计安全的分组密码本身就是个挑战,但是构造在多种应用中都高效和安全的分组密码更加困难。
几乎所有的分组密码都由一个弱分组密码的多次重复组成,每一次运算被称为一轮。经过连续多轮的弱重复运算可以实现一个强分组密码。这种结构易于设计和实现,对分析分组密码很有帮助。大多数针对分组密码的攻击都是从轮数较少的版本开始,随着攻击方法的改善,逐渐攻击更多轮的版本。

3.5.1 DES

数据加密标准(DES)是应用最广泛的一种分组密码算法,但由于它仅仅56位的密钥长度和64位的分组长度严重地限制了算法的安全性,已经不适合今天的快速计算机和大量数据运算的情况。随之取代它的是一种称为3DES的分组密码算法,它以某种特殊的顺序使用两个密钥执行三次DES加密,用第一个56位密钥执行DES,然后用第二个56位密钥执行DES逆运算即解密函数,最后用第一个56位密钥进行加密。这种算法解决了位数过少的密钥带来的安全问题,但是并没有解决数据分组长度过短的问题。DES已经不是现行标准下的快速加密方法。3DES也只有DES执行速度的三分之一。可能在很多系统中会遇到DES算法,但是在新的设计中并不推荐使用DES或者3DES。但是,DES作为一个经典的设计,仍然具有研究的价值。

DES算法有64位明文,首先对明文进行IP置换,再将明文从中间分成左右两部分,分别是32位的L和R。

然后再进行16轮加密,每一轮使用一个48位的轮密钥K_i,这16个轮密钥是从分组密码的56位密钥K中选择48位生成的。

如图3-1所示,虚线框之内的表示轮函数F。轮函数通过一系列的运算改变(L,R)的值。32位的R值首先要经过扩展函数得到48位的输出。然后和轮密钥K_i进行异或并将结果输人S盒。S盒是一个公开的查找表。48位的输入被分成一些组,每组大小约为4~6位。S盒将48位的向量通过非线性映射成为32位的向量。这32位经过位变换函数后与L异或得到新的L,将此L和R的值互换,进入新一轮的加密。如此重复16轮就是一个完整的DES加密。

DES算法的基本结构称为 Feistel结构。每一轮通过L和F(K_i,R)的异或生成新的L,然后将L与R交换,该设计的巧妙之处在于解密函数可以使用相同的运算,只需要将L和R的值交换。所以在分析时,只需要分析加密函数或者解密函数中的一个。还有一点需要注意的是最后一轮计算后的输出结果不需要交换L和R,因此除了轮密钥的顺序之外,加密和解密函数几乎相同。这种设计对于硬件实现是非常有好处的,因为可以使用相同的电路进行加密和解密的计算。

根据安全定义,DES算法有很多特有的性质。比如,每一轮的轮密钥都是由分组密码的主密钥的某些位生成的。如果主密钥为0,那么所有的轮密钥都是相同的,也都为0。上面提到加密和解密的唯一区别就是轮密钥的顺序,因为所有的轮密钥都是0,所以所有的加密密钥和解密密钥也都相同了。这是一个非常容易检测的性质,而理想分组密码没有这个性质。它容易导致简单而高效的区分攻击。

如果使用取反的密钥加密取反后的明文,那么所得的密文是原密文的取反。可以利用这个性质对DES系统进行攻击。

3.5.2 AES

高级加密标准(AES)是美国政府制定用来取代DES算法的标准。美国国家标准与技术研究所(NIST)并没有采用委托设计的方法而是发起征集,寻求密码学界的建议。共提交了15个提案,其中5个被选入围,最后 Rinjdael算法被选中成为AES,AES在2001年成为标准。

AES与DES不同,没有采用Feistel结构,一轮的AES加密过程如图3-2所示。

输入16字节的明文,首先将明文与16字节的轮密钥进行异或操作,,然后进入到S盒内,按照特定的顺序重新排列输出。最后分为4组,使用线性混合函数进行异或运算得到输出结果。

整个AES算法的轮数为10~14轮,轮数的选择取决于密钥的长度。AES的密钥长度有128位、192位、256位。使用128位密钥加密10轮,192位密钥加密12轮,256位密钥加密14轮。AES算法和DES算法一样有一个子密钥生成器来产生轮密钥,但子密钥生成器有着不同的结构。

虽然AES是一种好的设计方案,但目前的攻击也取得了重要的突破,从理论来看,192位和256位的AES都是可以被攻破的,而且随着时间的推移,可能会出现更有效的攻击。

3.5.3-3.5.5

其他四个AES的备选算法:Serpent、Twofish、RC6和MARS。

3.5.6 如何选择分组密码

随着攻击AES算法的密码分析不断取得进展,选择AES作为加密算法似乎很难让人放心。尽管如此,我们仍然推荐AES算法。它的执行速度很快,而且所有目前针对该算法的攻击都是理论上的,都是非实际的。即使AES算法在理论上被完全攻破,也并不意味着在实际系统中的应用不再安全。

同时AES相对容易使用和实现,所有的密码库都支持该算法。

当密码系统需要向后兼容或某些部分被限定为只能使用64位长度的分组时,可以考虑使用3DES,但是这也可能导致3DES不能满足安全标准。

3.5.7 如何选择密钥长度

在大多数的分组密码中,对于一个n位的安全等级,分组密码的长度应该为2n位长。
通常在分组密码安全的情况下,比起128位密钥的分组密码,我们更倾向于使用256位密钥的分组密码,但对于AES来说情况有些复杂。目前,192位密钥和256位密钥长度的AES算法并不安全。已经有攻击针对192位密钥和256位的子密钥生成器的弱点。这就是对256位密钥的攻击比对192位密钥的攻击更有效的原因,也是目前没有针对128位密钥的攻击的原因。

第四章 分组密码工作模式

分组密码只能加密固定长度的分组,如果需要加密一段并非恰好一个分组长度的数据就需要使用分组密码工作模式,这也用来指称使用某个分组加密算法来构造的加密函数。
本章所讨论的加密模式可以防止窃听者读取所加密的消息流,但它们不提供任何认证,因此攻击者仍可以篡改消息,有时甚至可以任意方式篡改。

4.1 填充

一般来说,分组密码工作模式是一种将一段明文P加密为密文C的方法,其中明文和密文可以是任意长度。大多数模式要求明文P的长度恰好是分组大小的整数倍,这就需要对明文进行填充。有多种填充明文的方法,但需要遵循的最重要的规则是:填充必须是可逆的,也就是说必须可以从填充后的消息中唯一地恢复出原始消息。
一般地,分组密码有两种填充方式。用P表示明文,用l(P)表示P的长度,单位为字节,b为分组大小,单位也是字节。

在明文接下来的一个字节中填充128,然后填充0直到整个长度达到b的倍数,填充0的字节数介于1,2,⋯,b-1之间。

首先计算要填充的字节数,该字节个数n满足1≤n≤b,并且n+l(P)是b的倍数。然后在明文后附加n个字节,每个字节填充的值为n。

4.2 ECB

电子密码本(ECB)是最简单的加密长明文的工作模式,ECB的工作模式非常简单,只需要分别加密明文消息的每个分组。

如果两个明文分组是完全相同的,那么相应的密文分组也是相同的,这对攻击者是可见的。依赖于消息的结构,这会向攻击者泄露很多信息。

在很多情况下会出现重复的大分组文本,如果两次出现都恰好落在分组的范围内,那么表示一个明文分组重复出现了。在大多数的Unicode字符串中,每隔一个字节有一个0值,这就极大地增加了出现重复分组的机会。很多文件格式中会出现由多个0组成的大分组,这也导致大量重复分组的出现。总的来说,这个性质使得ECB模式基本不会被使用。

由此可见ECB模式有严重的缺陷,需要尽量避免使用。

4.3 CBC

密码分组链(CBC)是应用最为广泛的分组密码工作模式之一,通过将每个明文分组与前一个密文分组进行异或操作,使用前一个密文分组来实现“随机化”,使得相同的明文分组被加密为不同的密文分组,显著地减少了攻击者可获得的信息,可以避免ECB模式的问题。其中C_0被称为初始化向量,或者IV。

IV的选取也有以下几种方法:

  • 固定IV,这是不太好的做法,如果两个不同消息的首个明文分组相同,那么它们对应的起始密文分组也会相同
  • 计数器IV,对于第一个消息,让IV=0;对于第二个消息,让IV=1。这同样是不好的做法,因为实际应用中很多消息内容的开头都是相似的,如果不同消息的第一个块差别较小,那么经过异或操作,计数器IV就可能抵消这个差别,重新生成相同的密文分组。
  • 随机IV,IV是随机值,这就引发了另一个问题,随机选择的IV必须让解密方知道,才能够正确解密。一个标准的解决方案是选择随机IV并作为第一个密文块放在消息所对应的密文之前发送给接收者。
    主要缺点就是密文比明文多一个分组,对于长度较短的消息来说,将导致消息长度的显著增长,影响传输效率。
  • 瞬时IV,在该方案中,每一个用该密钥加密的消息都被分配一个唯一的数,称为瞬时值(nonce, number used once),瞬时值的关键是它的唯一性,对于同个密钥,相同的瞬时值不能使用两次。通常,瞬时值是消息的某种编号,可能与其他信息结合而构成。在大多数系统中本已对消息进行编号,如用于保证消息正确的顺序或者检测重复消息等。瞬时值本身不需要保密,但一个瞬时值只能使用一次。
    在CBC模式中,就是用瞬时IV加密的方法来得到初始向量IV。

4.4 OFB

上面两种模式都是用分组密码对消息分组实现加密,输出反馈模式(OFB)与之不同,它并不是将消息作为加密函数的输入进行加密,相反,输出反馈模式使用分组密码生成一个伪随机字节流(称为密钥流),然后将其与明文进行异或运算得到密文。这种用生成随机密钥流进行加密的方案称为流密码。

OFB的一个优点是它的解密运算和加密运算完全相同,这样实现起来非常容易。因为仅需要实现分组密码的加密函数,而无须再实现解密函数。

OFB的另一个优点是不需要对明文进行填充。如果将密钥流看作一个字节序列,加密时可以使用和消息明文同样长度的字节。换句话说,如果最后一个明文分组并非“全满”,那么只需要发送那些和明文对应的密文字节。无须对明文进行填充,降低了开销,这一点对长度较短的消息来说非常重要。

但是OFB模式同样存在缺陷,如果有两个消息使用了同一个IV,那么这两个消息就会被相同的密钥流加密,这说明攻击者可以计算出两个明文的差别。如果攻击者已知其中一个明文,那么能很容易求出另一个明文。

OFB的另一个问题是如果一个密钥分组重复出现,那么随后密钥分组序列就与之前的重复了。对于长度较大的消息来说,密钥分组序列中有可能出现循环。另外,如果一个消息的IV与另外一个消息所对应的密钥分组序列中的某一个密钥分组相同,那么两个消息的部分就使用了相同的密钥流。在这两种情况下,都使用相同的密钥流对不同的消息分组进行加密,这不是一种安全的加密方案。

4.5 CTR

计数器模式(CTR),CTR已经投入使用多年,但一直没有成为DES的标准模式

CTR生成密钥流的方法很简单,将瞬时值与计数器值连接起来,然后进行加密产生密钥流的一个密钥分组,这要求两者连接长度不能超过单个分组的大小。

在使用CBC或CTR时,必须保证IV或瞬时值的唯一性。

4.6 加密与认证

近年来,又有一些新的分组密码工作模式被提出,NIST将两个工作模式定为标准,称作CCM模式和GCM模式,可以同时提供认证和加密。

4.7 如何选择工作模式

CTR是一种很好的工作模式,但是希望生成唯一的瞬时值比较困难;而随机IV下的CBC模式式虽然有一些缺点(密文更长,明文需要填充,系统需要随机数生成器),但是具有更强的健壮性,即使误用也能很好地工作。

加密模式仅仅提供保密性,也就是说,攻击者无法获取所传输的数据的信息,但不包括你正在通信、在何时通信、通信的数据量、在和谁通信等这些信息。对这些外部信息进行的分析称为流量分析(traffic analysis)。

4.8 信息泄露

任何分组密码模式都会泄露一些信息。
ECB的缺陷不再赘述。
讨论CBC模式,加入存在两个相同的密文块C_i=C_j,由CBC模式可得C_i=E(K,P_i⨁C_(i-1) )=C_j=E(K,P_j⨁C_(j-1) ),两边解密可得P_i⨁C_(i-1)=P_j⨁C_(j-1),移项可得P_i⨁P_j=C_(i-1)⨁C_(j-1),这说明两个明文分组的差别等于对应密文分组的异或。如果明文分组中有大量冗余,那么就可能包含足够的信息来恢复两个明文分组。

4.8.1 碰撞的可能性

假设总共加密M个明文分组,在这(M(M-1))⁄2个不同的明文对中,任意一对相等的可能性为2(-n)(n为分组长度),所以相同明文分组对数量的期望值为(M(M-1))⁄2(n+1) 。当M≈2(n⁄2)时期望值接近于1,说明加密大约2(n⁄2)个明文分组就可以期望得到相同密文分组。

此外,加密较小的数据量时也会出现风险。

4.8.2 如何处理信息泄露

目前来说,如何处理信息泄露还没有一个令人满意的解决方案,但是可以通过对CTR或CBC模式中一个密钥所处理的数据量加以控制。当一个密钥即将到达数量限制时,可以通过密钥协商方案建立一个新的密钥。

问题与思考:

问题与思考:

  1. 对于128位长度的分组,采用32位字操作,为什么只有很小的几率产生奇置换?
  2. 在密码学课程中学习过,除了DES的取反特性,DES还有其他一些缺陷,比如弱密钥和半弱密钥,比如“\x01\x01\x01\x01\x01\x01\x01\x01”、“\xFE\xFE\xFE\xFE\xFE\xFE\xFE\xFE”等,使用此类密钥会使得轮密钥全都为零或一,或者零一交替,经过两次加密就可得到明文。
    在DES、IDEA和RC4中都存在此问题,但是本书中较少提及这个概念。
  3. 如何针对192位和256位子密钥生成器的弱点,对AES进行攻击?
  4. 在AES算法中,并非与一般所想一致:密钥更长更安全,因为已经有攻击能够针对192位和256位子密钥生成器的弱点,所以使用此类密钥的AES反而不够安全。
  5. ECB模式最为简单,但是安全性也最差。
  6. CBC模式中,每个密文块都依赖于它前面的所有明文块,同样的明文组不会被加密成相同的密文组,可以有效保证其安全性;但也存在一定缺陷,加密过程是串行的,无法被并行化,而且消息必须被填充到块大小的整数倍;假如在传输时发生差错,对包含某些错误比特的密文解密时,会导致其对应的明文块完全改变和下一个明文块中对应位发生改变;还有就是初始IV的随机化选取比较困难。
  7. 在加密芯片中生成唯一的瞬时值真的是一个很难的过程吗?是否是因为内存限制?
  8. 对一个密钥所处理的数据量加以限制是一个好的想法,当一个密钥将要达到数量限制时,可以再协商出一个新的密钥。简单来看,对于长报文或大文件,可以切分为若干部分,每一部分都用不同的密钥进行加密通信。
posted @ 2023-03-04 11:00  acacacac  阅读(116)  评论(0编辑  收藏  举报