本文转载自:《现代密码学》课程笔记知乎专栏
仅作个人学习记录。
分组密码具有一些安全问题——如果使用相同的密钥对相同的明文进行加密,则会导致频率特征泄露。
分组密码的工作模式可以对原有的分组密码算法进行加强,使分组密码能够应用于实际加密中。
分组密码的工作模式相当于一个使用了分组密码算法的框架。在本文中,分组密码算法(比如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的密文块需要按顺序逐一解密,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中,方框内的部分可以进行预处理,在加解密之前就先计算出密钥流。
前面分组中的错误不会影响到后面明密文的加解密。这是因为前面的明密文没有反馈到后面的分组中。