【密码学基础】07 分组加密工作模式

  前面讲述了传统对称加密技术、数据加密标准DES和高级加密标准AES,这些对称加密技术或者标准提供了从一组明文到一组密文的加密和解密。不过这些加密标准和技术只考虑了一组明文/密文,因此只是实际加密方案的一部分。对于广泛使用的分组密码而言,这些加密标准和技术是构造实际分组密码的加密/解密部分,但对于各组明文/密文之前的关系而言,则对应着不同工作模式的分组加密,下面则要介绍这几种不同的工作模式。

更新历史:

  • 2021年08月16日完成初稿

1. 分组密码工作模式

  正如前述,分组密码每次针对明文分组(通常是64比特、128比特、256比特等),最朴素的想法是针对明文P,将其分为N个分组 P 1 , P 2 , . . . , P N P_1, P_2, ..., P_N P1,P2,...,PN,然后针对每个明文分组用加密算法(如DES、AES算法)进行加密,最后得到密文分组 C 1 , C 2 , . . . , C N C_1, C_2, ..., C_N C1,C2,...,CN,在每次加密时都使用了相同的加密密钥。不过每次使用相同密钥对多个分组进行加密,会引发许多安全问题,为了使得分组密码具有实用价值,NIST(National Institute of Standards and Technology)定义了以下5种工作模式:

  • 电码本模式(Electronic CodeBook Mode , ECB)
    • 描述:用相同的密钥分别对明文分组单独加密
    • 典型应用:单个数据的安全传输(比如一个加密密钥)
  • 密文分组链接模式(Cipher Block Chaining Mode, CBC)
    • 描述:加密算法的输入是上一个密文分组和下一个明文分组的异或
    • 典型应用:面向分组的通用传输、认证
  • 密码反馈模式(Cipher Feedback Mode, CFB)
    • 描述:一次处理输入的s位,上一个密文分组作为加密算法的输入,产生的伪随机数输出与明文异或后作为下一单元的密文
    • 典型应用:面向数据流的通用传输、认证
  • 输出反馈模式(Output Feedback Mode, OFB)
    • 描述:与CFB类似,只是加密算法的输入是上一次加密的输出,并且使用整个分组
    • 典型应用:噪声信道上的数据流的传输(如卫星通信)
  • 计数器模式(Counter Mode, CTR)
    • 描述:每个明文分组都与一个经过加密的计数器异或。对每一个后续的分组,计数器增1
    • 典型应用:面向分组的通用传输、用于高速需求

  这5种工作模式实际上是一种增强密码算法或使得密码算法更加实用的技术,而且在实际使用中,这5种工作模式广泛应用于分组密码的各个场景,下面就来了解各种工作模式的具体细节,最后针对各种工作模式进行总结。不过在这里,最好理解各种模式的英文名称和缩写,在之后的文章中将会直接使用这些缩写。

2. 电码本模式

  电码本模式(Electronic CodeBook Mode , ECB)是最简单的工作模式,对于明文 P = P 1 P 2 . . . P N P=P_1P_2...P_N P=P1P2...PN,明文P总长度为L位,明文分组 P i P_i Pi的长度为b位,通过加密其可以被加密为密文 C = C 1 C 2 . . . C N C=C_1C_2...C_N C=C1C2...CN,该模式的形式化定义为:
C i = E k ( P i ) , i = 1 , 2 , . . . N C_i=E_k(P_i),\qquad i = 1,2,...N Ci=Ek(Pi),i=1,2,...N
  其中, E E E是加密算法(如DES、AES等分组加密算法), k k k是加密密钥,若明文P的总长度L不能被b整除,则最后一个分组 P N P_N PN不足b位,需要进行填充。例如,明文P长度为2021字节(32336比特),利用AES加密,则明文分组为16字节(128比特),因此有2021=16*126+5,因此明文分组有127个,最后一个分组只有5个字节,因此需要填充11个字节。

填充

通常而言,对于最后一个分组的填充(padding)可以是在分组后补足0…0,或者10…0等,而且一旦采用了填充技术,那么最后一个分组都需要进行填充,即便长度满足要求(此时最后一个分组全部是填充字段),因为系统无法区分分组是否进行了填充,所以必须让最后一个分组都有填充。

  可以看到,每一次加密时,不同分组的明文都用同一个密钥进行加密,因此对于给定的密钥 k k k而言,针对任一个明文分组 P i P_i Pi都有唯一的密文分组 C i C_i Ci对应,就好比一本记录<明文, 密文>的密码本,加密过程就好比一个查密码本的过程。因此对于相同的明文分组,其密文分组也相同,ECB模式可能不安全,因此ECB模式只适合于比分组长度短的消息,如密钥等。

  同样地,解密过程也是类似的过程,加密和解密如图1所示:

图1 电码本模式(ECB模式)

3. 密文分组链接模式

  正如上一节所示,ECB模式简单但不安全,其原因就是对于相同的明文分组,其密文分组也相同。为了克服这一缺陷,往往会使得加密过程中明文分组影响所有密文分组,下面要介绍的密文分组链接模式(Cipher Block Chaining Mode, CBC)就是这样一个加密方案。

  CBC模式在加密操作前增加了一个异或操作,利用前一轮的密文分组和该轮的明文分组进行异或,之后在进行加密操作,对于分组长度为b位的明文分组 P 1 , P 2 , . . . , P N P_1, P_2, ...,P_N P1,P2,...,PN(同样可能发生填充)和密文分组 C 1 , C 2 , . . . , C N C_1, C_2, ...,C_N C1,C2,...,CN有如下的加密和解密过程。

图2 密文分组链接模式(CBC模式,左为加密,右为解密)

  其加密过程可以用下式表示:
C 1 = E k ( I V ⊕ P 1 ) C i = E k ( C i − 1 ⊕ P i ) , i = 2 , 3 , . . . , N C_1 = E_k(IV\oplus P_1)\\ C_i = E_k(C_{i-1}\oplus P_i),\qquad i=2,3,...,N C1=Ek(IVP1)Ci=Ek(Ci1Pi),i=2,3,...,N

  其中IV是一个初始向量(Initial Vector),其由收发双方共享,但第三方不能预测,而且未经授权不允许更改。通常而言,初始向量IV会选择一个时变值或者随机值,关于时变值的介绍详见第5节。

  可以看到CBC模式最大的特点在于,密文分组 C i C_i Ci的值取决于明文分组 P 1 , P 2 , . . . , P i P_1, P_2, ...,P_i P1,P2,...,Pi,因此相同的明文分组得到的密文分组往往是不同的,因此CBC模式可以加密比分组长度长的明文。

4. 密码反馈模式

  对于上面的电码本模式(Electronic CodeBook Mode , ECB)、密文分组链接模式(Cipher Block Chaining Mode, CBC),其分组长度b取决于加密算法,比如采用DES加密算法,则分组长度为b=64比特,采用AES加密算法,则分组长度为b=128比特,明文分组必须必须先分成b比特一组然后进行加密,而下面介绍的密码反馈模式(Cipher Feedback Mode, CFB)、输出反馈模式(Output Feedback Mode, OFB)和计数器模式(Counter Mode, CTR)的明文分组长度不依赖于加密算法的分组长度,这里假设加密算法的分组长度为b位,明文分组长度和密文分组长度为s位。下面先讲述密码反馈模式(Cipher Feedback Mode, CFB)。

  密码反馈模式(CFB模式)和密文分组链接模式(CBC模式)很类似,不过CFB模式采用了先加密后异或的操作,图3表示了密码反馈模式(CFB模式)加密和解密的过程。

图3 密码反馈模式(CFB模式)

  首先看到加密过程,加密过程中同样采用了初始向量IV(Initial Vector):

  • 第一轮:第一轮输入用初始向量IV初始化,然后作为输入 I 1 I_1 I1通过加密,生成b位的输出 O 1 O_1 O1,之后 O 1 O_1 O1的最高s位与s位的明文 P 1 P_1 P1进行异或,从而得到密文 C 1 C_1 C1
  • 第二轮:第二轮输入在第一轮输入基础上左移s位,然后低s位用第一轮得到的密文 C 1 C_1 C1填充,之后作为输入 I 2 I_2 I2通过加密,生成b位的输出 O 2 O_2 O2,之后 O 2 O_2 O2的最高s位与s位的明文 P 2 P_2 P2进行异或,从而得到密文 C 2 C_2 C2
  • 第N轮:第N轮输入在第N-1轮输入基础上左移s位,然后低s位用第N-1轮得到的密文 C N − 1 C_{N-1} CN1填充,之后作为输入 I N I_N IN通过加密,生成b位的输出 O N O_N ON,之后 O N O_N ON的最高s位与s位的明文 P N P_N PN进行异或,从而得到密文 C N C_N CN

  用 M S B s ( B ) MSB_s(B) MSBs(B)表示B的最高s位(Most Significant Bits), L S B s ( B ) LSB_s(B) LSBs(B)表示B的最底s位(Least Significant Bits),连接符 ∣ ∣ || 表示两个字符进行连接。因此加密过程可以被描述为:
I j = L S B b − s ( I j − 1 ) ∣ ∣ C j − 1 , j = 2 , . . . , N O j = E k ( I j ) , j = 1 , 2 , . . . , N C j = P j ⊕ M S B s ( O j ) , j = 1 , 2 , . . . , N I_j = LSB_{b-s}(I_{j-1})||C_{j-1},\quad j=2, ...,N\\ O_j = E_k{(I_j)},\quad j = 1, 2, ...,N\\ C_j = P_j\oplus MSB_s{(O_j)},\quad j = 1, 2, ...,N Ij=LSBbs(Ij1)Cj1,j=2,...,NOj=Ek(Ij),j=1,2,...,NCj=PjMSBs(Oj),j=1,2,...,N

  其中 I 1 = I V I_1 = IV I1=IV。可以看到加密时s位的明文分组 P j P_j Pj加密成s位的密文分组 C j C_j Cj,而位数s不取决于加密函数,因此可以通过选择s的大小(通常为8位)来使得明文长度等于密文长度,从而不浪费传输能力。相比于CFB模式,那些需要填充的分组密码工作模式,往往是密文长度稍大于实际的明文长度,这样会使得传输能力被浪费。

分组密码和流密码

可以看到在分组加密工作模式中仍然可以实现加密单个字节的明文分组,此时分组密码可以转换为流密码,流密码最大的特点就是明文和密文等长,分组密码则不是如此,但在一些工作模式中分组密码实际上达到了流密码的特点。

  另外在CFB加密模式中,和CBC模式一样的是,密文分组 C i C_i Ci的值取决于明文分组 P 1 , P 2 , . . . , P i P_1, P_2, ...,P_i P1,P2,...,Pi,这样的相关性使得CFB模式和CBC模式有较好的安全性,但也因此CFB模式和CBC模式加密过程无法实现并行计算。

  对于解密过程,由于所有的密文分组已知,因此CFB模式可以在解密过程中进行并行计算,从而加快解密的速度。

5. 输出反馈模式

  输出反馈模式(Output Feedback Mode, OFB)和密码反馈模式(CFB模式)很类似,不过输出反馈模式(OFB模式)并没有反馈密文而是反馈中间结果输出,图4表示了输出反馈模式(OFB模式)的加密和解密过程。

图4 输出反馈模式(OFB模式)

  首先关注加密过程,OFB模式的加密过程有:

  • 第一轮:首先产生一个Nonce(时变值),并且作为第一轮加密函数的输入 I 1 I_1 I1,之后加密函数输出 O 1 O_1 O1并且和明文分组 P 1 P_1 P1异或产生密文分组 C 1 C_1 C1
  • 第二轮:第一轮加密函数的输出 O 1 O_1 O1作为第二轮加密函数的输入 I 2 I_2 I2,之后加密函数输出 O 2 O_2 O2并且和明文分组 P 2 P_2 P2异或产生密文分组 C 2 C_2 C2
  • 第N轮:第N-1轮加密函数的输出 O N − 1 O_{N-1} ON1作为第二轮加密函数的输入 I N I_N IN,之后加密函数输出 O N O_N ON并且和明文分组 P N P_N PN异或产生密文分组 C N C_N CN

时变值

上述的Nonce是一个时变值,即随时间变化的值,具有可忽略的重复概率,如每次使用时都重新生成一个随机值、一个时间戳和一个序号,或者它们的某些组合。前述的IV(初始变量)可以取为一个时变值,也可以直接取成一个随机值。

  因此加密过程可以用下面的公式来表示:
I 1 = N o n c e I j = O j − 1 , j = 2 , 3 , . . . , N O j = E k ( I j ) , j = 1 , 2 , . . . , N C j = P j ⊕ O j , j = 1 , 2 , . . . , N − 1 C N ∗ = P N ∗ ⊕ M S B u ( O N ) I_1 = Nonce\\ I_j = O_{j-1},\quad j = 2,3,...,N\\ O_j = E_k(I_j),\quad j = 1,2,...,N\\ C_j = P_j \oplus O_j,\quad j = 1,2,...,N-1\\ C_N^{*} = P_N^{*} \oplus MSB_u(O_N) I1=NonceIj=Oj1,j=2,3,...,NOj=Ek(Ij),j=1,2,...,NCj=PjOj,j=1,2,...,N1CN=PNMSBu(ON)

  将上面的公式化简可以得到:
C 1 = P 1 ⊕ E k ( N o n c e ) C j = P j ⊕ E k ( O j − 1 ) j = 2 , 3 , . . . , N − 1 C N ∗ = P N ∗ ⊕ M S B u ( O N ) C_1 = P_1\oplus E_k(Nonce)\\ C_j = P_j\oplus E_k(O_{j-1})\quad j = 2,3,...,N-1\\ C_N^{*} = P_N^{*} \oplus MSB_u(O_N) C1=P1Ek(Nonce)Cj=PjEk(Oj1)j=2,3,...,N1CN=PNMSBu(ON)

  其中考虑到 O j − 1 ⊕ P j − 1 = C j − 1 ⇒ O j − 1 = P j − 1 ⊕ C j − 1 O_{j-1}\oplus P_{j-1}=C_{j-1}\Rightarrow O_{j-1}=P_{j-1}\oplus C_{j-1} Oj1Pj1=Cj1Oj1=Pj1Cj1,因此上式可以写为:
C 1 = P 1 ⊕ E k ( N o n c e ) C j = P j ⊕ E k ( P j − 1 ⊕ C j − 1 ) j = 2 , 3 , . . . , N − 1 C N ∗ = P N ∗ ⊕ M S B u ( O N ) C_1 = P_1\oplus E_k(Nonce)\\ C_j = P_j\oplus E_k(P_{j-1}\oplus C_{j-1})\quad j = 2,3,...,N-1\\ C_N^{*} = P_N^{*} \oplus MSB_u(O_N) C1=P1Ek(Nonce)Cj=PjEk(Pj1Cj1)j=2,3,...,N1CN=PNMSBu(ON)

  和CBC模式和CFB模式一样,OFB模式也需要一个初始向量,但这个初始向量IV必须是一个时变值Nonce,即初始向量IV对加密操作的每次执行都是唯一的。OFB模式的优点在于OFB模式不会出现误码传播,即由于 C i C_i Ci的错误而导致之后明文分组的错误,这从图4中可以清晰地观察到。

  对于解密过程,由图4可知几乎是相同的过程,在此不再赘述。

6. 计数器模式

  计数器模式(Counter Mode, CTR)也是一种常用的分组密码工作模式,与其他分组密码工作模式相比,计数器模式(CTR模式)采用了计数器(Counter),它的长度与明文分组的长度相同,通常记作 T i ( i = 1 , 2 , . . . , N ) T_i(i=1, 2, ..., N) Ti(i=1,2,...,N) T i T_i Ti的选取是至关重要的,为了保证安全性使用相同密钥加密的所有消息必须有不同的 T 1 T_1 T1,此外,所有消息的所有 T i T_i Ti是唯一的,为了满足上述要求,计数器首先被初始化为一个时变值,然后对后续的每个分组,计数器的值都增加1(模 2 b 2^b 2b,其中 b b b为分组长度)。

  图5展示了CTR模式的加密和解密过程。在加密过程中,用下式就可以定义:
C j = P j ⊕ E k ( T j ) j = 1 , 2 , . . . , N − 1 C N = P N ⊕ M S B u [ E k ( T j ) ] C_j = P_j \oplus E_k(T_j)\quad j = 1,2,...,N-1\\ C_N = P_N \oplus MSB_u[E_k(T_j)] Cj=PjEk(Tj)j=1,2,...,N1CN=PNMSBu[Ek(Tj)]

  其中的 T i T_i Ti就是第i个计数器,通常而言, T 1 = N o n c e , T i + 1 = T i + 1 ( i = 1 , 2 , . . . , N − 1 ) T_1=Nonce, T_{i+1} = T_i+1(i=1,2,...,N-1) T1=Nonce,Ti+1=Ti+1(i=1,2,...,N1)。尽管CTR模式各明文分组的加密过程是独立的,但是由于计数器的原因,即使对于相同的明文分组,所对应的密文分组都是不一样的。

图5 计数器模式(CTR模式)

7. 小结

  对于给上述分组加密工作模式,掌握各种工作模式的流程至关重要,下面十分推荐大家使用一些简笔画完成对于各种分组密码工作模式的介绍,简笔画可能并不美观,但是能够抓住精髓,图6是上述5种分组加密工作模式加密过程的图示(为了排版需要,因此排列顺序和上面的讲述顺序并不一致)。

  可以看到对于ECB模式和CBC模式,明文或者异或后的明文是加密算法的输入,密文是加密算法的输出,因此明文分组的长度必须满足加密算法的要求,此时往往需要填充。而对于CFB模式、OFB模式、CTR模式而言,密文由明文异或得到,因此不必满足加密算法的要求,从而可以实现调整明文分组的分组长度,在这几种工作模式下的分组加密可以转换为流密码。

  对于CBC模式、CFB模式、OFB模式而言,它们都使用了初始变量IV、时变值Nonce,而且采用了反馈模式,增加了各个分组之间的联系,从而避免了相同明文分组产生相同密文分组,提高了安全性,但也为加密过程中的并行性增加了麻烦,不过OFB模式下加密过程仍然具有并行性。虽然CTR模式没有采用反馈模式,但由于有计数器T的加入,使得CTR模式也避免了相同明文分组产生相同密文分组,而且可以实现并行计算,可以进行高速加密和解密。

图6 分组加密工作模式加密过程

猜你喜欢

转载自blog.csdn.net/Stu_YangPeng/article/details/119745003
今日推荐