3.6 分组密码的工作模式
由于实际应用中数据格式的多样性和工作模式安全性的需要,人们需要对分组密码的工作模式进行定义。历史上,为了将DES应用于实际,美国国家标准局(NBS)在FIPS PUB 74和81,ANSI在ANSI X3.106中,以及ISO和ISO/IEC在ISO 9732 ISO/IEC 10116都对DES的工作模式进行了规定。在ANSI标准ANSI X3.106—1983定义了四种模式。由于新的应用和要求,2001年12月在特别公布的SP 800—38A中,NIST已将推荐模式扩展为5个,分别是电码本工作模式[Electronic Codebook(ECB)Operation Mode]、密码分组链接(Cipher Block Chaining,CBC)工作模式、密码反馈(Cipher FeedBack,CFB)工作模式、输出反馈(Output Feedback,OFB)工作模式和计数器(counter,CTR)工作模式。我国的国家标准GB/T 17964—2008《信息安全技术——分组密码的工作模式》定义了7 种工作模式。这些工作模式可以分为两大类,分别是分组密码工作模式和流密码工作模式。在设计工作模式时,主要考虑以下几种性能:安全性、有效性和容错性。
3.6.1 电码本(ECB)工作模式
最简单的模式是电码本模式,它把明文分成同样长度的分组,对每个明文分组独立地进行加密,如图3.13所示,明文为q个分组P1,P2,…,Pq所组成的序列,每个分组都是b位,密钥为K,对应的密文为q个分组C1,C2,…,Cq组成的序列,每个分组也是b位。
ECB模式的加密和解密方式可以描述为:
Ci = EK(Pi)
Pi = DK(Ci)(i = 1,2,3,…,q)
ECB模式的优点是简单和有效,可以并行实现。对于需要随机访问和处理的文件是方便的,比如数据库的记录,任何一条记录的追加、删除、加密和解密都可以独立于其他记录。
ECB模式的缺点是不能隐藏明文的模式信息,相同明文总是被加密成相同密文,同样的信息多次出现会造成泄露,另外,用同一密钥加密太多的信息会给攻击者提供统计分析的机会,使安全性降低。此外,对明文的主动攻击是可能的,如果攻击者破译了某些分组,他就可以对信息块进行替换、重排、删除和重放。ECB模式适合于传输短信息。
在ECB模式中,如果收到的一个密文分组中的一个或多个位发生差错,只会影响到发生差错的那一个分组的解密。但是如果密文分组被偶然增加或减少一位,就会影响剩余密文的解密。
图3.13 电码本(ECB)工作模式
3.6.2 密码分组链接(CBC)工作模式
为了克服ECB模式的弱点,我们需要将相同的明文分组加密成不同的密文分组,密码分组链接模式对分组密码加入了反馈机制,每组密文不仅取决于生成它的明文,还和它前面的各组明文相关。如图3.14所示,当前的明文分组与前一密文组进行异或运算后再进行加密得到当前的密文分组。CBC模式的加密和解密方式可以描述如下。
对第一个明文分组进行加密:
C1 = EK(P1 ⊕ IV)
对其他分组加密:
Ci = EK(Ci-1 ⊕ Pi)(i=2,3,…,q)
对第一个密文分组进行解密:
P1 = DK(C1)⊕ IV
对其他分组解密:
Pi = DK(Ci)⊕ Ci-1
CBC模式没有已知的并行实现算法。能够把相同的明文加密成不同的密文,隐藏明文的模式信息。某些信息使用一个固定的头部,为了防止相同的头部被加密成相同的密文,需要设置共同的初始化向量IV,IV可以用来改变第一个分组。对明文的主动攻击是不容易的,信息块不容易被替换、重排、删除和重放。适合于传输长度大于分组宽度 b 位的报文,还可以进行用户鉴别,是很多网络加密的标准,如SSL,IPsec。
图3.14 密码分组链接(CBC)工作模式
在CBC方式中,如果收到的一个密文分组的一个或多个位差错会影响对两个分组(即发生差错的分组和随后的分组)的解密。密文错误通常由通信线路和存储介质的故障产生。由小的密文错误而引起大的明文错误的性质称为错误扩散,系统中如出现错误扩散是麻烦的。在CBC模式中,由于一组错误密文仅影响它对应的那组明文和随后的一组明文,再后面的明文分组不受影响,均能正确解密,所以该模式是可以自恢复的。虽然CBC模式可以从位错误中很快恢复,但如果密文中增加或减少一位,那么后面的密文组都会受到影响,解密时将连续出现无意义的信息,因此,使用时需确保各组密码结构的完整性。
3.6.3 密码反馈(CFB)工作模式
DES,AES虽然本质上是分组密码,但是利用密码反馈(CFB)模式或输出反馈(OFB)模式,也可做流密码使用。流密码不需要明文长度是分组长度的整数倍,可以实时操作,密文与明文等长。在CFB模式中,数据能够按照比分组更小的单位进行处理,用户可以使用1位的CFB一次加密1位数据。图3.15描述了基于b位分组密码算法的CFB模式。明文为q个变量P1,P2,…,Pq所组成的序列,每个输入变量都为s位,密钥为K,初始值IV为b位,Ri为移位寄存器,宽度为b位。
图3.15 密码反馈(CFB)工作模式
CFB模式的加密和解密方式可以描述如下:
加密:Ci = Pi ⊕(EK(Ri)的高s位),Ri+1 =(Ri≪s)|| Ci
解密:Pi = Ci ⊕(EK(Ri)的高s位),Ri+1 =(Ri≪s)|| Ci
其中R1 = IV,||是连接函数,Ri≪s表示Ri左移s位。
加密时,加密函数的输入是b位的移位寄存器,移位寄存器中放的是初始值IV,加密函数的输出最左边的s位与明文异或得到第一个密文单元C1,把C1发送出去,接着移位寄存器左移位,C1填入寄存器的最右边。这样,直到所有明文单元被加密。解密时将收到的密文单元与加密函数的输出异或得到明文单元,这里需要注意的是OFB的解密使用的也是分组加密函数,而非解密函数。
CFB模式隐藏了明文模式,需要共同的移位寄存器初始值IV,同时,对于不同的消息,IV必须唯一。没有已知的并行实现算法。使用CFB算法时,明文中1位错误会影响所有的密文,但在解密时仅影响错误位。1位的密文错误首先导致被解密的明文的1位错误,其次,该错误被输入到移位寄存器中,又会引起后面的密文错误,直到这个错误被移出寄存器为止。当b = 128,s = 8时,1位密文错误可导致17个字节的明文错误,然后系统恢复正常,其后的密文能正确解密。一般而言,s位CFB模式中,1位密文错误将影响当前和后面的b/s个密文的正确解密。
3.6.4 输出反馈(OFB)模式
输出反馈模式和密码反馈模式很相似,与CFB模式不同的是,它用加密函数的输出来填充移位寄存器。图3.16描述了基于b位分组密码算法的OFB模式。明文为q个变量P1,P2,…,Pq所组成的序列,每个变量都为s位,密钥为K,初始值IV为b位,Ri为移位寄存器,宽度为b位。
图3.16 输出反馈(OFB)工作模式
OFB模式的加密和解密方式可以描述如下:
加密:Ci = Pi ⊕(EK(Ri)的高s位),Ri+1 =(Ri≪s)||(EK(Ri)的高s位)
解密:Pi = Ci ⊕(EK(Ri)的高s位),Ri+1 =(Ri≪s)||(EK(Ri)的高s位)
其中,R1 = IV,||是连接函数。
OFB也是一种将分组密码作为流密码运行的模式,与CFB模式相同,它也能隐藏明文模式,需要共同的移位寄存器初始值IV,IV也应该是唯一的,并且没有已知的并行实现算法。OFB模式的一个优点是大多数工作可以脱机进行,在密文没到达前计算EK(Ri),当密文到达后只需要进行异或就能得到明文。OFB模式的传输错误不会扩散,1位密文的错误只导致对应的1位明文的错误。OFB模式的缺点是,对明文的主动攻击是可能的,如果密文中的某位取反,恢复出的明文相应位也取反。安全性较CFB差。
3.6.5 计数器(CTR)模式
尽管计数器模式在2001年才被写入标准,但是这种模式很早就已经提出来了。与OFB模式类似,但是加密的是计数器值,而不是密文反馈值,必须对每一个明文使用一个不同的密钥和计数值,如图3.17所示。
图3.17 计数器(CTR)工作模式
CTR模式的加密和解密方式可以描述如下:
加密:Ci = Pi ⊕ Oi(取Oi与Pi长度相同的位数),Oi = EK(IV + i-1),IV为计数器的初始值。
解密:Pi = Ci ⊕ Oi
计数器模式的优点是:
● 高效,这表现在它可以并行实现,每块数据不依赖于前面的数据,可以独立处理;基本加密算法的执行不依赖明密文的输入,如果存储器充足且安全,可以进行预处理,当给出明密文时,只需要进行异或。适用于高速网络加密。
● 它可以随机访问加密的数据分组,每个分组都可以独立加解密。
● 隐藏了明文模式,与CBC模式一样安全。
● 可以处理任意长度的消息,但对于每次加密,需要使用不同的密钥的计数器值。
● 从误差传递上讲,一个单元损坏只影响对应单元。
除了上述模式外,常用的分组密码模式还有一些,大多数是上述模式的变形,如分组链接(Block Chaining,BC)模式、传播密码分组链接(Propagating Cipher Block Chaining,PCBC)、带有校验和的密码分组链接(Cipher Block Chaining with Checksum,CBCC)和带有非线性函数的输出反馈模式(Output Feedback with a nonlinear Function,OFBNLF)。BC模式和OFBNLF模式被写入了GB/T 17964—2008。
3.6.6 不是分组长度整数倍的报文的处理
在ECB和CBC模式中,还涉及一个问题:大多数信息不可能被完整地分成几组,最后一部分通常不够一组,对此,可以采用填充的方式来解决。填充就是采用全0,全1或0与1组合的方式来填充最后的短块,使其成为一个完整的分组。有多种填充方法。
美国联邦信息处理标准PUB 81建议,如果数据是二进制的,就填入与数据最后一位相反的比特;如果数据块是ASCII码,就填入随机字节。将填充位(bit)数目写入最后一个字节,总共凑齐64位的分组。填充一般要多于64 bit。这样在解密后删除填充比特即可,因为知道了填充比特数。
在RFC2040中定义了RC5-CBC-Pad和RC5-CTS。CBC-Pad是用于RC5密码的一种分组密码工作模式,CBC-Pad能够处理任意长度的明文,密文至多比明文多一个分组的长度。填充方法是在每个报文的末尾,增加从1到bb字节的填充,其中bb等于RC5以字节为单位的分组大小。填充字节被置为一个代表填充字节数目的字节。如果有8 字节的填充,则每个字节具有00001000的比特模式。
为了进行自动数据处理,通常总是要填充的。即使是分组长度整数倍的报文,也要填充。解密后,最后一个分组的最后一个字节用于确定必须被剥掉的填充的数位,因此不能允许零字节的填充。
填充也不总是合适的,例如,当我们希望使用同样的内存空间来存储明文和对应的密文时,就要求密文必须和明文一样长。RC5-CTS就是满足这一要求的一种工作模式。图3.18给出了一种ECB工作模式的填充方式,称为密文挪用,即采用部分密文填充最后的短块。图中Pn-1是最后一组完整的明文(倒数第二组明文),Pn是最后的短明文分组,Cn-1是最后一组完整的密文,Cn是最后的短密文分组。选择 Pn-1加密后的密文与 Pn同样长度的左边 L 位作为Cn,用Pn-1加密后的密文的右边b - L位对Pn填充到分组长度,对其加密得到Cn-1。同样的思想方法也可以用于CBC模式。
图3.18 ECB模式中的密文挪用
3.6.7 三重DES的工作模式
这里给出两个可能的三重DES加密模式,分别称为内部CBC方式(Inner-CBC)和外部CBC(Outer-CBC)方式。
内部CBC用CBC方式对整个文件进行三次不同的加密,这需要三个不同的IV值X0,Y0,C0,如图3.19(a)所示。外部CBC用CBC方式对整个文件进行三重加密,需要一个IV值C0,如图3.19(b)所示。
图3.19 CBC模式下的三重DES
如果用软件实现的话,两种方式的性能是相当的,外部CBC比内部CBC方式每个分组少两个异或操作,内部CBC方式可以在交换之前用同一密钥加密多个分组,这两种模式性能的差别比编程方式的正常变化带来的差别要小。
如果用硬件实现的话,从性能上考虑,这两种模式都比单重加密需要更多的资源。然而,如果将内部CBC方式制作成加密芯片,其加密并不比单重加密慢,因为三次加密是独立的,每重加密是自反馈的,所以,三块加密芯片可以同时独立地工作,而外部CBC中反馈是在三次加密之后,这意味着即使使用三块芯片,其处理效率也只有单重加密的1/3。
令Pi表示输入的明文分组流,Xi表示第一个DES的输出,Yi是第二个DES的输出,Ci是最后一个DES的输出,也就是整个系统的密文。
在外部CBC方式中,Xi = DES(XOR(Pi,Ci-1)),Yi = DES(Xi),Ci = DES(Yi),这里,C0是单一的初始向量IV。如果P1在时刻t = 0得到(以DES操作的时间为测量单位),X1将会在t = 1得到,Y1在t = 2得到,C1在t = 3得到。t = 1时,第一个DES有空闲做更多的工作,但是要做的工作是:X2 = DES(XOR(P2,C1)),因为C1只有在t = 3时才能得到,因此X2只有在t = 4时才能得到,Y2在t = 5,C2在t = 6时才能得到。
在内部CBC方式,我们有:
Xi = DES(XOR(Pi,Xi-1))
Yi = DES(XOR(Xi,Yi-1))
Ci = DES(XOR(Yi,Ci-1))
这里X0,Y0和C0是三个独立的初始向量IV。如果P1在t = 0时得到,X1在t = 1时得到。X2和Y1同时在t = 2时得到,X3,Y2和C1在t = 3时得到,X4,Y3和C2在t = 4时得到。因此每一个DES操作都会产生一个新的密文分组,与外部CBC方式相比,它的吞吐量是内部CBC方式的三倍。
从安全性上考虑,简单的加密模式安全性也差一些,Biham对不同模式进行选择密文差分分析,发现内部CBC方式比单重加密安全性好一些,外部CBC方式比内部CBC方式安全性好一些。如果初始向量IV是保密的,内部CBC比外部CBC方式对于强力攻击来说需要确定更多的数值位,因而更安全。