【密码学】(四)分组密码的五大工作模式

  • ~5.02K 字
  1. 1. 一、电码本模式(ECB)
  2. 2. 二、密文分组链接模式(CBC)
  3. 3. 三、密文反馈模式(CFB)
  4. 4. 四、输出反馈模式(OFB)
  5. 5. 五、计数器模式(CTR)

本文转载自:《现代密码学》课程笔记知乎专栏
仅作个人学习记录。

分组密码具有一些安全问题——如果使用相同的密钥对相同的明文进行加密,则会导致频率特征泄露。

分组密码的工作模式可以对原有的分组密码算法进行加强,使分组密码能够应用于实际加密中。

分组密码的工作模式相当于一个使用了分组密码算法的框架。在本文中,分组密码算法(比如DES、AES等)的使命不是对明文加密、对密文解密,它在工作模式中仅仅充当了一个运算函数的角色。也就是说,算法本身可能并没有对明、密文进行操作。工作模式的使命才是对明文加密、对密文解密。

一、电码本模式(ECB)

1、概述:

电码本模式(Electronic Code Book,ECB)就是使用相同的密钥对明文组进行加密,一次只加密一组明文。解密时也使用相同的密钥对密文组进行解密,一次解密一组密文。

2、明文分组:

假设明文分组长度为b,则可以将明文分为b位一组的明文组,必要时,可对最后一个明文组进行填充。

3、加解密过程:

如果每个明文分组被记为 ,密文分组被记为 ,则加解密过程如下图所示:

图7-1 ECB模式图示

在这种工作模式下,一个明文组只能固定地被加密成一个对应的密文组,一个密文组也只能固定地被解密成对应的密文组。他们彼此是一一对应的。设想我们有一个厚厚的密码本,每次加密时,我们只需要从密码本中查出明文所对应的密文就可以。这也是电码本模式名称的由来。

ECB加解密方式可以表示为:

图7-2 ECB模式加解密方式

4、ECB的特征:

对于短消息,ECB模式是比较适用的。但对于长消息,ECB模式就不太安全了。这是因为长消息中会经常对相同的明文分组进行加密,得出相同的密文,这回导致频率特征暴露,造成安全隐患。

二、密文分组链接模式(CBC)

1、加解密方式:

密文分组链接模式(Cipher Block Chaining,CBC)中,加密算法的输入是明文分组和前一个密文分组的异或,同样均使用相同的密钥进行加密。其中第一个明文加密时,需先与初始向量 异或,再进入加密算法进行加密。如下图所示:

图7-3 CBC模式图示

就像前面说的那样,图中第一个明文分组 先与初始向量 异或,然后被加密为密文 。接下来 与下一个明文分组异或,得到的结果被加密为 ,以此类推。所有的加密和解密都使用同一个密钥

解密时,先对密文分组进行解密,然后再与上一个密文分组进行异或,即可得到明文分组结果。同样,第一个密文分组 在解密后,需与初始向量 异或,才能得到明文

加解密方式如下图所示(左为加密,右为解密):

图7-4 CBC模式加解密方式

2、CBC的特征:

与ECB类似,如果对明文分组后,最后一组不够分组位,可以对最后一组进行填充。

其中第一个分组使用的初始向量 是随机生成的一个值,每次通信中 的值都不同。

由于每次 的值都不同,因此相同的明文,使用相同的密钥进行加密,其加密的结果不同。

在每次发送消息时,发送方应该把 的值也秘密发送给接收方。即对于 个明文分组,CBC将输出 个密文分组( 也被算作密文分组的一部分)。

如果 被公开,则攻击者可能会篡改 ,导致第一块密文解密失败。

CBC模式存在错误传播的可能,如果前一块密文接收失败,那么会影响下一块密文的解密,但是并不会影响下下块密文的解密,最多只能影响一块,即CBC模式具有自同步功能。

CBC的密文块需要按顺序逐一解密,ECB模式可以同时解密。

三、密文反馈模式(CFB)

1、概述:

与ECB、CBC不同,在CFB(Cipher Feedback,CFB)模式下,明文本身并没有进入加密算法中进行加密,而是与加密函数的输出进行了异或,得到了密文。CFB以及后面要讲的OFB、CTR模式都具有这样的特征,这是流密码的典型特征。此外,CFB不需要将明文分组填充到分组长度的整数倍,可以实时操作。

另外,CFB以及OFB、CTR模式下的加解密中,都只使用了加密算法,而没有用到解密算法。这是由于明文并没有实际进入到加密算法中,只是与加密算法的输出进行了异或。

2、分组长度:

[!note] 补充:加密算法的分组长度、明文的分组长度区分
加密算法的分组长度:是指输入加密算法内容的分组长度。这里的加密算法是指常用的分组加密算法,如DES、AES等。由于这些算法的输入必须符合一定的分组长度,因此加密算法输入的分组长度通常是受到算法限制的。
明文的分组长度:是指明文自己的分组长度。在前面的ECB、CBC模式下,明文需要被输入到加密算法中,因此这时的明文分组长度=加密算法的分组长度。但是在CFB以及后边要讲的OFB、CTR中,明文并没有被输入加密算法中。在这种情况下,明文的分组长度可以不与加密算法的分组长度一致,甚至可以是任意的。

CFB模式下,加密算法的分组长度(假设为b位)不会影响明文的分组长度(假设为s位)。如果加密算法为DES,则b=64;如果加密算法为AES,则b=128。这些都只影响加密算法的输入位数。明文的分组长度s一般是任意的,如果s=1,则一位一位地加密;如果s=8,就一个字节一个字节地加密。比较常用的是s=8。因此,CFB模式下,不需要对明文的最后一个分组进行填充,最后剩下几位就按几位加密即可。

3、加解密方式:

[!note] 补充:分组密码的加解密算法、分组密码工作模式的加解密区分
分组密码的加解密算法:一般指常见的分组密码算法,如DES、AES等。其中每个算法都包括加密和解密两个过程。它们被运用到了各种不同的工作模式中。在本文中,他们的加密和解密不一定要对明文和密文进行操作,可能只是对某个输入进行了运算。

分组密码工作模式的加解密过程是指对明文、密文的加密和解密
在分组密码工作模式的加密过程或者解密过程中,可能用到分组密码的加密算法或者解密算法,也可能只用到了加密算法(比如CFB、OFB、CTR)。这两者是没有必然关系的。

图7-5 CFB模式图示

如图所示,加密算法的输入是一个b位移位寄存器的值,输出也是一个b位的值。在输出的b位值中,选择左边的高s位与s位的明文进行异或,得到s位的密文。以此同时,下一组的移位寄存器向左移动s位。然后将刚才得到的s位的密文填充到下一组移位寄存器的低s位。

在这个过程中,加密算法输出的低b-s位被丢弃。所有的加密算法均使用相同的密钥进行加密。

另外,由于第一个明文分组的加密算法没有前一组密文的填充,因此需要一个b位的初始向量()作为第一组加密算法的输入。

补充:
密钥和密钥流:
在本文中,密钥是指加密算法E(K,P)的一个输入K。在图中可以看出,所有分组的密钥都是相同的。
由于CFB和接下来的OFB、CTR非常类似于流密码,而且其加密算法的输出也就是在发挥一种类似于流密码密钥的作用(与明密文异或),所以我们把加密算法的一系列输出称为密钥流。
这里的称谓可能不太规范,但是为了方便表达意思,所以就勉强这样说了。采用别的称谓也可以,能够自圆其说就行。

CFB的加密和解密均只用到了加密算法,这是因为,CFB只是利用加密算法产生了密钥流,与明文进行异或。明文根本没有进入到加密算法中。因此,在解密时,也只需要再次使用加密算法,再次生成密钥流,与密文异或,从而得到明文。这个过程不需要用到解密算法。

CFB模式的加解密可以表示为:

图7-6 CFB模式加解密方式

(其中 表示加密算法的输入, 表示加密算法的输出, 是取最低 位, 是取最高 位)

4、CFB的特点:

密文块需要按顺序逐块加密。

密钥、明文相同时,IV不同,则加密结果不同。

存在错误传播的可能性:前部分密文出错,会影响后边的解密。这是因为一块密文在进入下一分组的移位寄存器后,会在接下来的几个分组中一直除以移位寄存器中。

有自同步功能:在若干分组加密后,前边错误加密的密文会移出移位寄存器,停止对后面分组的加密造成影响。

四、输出反馈模式(OFB)

1、概述:

与CFB类似,输出反馈模式(Output Feedback,OFB)也是一种类似于流密码的工作模式。在这种模式中,明文分组同样没有进入到加密算法中,加密算法只是用来计算密钥流的。

在CFB中,是将密文反馈到下一分组加密算法输入的移位寄存器中;而在OFB中,是直接将加密算法的输出反馈到下一分组加密算法的输入中

2、明文分组:

在OFB中,明文分组一般要与加密算法的输入分组一致。但是,如果明文的最后一组不够加密算法的输入分组长度,也无需填充。(处理方法见下文)

3、加解密方式:

图7-7 OFB模式图示

假设加密算法的分组长度为b位。从图中可以看出,加密算法的b位输入来自于上一个分组加密算法的b位输出。同样,如果是第一个分组,就需要一个初始向量时变值来充当加密算法的输入。

在经过加密算法后,得到b位输出结果。这个结果再与b位的明文分组进行异或,即得到密文分组。

另外,所有加密算法的密钥都是相同的。加密算法仅仅用来产生密钥流,而没有对明文进行加密。真正的加密过程是明文分组与密钥流的异或。

在加密时,如果最后一组明文分组的位数(假设为s位)不够b位(s<b),那也无需填充。只需要将加密算法输出密钥流的低b-s位舍去,保留s位,再与s位明文分组进行异或,得到s位密文分组。

解密过程与加密过程类似,只是改用密钥流与密文组异或,得到明文组。

与CFB相同,解密过程也只用到了加密算法,并没有用到解密算法。

OFB的加解密过程可以表示为:

图7-8 OFB模式的加解密过程

(其中 表示加密算法的输入, 表示加密算法的输出, 是取最高 位, 表示最后不够 位的明文分组加密)

4、OFB模式的特点:

OFB的初始向量是一个时变值,即每次加密时,初始向量必须有变化。初始向量是不能公布的,否则攻击者可以篡改初始向量,使得所有的密文解密失败。

在OFB中,所有的明密文分组可以同时加解密,不需要按分组顺序进行加解密。在图7-7中,虚线方框括起来的是专门计算密钥流的部分。在对明文进行加密之前,所有分组的密钥流可以提前进行计算。

在密钥完全相同的情况下,由于初始向量的不同,相同的明文,加密结果也不相同。

一组明密文的错误不会影响下一分组明密文的加解密。这是因为,传递到下一分组的知识加密算法的输出,而不是明密文。

OFB容易受到对消息的篡改攻击。比如,对密文进行一定的取反,则明文的相应位也会取反。这使得纠错码不能检测到明密文被篡改。

五、计数器模式(CTR)

1、概述:

计数器模式(counter,CTR)也是一种类似于流密码的模式。加密算法只是用来产生密钥流与明文分组异或。

2、分组长度:

CTR的分组长度一般也要与加密算法的输入分组一致。但是,如果明文的最后一组不够加密算法的输入分组长度,也无需填充。(处理方法见下文)

3、加解密方式:

图7-9 CTR模式图示

假设加密算法的分组长度为b位。在图中,加密算法的输入是一个b位计数器的值,在密钥的作用下,产生了一系列b位的密钥流。然后密钥流与b位的明文分组进行异或,得到b位的密文分组。

在这个加密过程中,每个计数器的值都不能相同。为了便于处理,首先为第一个计数器设一个初始值,然后在接下来的每一个分组中,计数器逐个加一。

如果最后一个明文分组的位数(s位)不够加密算法的分组长度(b位),即s<b,那么处理方法与OFB相同:在最后一组中,舍弃加密算法输出的右b-s位,将左边剩下的s位与明文分组进行异或,得到最后的s位密文分组。

CTR的解密方式与加密方式类似,原因与OFB相同。

其加解密方式可以表示为:

图7-10 CTR模式的加解密过程

(其中, 表示计数器的值, 是取最高 位, 表示最后不够 位的明文分组加密)

4、CTR模式的特点:

第一个计数器的值需要保密,否则会被攻击者篡改,使得加解密的所有过程失败。

与OFB相同,CTR中,所有的明密文分组可以同时加解密,不需要按分组顺序进行加解密。图7-9中,方框内的部分可以进行预处理,在加解密之前就先计算出密钥流。

前面分组中的错误不会影响到后面明密文的加解密。这是因为前面的明密文没有反馈到后面的分组中。