6 密文分组链接工作模式
6.1 变量定义
CBC工作模式采用以下变量。
a)输入变量:
1) q q q个明文分组 P 1 , P 2 , . . . , P q P_1,P_2,...,P_q P1,P2,...,Pq所组成的序列,分组长度由分组算法 E E E决定;
2)密钥 K K K,需要加解密操作方约定一致,长度由分组密码算法 E E E决定;
3)初始向量 I V IV IV,需要加解密操作方约定一致,长度为 n n n比特。
b)输出变量:
q q q个密文分组 C 1 , C 2 , . . . , C q C_1,C_2,...,C_q C1,C2,...,Cq所组成的序列,每个分组都为 n n n比特。
6.2 CBC的加密方式描述
对第一个明文分组进行加密: C 1 = E k ( P 1 ⊕ I V ) C_1=E_k(P_1 \oplus IV) C1=Ek(P1⊕IV)。
随后: C i = E k ( P i ⊕ C i − 1 ) i = 2 , 3 , . . . , q C_i=E_k(P_i \oplus C_{i-1}) \quad i=2,3,...,q Ci=Ek(Pi⊕Ci−1)i=2,3,...,q。
此过程如图3所示。初始向量 I V IV IV用于生成第一个密文输出。之后的加密过程中,每个明文分组与前一个密文分组进行异或运算后再加密。
6.3 CBC的加密方式示例
本示例使用的分组密码是GB/T 32907——2016中规定的SM4算法。所有变量采用“左高右低”的方式标记,即变量最左侧为其最高位。
密钥密钥为(十六进制):2B7E1516 28AED2A6 ABF71588 09CF4F3C。
初始向量为(十六进制):00010203 04050607 08090A0B 0C0D0E0F。
明文是(十六进制):6BC1BEE2 2E409F96 E93D7E11 7393172A
AE2D8A57 1E03AC9C 9EB76FAC 45AF8E51
30C81C46 A35CE411 E5FBC119 1A0A52EF
F69F2445 DF4F9B17 AD2B417B E66C3710。
i = 1 i=1 i=1时:
P 1 ⊕ I V = P_1 \oplus IV= P1⊕IV=(6BC1BEE2 2E409F96 E93D7E11 7393172A) ⊕ \oplus ⊕(00010203 04050607 08090A0B 0C0D0E0F) = = = 6BC0BCE1 2A459991 E134741A 7F9E1925
C 1 = E k ( P i ⊕ I V ) = C_1=E_k(P_i \oplus IV)= C1=Ek(Pi⊕IV)=AC529AF9 89A62FCE 9CDDC5FF B84125CA
i = 2 i=2 i=2时:
P 2 ⊕ C 1 = P_2 \oplus C_1= P2⊕C1=(AE2D8A57 1E03AC9C 9EB76FAC 45AF8E51) ⊕ \oplus ⊕ (AC529AF9 89A62FCE 9CDDC5FF B84125CA) = = = 027F10AE 97A58352 026AAA53 FDEEAB9B
C 2 = E k ( P 2 ⊕ C 1 ) = C_2=E_k(P_2 \oplus C_1)= C2=Ek(P2⊕C1)=B168DD69 DB3C0EEA 1AB16DE6 AEA43C59
i = 3 i=3 i=3时:
P 3 ⊕ C 2 = P_3 \oplus C_2= P3⊕C2=(30C81C46 A35CE411 E5FBC119 1A0A52EF) ⊕ \oplus ⊕ (B168DD69 DB3C0EEA 1AB16DE6 AEA43C59) = = = 81A0C12F 7860EAFB FF4AACFF B4AE6EB6
C 3 = E k ( P 3 ⊕ C 2 ) = C_3=E_k(P_3 \oplus C_2)= C3=Ek(P3⊕C2)= 2C15567B FF8F7074 86C202C7 BE59101F
i = 4 i=4 i=4时:
P 4 ⊕ C 3 = P_4 \oplus C_3= P4⊕C3=(F69F2445 DF4F9B17 AD2B417B E66C3710) ⊕ \oplus ⊕ (2C15567B FF8F7074 86C202C7 BE59101F) = = = DA8A723E 20C0EB63 2BE943BC 5835270F
C 4 = E k ( P 4 ⊕ C 3 ) = C_4=E_k(P_4 \oplus C_3)= C4=Ek(P4⊕C3)= 74A629B3 50CD7E11 BE99998A F5206D6C
6.4 CBC的解密方式描述
对第一个密文分组进行解密: P 1 = D k ( C 1 ) ⊕ I V P_1=D_k(C_1) \oplus IV P1=Dk(C1)⊕IV。
随后: P i = D k ( C i ) ⊕ C i − 1 i = 2 , 3 , . . . , q P_i=D_k(C_i) \oplus C_{i-1} \quad i=2,3,...,q Pi=Dk(Ci)⊕Ci−1i=2,3,...,q。
此过程如图4所示。
6.5 CBC的解密方式示例
本示例使用的分组密码是GB/T 32907——2016中规定的SM4算法。所有变量采用“左高右低”的方式标记,即变量最左侧为其最高位。
密钥密钥为(十六进制):2B7E1516 28AED2A6 ABF71588 09CF4F3C。
初始向量为(十六进制):00010203 04050607 08090A0B 0C0D0E0F。
密文是(十六进制):AC529AF9 89A62FCE 9CDDC5FF B84125CA
B168DD69 DB3C0EEA 1AB16DE6 AEA43C59
2C15567B FF8F7074 86C202C7 BE59101F
74A629B3 50CD7E11 BE99998A F5206D6C。
i = 1 i=1 i=1时:
D k ( C 1 ) = D_k(C_1)= Dk(C1)= 6BC0BCE1 2A459991 E134741A 7F9E1925。
P 1 = D k ( C 1 ) ⊕ I V = P_1=D_k(C_1) \oplus IV= P1=Dk(C1)⊕IV=(6BC0BCE1 2A459991 E134741A 7F9E1925) ⊕ \oplus ⊕ (00010203 04050607 08090A0B 0C0D0E0F) = = = 6BC1BEE2 2E409F96 E93D7E11 7393172A。
i = 2 i=2 i=2时:
D k ( C 2 ) = D_k(C_2)= Dk(C2)= 027F10AE 97A58352 026AAA53 FDEEAB9B。
P 2 = D k ( C 2 ) ⊕ C 1 = P_2=D_k(C_2) \oplus C_1= P2=Dk(C2)⊕C1=(027F10AE 97A58352 026AAA53 FDEEAB9B) ⊕ \oplus ⊕ (AC529AF9 89A62FCE 9CDDC5FF B84125CA) = = = AE2D8A57 1E03AC9C 9EB76FAC 45AF8E51。
i = 3 i=3 i=3时:
D k ( C 3 ) = D_k(C_3)= Dk(C3)= 81A0C12F 7860EAFB FF4AACFF B4AE6EB6。
P 3 = D k ( C 3 ) ⊕ C 2 = P_3=D_k(C_3) \oplus C_2= P3=Dk(C3)⊕C2= (81A0C12F 7860EAFB FF4AACFF B4AE6EB6) ⊕ \oplus ⊕ (B168DD69 DB3C0EEA 1AB16DE6 AEA43C59) = = = 30C81C46 A35CE411 E5FBC119 1A0A52EF。
i = 4 i=4 i=4时:
D k ( C 4 ) = D_k(C_4)= Dk(C4)= DA8A723E 20C0EB63 2BE943BC 5835270F。
P 4 = D k ( C 4 ) ⊕ C 3 = P_4=D_k(C_4) \oplus C_3= P4=Dk(C4)⊕C3= (DA8A723E 20C0EB63 2BE943BC 5835270F) ⊕ \oplus ⊕ (2C15567B FF8F7074 86C202C7 BE59101F) = = = F69F2445 DF4F9B17 AD2B417B E66C3710。
6.6 密文分组链接工作模式的性质
6.6.1 场景
只要使用相同的密钥和初始向量对相同的明文进行加密,CBC工作模式将生成相同的密文。介意这种性质的用户需要采用相应方法来改变明文的起始分组、密钥或初始向量。一种可能的方法是将一个唯一的标识符(例如一个递增计数器)加到每个CBC消息的起始位置。在对长度不能增加的明文进行加密时可使用某种方法从明文中计算出一个值,例如明文的随机访问存储方式的地址。
6.6.2 性质
CBC工作模式的性质有:
a)链接操作使得密文分组依赖于当前的和以前的明文分组,因此调换密文分组的顺序不可能使得明文分组的顺序对应调换;
b)使用不同的 I V IV IV以防止同一明文加密成同一密文;
6.6.3 填充明文
只有长度为分组长度的整数倍的明文才能被加密或解密,其他长度的明文需要被填充。如果不能填充,则可以使用特殊方法处理最后一个分组,下面给出两个方法。
第一种方法处理一个不完整的明文分组[即:一个 j ( j < n ) j(j < n) j(j<n)比特的明文分组 P q P_q Pq,其中 q q q大于1],按照下面描述的OFB工作模式进行加密:
a)加密: C q = P q ⊕ ( j ∼ E k ( C q − 1 ) ) C_q=P_q \oplus (j \sim E_k(C_{q-1})) Cq=Pq⊕(j∼Ek(Cq−1));
b)解密: P q = C q ⊕ ( j ∼ E k ( C q − 1 ) ) P_q=C_q \oplus (j \sim E_k(C_{q-1})) Pq=Cq⊕(j∼Ek(Cq−1))。
如果 I V IV IV不是秘密的或者与同一个密钥一起被多次使用,那么最后的分组容易受到“选择明文攻击”。
示例:
P 4 = P_4= P4= F69F2445 DF4F9B17。
C 3 = C_3= C3= 2C15567B FF8F7074 86C202C7 BE59101F。
E k ( C 3 ) = E_k(C_3)= Ek(C3)=E22ECA71 1F5A8D22 2A758ABE 0D9B141A。
64 ∼ E k ( C 3 ) = 64 \sim E_k(C_3)= 64∼Ek(C3)=E22ECA71 1F5A8D22。
C 4 = P 4 ⊕ ( 64 ∼ E k ( C 3 ) ) = C_4=P_4 \oplus (64 \sim E_k(C_3))= C4=P4⊕(64∼Ek(C3))= (F69F2445 DF4F9B17) ⊕ \oplus ⊕ (E22ECA71 1F5A8D22) = = = 14B1EE34 C0151635。
P 4 = C 4 ⊕ ( 64 ∼ E k ( C 3 ) ) = P_4=C_4 \oplus (64 \sim E_k(C_3))= P4=C4⊕(64∼Ek(C3))= (14B1EE34 C0151635) ⊕ \oplus ⊕ (E22ECA71 1F5A8D22) = = = F69F2445 DF4F9B17。
第二种方法称作“密文挪用”。如果最后两个明文分组为 P q − 1 P_{q-1} Pq−1和 P q P_q Pq,其中 P q − 1 P_{q-1} Pq−1长度为 n n n比特, P q P_q Pq长度为 j ( j < n ) j(j<n) j(j<n)比特, q q q大于1。
a)加密:
设 C q − 1 C_{q-1} Cq−1为用6.2所描述的方法由 P q − 1 P_{q-1} Pq−1导出的密文分组。令
C q = E k ( C q − 1 ⊕ ( P q ∣ ∣ Z e r o ( n − j ) ) ) , C q − 1 ∗ = j ∼ C q − 1 C_q=E_k(C_{q-1} \oplus (P_q || Zero(n-j))),C_{q-1}^{*}=j \sim C_{q-1} Cq=Ek(Cq−1⊕(Pq∣∣Zero(n−j))),Cq−1∗=j∼Cq−1
因此最后两个密文分组是 C q C_q Cq和 C q − 1 ∗ C_{q-1}^{*} Cq−1∗。此过程如下图所示。
b)解密:
首先对 C q C_q Cq进行解密,对所得明文分组的左边 j j j比特和右边 n − j n-j n−j比特分别如下处理:
P q = ( j ∼ D k ( C q ) ) ⊕ C q − 1 ∗ , P q − 1 = D k ( C q − 1 ∗ ∣ ∣ D k ( C q ) ∼ ( n − j ) ) ⊕ C q − 2 P_q=(j \sim D_k(C_q)) \oplus C_{q-1}^{*},P_{q-1}=D_k(C_{q-1}^{*} || D_k(C_q) \sim (n-j)) \oplus C_{q-2} Pq=(j∼Dk(Cq))⊕Cq−1∗,Pq−1=Dk(Cq−1∗∣∣Dk(Cq)∼(n−j))⊕Cq−2
此过程如下图所示。
示例:
C 2 = C_2= C2= B168DD69 DB3C0EEA 1AB16DE6 AEA43C59。
C 3 = C_3= C3= 2C15567B FF8F7074 86C202C7 BE59101F。
C 3 ∗ = 64 ∼ C 3 = C_{3}^{*}=64 \sim C_3= C3∗=64∼C3= 2C15567B FF8F7074。
P 3 = P_3= P3= 30C81C46 A35CE411 E5FBC119 1A0A52EF。
P 4 = P_4= P4= F69F2445 DF4F9B17。
C 3 ⊕ ( P 4 ∣ ∣ Z e r o ( 64 ) ) = C_3 \oplus (P_4||Zero(64))= C3⊕(P4∣∣Zero(64))= (2C15567B FF8F7074 86C202C7 BE59101F) \oplus (F69F2445 DF4F9B17 00000000 00000000) = = = DA8A723E 20C0EB63 86C202C7 BE59101F。
C 4 = E k ( C 3 ⊕ ( P 4 ∣ ∣ Z e r o ( 64 ) ) ) = C_4=E_k(C_3 \oplus (P_4||Zero(64)))= C4=Ek(C3⊕(P4∣∣Zero(64)))= 9C977AC1 7CFDE2E3 902F5847 87B3E4F4。
D k ( C 4 ) = D_k(C_4)= Dk(C4)= DA8A723E 20C0EB63 86C202C7 BE59101F。
64 ∼ D k ( C 4 ) = 64 \sim D_k(C_4)= 64∼Dk(C4)= DA8A723E 20C0EB63。
P 4 = ( 64 ∼ D k ( C 4 ) ) ⊕ C 3 ∗ = P_4=(64 \sim D_k(C_4)) \oplus C_{3}^{*}= P4=(64∼Dk(C4))⊕C3∗= (DA8A723E 20C0EB63) ⊕ \oplus ⊕ (2C15567B FF8F7074) = = = F69F2445 DF4F9B17。
C 3 ∗ ∣ ∣ D k ( C 4 ) ∼ 64 = C_{3}^{*} || D_k(C_4) \sim 64= C3∗∣∣Dk(C4)∼64= 2C15567B FF8F7074 86C202C7 BE59101F。
D k ( C 3 ∗ ∣ ∣ D k ( C 4 ) ∼ 64 ) = D_k(C_{3}^{*} || D_k(C_4) \sim 64)= Dk(C3∗∣∣Dk(C4)∼64)= 81A0C12F 7860EAFB FF4AACFF B4AE6EB6。
P 3 = D k ( C 3 ∗ ∣ ∣ D k ( C 4 ) ∼ 64 ) ⊕ C 2 = P_3=D_k(C_{3}^{*} || D_k(C_4) \sim 64) \oplus C_2= P3=Dk(C3∗∣∣Dk(C4)∼64)⊕C2= (81A0C12F 7860EAFB FF4AACFF B4AE6EB6) ⊕ \oplus ⊕ (B168DD69 DB3C0EEA 1AB16DE6 AEA43C59) = = = 30C81C46 A35CE411 E5FBC119 1A0A52EF。
6.6.4 差错扩散
在CBC工作模式中,一个密文分组中的一个或多个比特差错会影响两个分组(即发生差错的分组和随后的分组)的解密。第 i i i个密文分组中的差错对于所生成的明文有以下影响:第 i i i个明文分组每比特以50%的概率出错,第 i + 1 i+1 i+1个明文分组的差错模式与第 i i i个密文分组相同。如果在一个不到 n n n比特的分组中出现差错,差错扩散取决于所选择的处理方法。
6.6.5 同步
如果解密或解密之间的分组边界丢失了(例如由于一个比特的滑动),则在重新建立正确的分组边界之前,加密与解密之间将失去同步。如果分组边界丢失,所有解密操作的结果都是不正确的。