参考文档
NIST SP 800-38A Addendum. Addendum to NIST Special Publication 800-38A, Recommendation for Block Cipher Modes of Operation: Three Variants of Ciphertext Stealing for CBC Mode, October, 2010.
0. 简介
有三种密文偷窃模式
- CBC-CS1:最末两个块做挪动和特殊处理。当最末分组完整时,等价于CBC。
- CBC-CS2:当最末分组不完整时,把CBC-CS1的最末两个块交换位置;否则,保持CBC-CS1处理结果。
- CBC-CS3:无条件将CBC-CS1的最末两个块交换位置。
1. CBC-CS1
CBC-CS1-Encrypt
输入:明文P, 长为 len(P); 初始化向量IV; 密钥K. (分组大小为b)
输出:密文C, 长度 len(C) = len(P).
步骤:
步骤1. 分块数,
步骤2. d为最末一个分组的大小,1≤d≤b。
当len(p) mod b > 0时,d = len(p) mod b,当len(p) mod b = 0时,d = b。
步骤3. 明文划分P = P1 || P2 || ... || Pn-1 || Pn*,其中Pn*可能是完整分组(此时最末一个分组的大小d = b),也可能是不完整分组(此时d = len(p) mod b)。
步骤4. PAD为b-d比特的0,Pn= Pn* || PAD。如Pn*是完整分组,则PAD为空串。
步骤5. CBC加密:
C1 || C2 || ... || Cn-1 || Cn = CBC-ENC(K, IV, P1 || P2 || ... || Pn-1 || Pn)
步骤6. Cn-1* = MSBd(Cn-1)
步骤7. 返回C1 || C2 || ... || Cn-1* || Cn
当最末一个分组为完整分组时,CBC-CS1即为CBC模式。
2. CBC-CS2
上接CBC-CS1。
步骤8:判断最末一个分组是不是完整分组:
- 8.1 是完整分组,则不做改动,直接返回CBC-CS1的结果;
- 8.2 是不完整分组,则交换CBC-CS1密文最后两个分组的顺序后输出,即将C1 || C2 || ... || Cn-1* || Cn修改为C1 || C2 || ... || Cn || Cn-1*后输出。
3. CBC-CS3
上接CBC-CS1。
步骤8:强制交换CBC-CS1密文最后两个分组的顺序后输出,即将C1 || C2 || ... || Cn-1* || Cn修改为C1 || C2 || ... || Cn || Cn-1*后输出。(无论最末分组是否完整)