9 计数器工作模式
9.1 变量定义
CTR工作模式采用以下变量。
a)输入变量:
1) q q q个明文分组 P 1 , P 2 , . . . , P q P_1,P_2,...,P_q P1,P2,...,Pq所组成的序列(其中 P 1 , P 2 , . . . , P q − 1 P_1,P_2,...,P_{q-1} P1,P2,...,Pq−1都为 n n n比特, P q P_q Pq为 d d d比特且 0 < d ≤ n 0 < d \le n 0<d≤n);
2)密钥 K K K,需要加解密操作方约定一致,长度由分组密码算法 E E E决定;
3) q q q个计数序列 T 1 , T 2 , . . . , T q T_1,T_2,...,T_q T1,T2,...,Tq,需要加解密操作方约定一致,每个都为 n n n比特。
b)中间变量:
1) q q q个密码输出变量 Y 1 , Y 2 , . . . , Y q Y_1,Y_2,...,Y_q Y1,Y2,...,Yq所组成的序列,每个变量都为 n n n比特;
2)临时变量 Z Z Z,长度为 d d d比特。
c)输出变量:
q q q个密文分组 C 1 , C 2 , . . . , C q C_1,C_2,...,C_q C1,C2,...,Cq所组成的序列(其中 C 1 , C 2 , . . . , C q − 1 C_1,C_2,...,C_{q-1} C1,C2,...,Cq−1都为 n n n比特, C q C_q Cq为 d d d比特且 0 < d ≤ n 0 < d \le n 0<d≤n)。
9.2 CTR的加密方式描述
加密运算按照四个步骤进行:
a)加密计数序列: Y i = E k ( T i ) i = 1 , 2 , . . . , q Y_i=E_k(T_i) \quad i=1,2,...,q Yi=Ek(Ti)i=1,2,...,q;
b)加密前 q − 1 q-1 q−1个明文分组: C i = P i ⊕ Y i i = 1 , 2 , . . . , q − 1 C_i=P_i \oplus Y_i \quad i=1,2,...,q-1 Ci=Pi⊕Yii=1,2,...,q−1;
c)选择 Y q Y_q Yq左侧的 d d d比特: Z = d ∼ Y q Z=d \sim Y_q Z=d∼Yq;
d)加密最后一个明文分组: C q = P q ⊕ Z C_q=P_q \oplus Z Cq=Pq⊕Z。
此过程如下图所示。
9.3 CTR的加密方式示例
本示例使用的分组密码是GB/T 32907——2016中规定的SM4算法。所有变量采用“左高右低”的方式标记,即变量最左侧为其最高位。
此例所选的初始计数器为(十六进制)F0F1F2F3 F4F5F6F7 F8F9FAFB FCFDFEFF。
密钥密钥为(十六进制):2B7E1516 28AED2A6 ABF71588 09CF4F3C。
明文是(十六进制):6BC1BEE2 2E409F96 E93D7E11 7393172A
AE2D8A57 1E03AC9C 9EB76FAC 45AF8E51
30C81C46 A35CE411 E5FBC119 1A0A52EF
F69F2445 DF4F9B17 AD2B417B E66C3710。
i = 1 i=1 i=1时:
T 1 = T_1= T1= F0F1F2F3 F4F5F6F7 F8F9FAFB FCFDFEFF
Y 1 = E k ( T 1 ) = Y_1=E_k(T_1)= Y1=Ek(T1)= 7F6FF490 973A0C58 FB2BB2C8 EB7066EB
C 1 = P 1 ⊕ Y 1 = C_1=P_1 \oplus Y_1= C1=P1⊕Y1= (6BC1BEE2 2E409F96 E93D7E11 7393172A) ⊕ \oplus ⊕ (7F6FF490 973A0C58 FB2BB2C8 EB7066EB) = = = 14AE4A72 B97A93CE 1216CCD9 98E371C1
i = 2 i=2 i=2时:
T 2 = T 1 + 1 = T_2=T_1+1= T2=T1+1= F0F1F2F3 F4F5F6F7 F8F9FAFB FCFDFF00
Y 2 = E k ( T 2 ) = Y_2=E_k(T_2)= Y2=Ek(T2)= CEDA65DC 7D4711F1 3F2E4AA9 A053AFCA
C 2 = P 2 ⊕ Y 2 = C_2=P_2 \oplus Y_2= C2=P2⊕Y2= (AE2D8A57 1E03AC9C 9EB76FAC 45AF8E51) ⊕ \oplus ⊕ (CEDA65DC 7D4711F1 3F2E4AA9 A053AFCA) = = = 60F7EF8B 6344BD6D A1992505 E5FC219B
i = 3 i=3 i=3时:
T 3 = T 2 + 1 = T_3=T_2+1= T3=T2+1= F0F1F2F3 F4F5F6F7 F8F9FAFB FCFDFF01
Y 3 = E k ( T 3 ) = Y_3=E_k(T_3)= Y3=Ek(T3)= 3B384BBE CF019101 D9F48748 8675E008
C 3 = P 3 ⊕ Y 3 = C_3=P_3 \oplus Y_3= C3=P3⊕Y3= (30C81C46 A35CE411 E5FBC119 1A0A52EF) ⊕ \oplus ⊕ (3B384BBE CF019101 D9F48748 8675E008) = = = 0BF057F8 6C5D7510 3C0F4651 9C7FB2E7
i = 4 i=4 i=4时:
T 4 = T 3 + 1 = T_4=T_3+1= T4=T3+1= F0F1F2F3 F4F5F6F7 F8F9FAFB FCFDFF02
Y 4 = E k ( T 4 ) = Y_4=E_k(T_4)= Y4=Ek(T4)= DFB72146 85940187 41C45528 BFBBF81E
Z = d ∼ Y 4 = Z=d \sim Y_4= Z=d∼Y4= DFB72146 85940187 41C45528 BFBBF81E
C 4 = P 4 ⊕ Z = C_4=P_4 \oplus Z= C4=P4⊕Z= (F69F2445 DF4F9B17 AD2B417B E66C3710) ⊕ \oplus ⊕ (DFB72146 85940187 41C45528 BFBBF81E) = = = 29280503 5ADB9A90 ECEF1453 59D7CF0E
9.4 CTR的解密方式描述
解密运算按照以下四个步骤进行:
a)加密计数序列: Y i = E k ( T i ) i = 1 , 2 , . . . , q Y_i=E_k(T_i) \quad i=1,2,...,q Yi=Ek(Ti)i=1,2,...,q;
b)解密前 q − 1 q-1 q−1个密文分组: P i = C i ⊕ Y i i = 1 , 2 , . . . , q − 1 P_i=C_i \oplus Y_i \quad i=1,2,...,q-1 Pi=Ci⊕Yii=1,2,...,q−1;
c)选择 Y q Y_q Yq左侧的 d d d比特: Z = d ∼ Y q Z=d \sim Y_q Z=d∼Yq;
d)解密最后一个密文分组: P q = C q ⊕ Z P_q=C_q \oplus Z Pq=Cq⊕Z。
此过程如下图所示。
9.5 CTR的解密方式示例
本示例使用的分组密码是GB/T 32907——2016中规定的SM4算法。所有变量采用“左高右低”的方式标记,即变量最左侧为其最高位。
此例所选的初始计数器为(十六进制)F0F1F2F3 F4F5F6F7 F8F9FAFB FCFDFEFF。
密钥密钥为(十六进制):2B7E1516 28AED2A6 ABF71588 09CF4F3C。
密文是(十六进制):14AE4A72 B97A93CE 1216CCD9 98E371C1
60F7EF8B 6344BD6D A1992505 E5FC219B
0BF057F8 6C5D7510 3C0F4651 9C7FB2E7
29280503 5ADB9A90 ECEF1453 59D7CF0E。
i = 1 i=1 i=1时:
T 1 = T_1= T1= F0F1F2F3 F4F5F6F7 F8F9FAFB FCFDFEFF
Y 1 = E k ( T 1 ) = Y_1=E_k(T_1)= Y1=Ek(T1)= 7F6FF490 973A0C58 FB2BB2C8 EB7066EB
P 1 = C 1 ⊕ Y 1 = P_1=C_1 \oplus Y_1= P1=C1⊕Y1= (14AE4A72 B97A93CE 1216CCD9 98E371C1) ⊕ \oplus ⊕ (7F6FF490 973A0C58 FB2BB2C8 EB7066EB) = = = 6BC1BEE2 2E409F96 E93D7E11 7393172A
i = 2 i=2 i=2时:
T 2 = T 1 + 1 = T_2=T_1+1= T2=T1+1= F0F1F2F3 F4F5F6F7 F8F9FAFB FCFDFF00
Y 2 = E k ( T 2 ) = Y_2=E_k(T_2)= Y2=Ek(T2)= CEDA65DC 7D4711F1 3F2E4AA9 A053AFCA
P 2 = C 2 ⊕ Y 2 = P_2=C_2 \oplus Y_2= P2=C2⊕Y2= (60F7EF8B 6344BD6D A1992505 E5FC219B) ⊕ \oplus ⊕ (CEDA65DC 7D4711F1 3F2E4AA9 A053AFCA) = = = AE2D8A57 1E03AC9C 9EB76FAC 45AF8E51
i = 3 i=3 i=3时:
T 3 = T 2 + 1 = T_3=T_2+1= T3=T2+1= F0F1F2F3 F4F5F6F7 F8F9FAFB FCFDFF01
Y 3 = E k ( T 3 ) = Y_3=E_k(T_3)= Y3=Ek(T3)= 3B384BBE CF019101 D9F48748 8675E008
P 3 = C 3 ⊕ Y 3 = P_3=C_3 \oplus Y_3= P3=C3⊕Y3= (0BF057F8 6C5D7510 3C0F4651 9C7FB2E7) ⊕ \oplus ⊕ (3B384BBE CF019101 D9F48748 8675E008) = = = 30C81C46 A35CE411 E5FBC119 1A0A52EF
i = 4 i=4 i=4时:
T 4 = T 3 + 1 = T_4=T_3+1= T4=T3+1= F0F1F2F3 F4F5F6F7 F8F9FAFB FCFDFF02
Y 4 = E k ( T 4 ) = Y_4=E_k(T_4)= Y4=Ek(T4)= DFB72146 85940187 41C45528 BFBBF81E
Z = d ∼ Y 4 = Z=d \sim Y_4= Z=d∼Y4= DFB72146 85940187 41C45528 BFBBF81E
P 4 = C 4 ⊕ Z = P_4=C_4 \oplus Z= P4=C4⊕Z= (29280503 5ADB9A90 ECEF1453 59D7CF0E) ⊕ \oplus ⊕ (DFB72146 85940187 41C45528 BFBBF81E) = = = F69F2445 DF4F9B17 AD2B417B E66C3710
9.6 计数器工作模式的性质
9.6.1 场景
计数器模式下的分组密码算法使用序列号作为算法的输入。不是用加密算法的输出填充寄存器,而是将一个计数器输入到寄存器中。每一分组完成加密后,计数器都要增加某个常数,典型值是1。没有什么是专供计数器用的,它不必根据可能的输入计数。可以将随机序列发生器作为分组算法的输入,而不必考虑其密码上是否安全。
9.6.2 性质
CTR的性质有:
a)加密运算可并行处理,吞吐量仅受可使用并行数量的限制;
b)使用不同的计数器生成不同的密钥流,可防止同一明文加密成同一密文;
c)CTR工作模式的加密和解密过程都使用分组密码的加密运算;
d)CTR工作模式不依赖明文生成用于对明文进行异或运算的密钥流。
9.6.3 填充明文
计数器模式不需要填充明文,可以处理任意长度的明文。
9.6.4 差错扩散
CTR模式不在生成的明文输出中扩散密文差错。密文中每一差错比特只会引起解密后的明文中出现一个差错比特。
9.6.5 同步
CTR工作模式不是自动同步的。如果加密和解密两个操作不同步,系统需要重新初始化。这种同步丢失可能由于插入或丢失任意数目的密文所引起。
每次重新初始化应使用一个新的计数器值,它不同于与同一个密钥一起使用的以前的计数器值。其原因是对于相同的参数,每次都要生成相同的密钥流。这将易于受到“已知明文攻击”。