现代分组密码的操作模式

操作模式介绍

现代分组密码(即 DES 和 AES),是设计用来对固定长度的文本分组进行加密和解密的。
如 DES 可以对一个 64 比特的分组进行加密和解密。AES 可以对一个 128 比特的分组进行加密和解密。

而在实际运用中,要加密的文本长度是可变的,通常大于 64 或 128 比特。于是就有了操作模式,有了它就可以将分组密码应用在消息和大单位文件或小单位文件的加密上。

这里讨论的五种操作模式分别是:电子密码本模式(ECB),密码分组链接模式(CBC),密码反馈模式(CFB),输出反馈模式(OFB),以及计数器模式(CTR)。

电子密码本模式,Electronic Codebook

电子密码本模式是最简单的操作模式。
明文按照分组密码的分组大小(n 比特)被分为 N 个分组,对于每个分组使用相同的密钥加密。

ECB_encryption
ECB_decryption

$$ 加密: C_i = E_K (P_i) $$

$$ 解密: P_i = D_K (C_i) $$

  • 缺点在于同样的明文块会被加密成相同的密文块。因此不能很好地隐藏数据模式。在某些场合,这种方法不能提供严格的数据保密性,因此并不推荐用于密码协议中。
  • ECB模式也会导致使用它的协议不能提供数据完整性保护,易受到重放攻击的影响,因此每个块是以完全相同的方式解密的。
  • 优势在于由于密文分组的独立性,如果需要创建一个非常大的加密数据库的话,可以运用平行处理。
  • 错误传播:传播中一个单比特错误就可以在相应的分组中造成多个比特的错误,不过这种错误对其他分组没有影响。

密码分组链接模式,Cipher Block Chaining

在CBC模式中,每个明文分组在加密之前需要先与前一个密文分组进行异或。对一个分组加密后,就要把这个分组发送出去,但是它的副本要保存在存储器中,以便在下一个分组加密时使用。
在这种方法中,每个密文分组都依赖于它前面的所有明文分组。同时,为了保证每条消息的唯一性,在第一个分组中需要使用一个预先确定的初始化向量(IV)

CBC_encryption
CBC_decryption

在发送方,异或要在加密前完成;
在接收方,异或是在解密后完成。

$$ 加密: C_i = E_K (P_i \oplus C_{i-1}), C_0 = IV, i = 1,2,3… $$

$$ 解密: P_i = D_K (C_i) \oplus C_{i-1}, C_0 = IV, i = 1,2,3… $$

  • CBC是最为常用的工作模式。其主要缺点在于加密过程是串行的,无法被并行化,而在解密时,从两个邻接的密文分组中即可得到一个明文分组。因此,解密过程可以被并行化。
  • 错误传播:传送过程中密文分组 $C_i$ 的一个单比特错误,在解密时会造成明文分组 $P_i$ 的大部分比特错误,以及下一个明文分组 $P_{i+1}$ 的一个(相同位置上的)比特错误,不会影响到其它明文分组的内容。
  • 加密不同消息时使用的 IV 不应相同。

密码反馈模式,CFB

CFB模式适用于明文分组较小的情况,在DES或AES中使用的分组大小为 $n$,明文分组为 $r$,其中 $r \leq n$.
DES或AES并不直接对明文加密,而是对大小为 $n$ 的移位寄存器 $S$ 的内容加密。对于一个明文分组,加密时通过异或一个 将移位寄存器加密得到的密文的 $r$ 比特,从而得到密文分组。这个密文分组将填充 移位寄存器左移 $r$ 比特后 最右边的 $r$ 比特,得到新的移位寄存器进行之后的加密。

CFB

$$ 加密: C_i = P_i \oplus SelectLeft_r {E_K [ShiftLeft_r (S_{i-1}) | C_{i-1}]} $$

$$ 解密: P_i = C_i \oplus SelectLeft_r {E_K [ShiftLeft_r (S_{i-1}) | C_{i-1}]} $$

  • CFB模式虽然使用块加密的方法,但它是异步流密码。
  • IV 的使用:每次发送消息时要使用不同的 IV
  • 与CBC相似,明文的改变会影响接下来所有的密文,因此加密过程不能并行化,但解密过程是可以并行化的。
  • 在解密时,密文中一位数据的改变仅会影响两个明文分组:对应明文分组中的一位数据与下一分组中全部的数据,而之后的数据将恢复正常。
    -适用于每次加密一个小的分组,如一个字符或一个比特,且消息无需进行填充。

输出反馈模式,OFB

输出反馈模式与CFB模式非常类似,但密文中的每个比特独立于先前的比特,避免了错误传播。
输出反馈模式将将基本分组密码变成了同步流密码。它产生密钥流的分组,然后将其与明文分组进行异或,得到密文。

OFB

$$ 加密: C_i = P_i \oplus O_i $$

$$ 解密: P_i = C_i \oplus O_i $$

$$ O_i = ShiftLeft_r {E_K [ShiftLeft_r (S_{i-1}) | O_{i-1}]}, O_0 = IV $$

  • 每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于明文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将明文或密文进行并行的异或处理。
  • 密文中的单个比特错误只影响明文中的相应(相同位置)的比特。这种特性使得许多错误校正码,例如奇偶校验位,即使在加密前计算而在加密后进行校验也可以得出正确结果。
  • 可以利用输入全 0 的 CBC 模式产生 OFB 模式的密钥流。这种方法十分实用,因为可以利用快速的CBC硬件实现来加速 OFB 模式的加密过程。

计数器模式,CTR

CTR将分组密码变为流密码。它通过递增一个加密计数器以产生连续的密钥流,其中,计数器可以是任意保证长时间不产生重复输出的函数。
计数器初值为一个预设的 IV, 并按照预先确定的规则 (mod 2^n) 增加。

CTR

$$ 加密: C_i = P_i \oplus E_{K_i} (counter_i) $$

$$ 解密: P_i = C_i \oplus E_{K_i} (counter_i) $$

  • 错误传播:密文中的单个比特错误之影响明文中对应的比特。
  • 通过预处理,加密和解密过程均可以并行处理。
  • 可以用来对随机存取件进行加密和解密。
  • 广泛应用,如 ATM 网络和 IPSec.

比较

  1. ECB 和 CBC 的结果类型是分组密码。而 CFB,OFB 和 CTR 的结果类型是流密码。
  2. CFB 和 OFB 使用时明文分组小小 $r \leq n$。ECB,CBC 和 CTR 使用时明文分组大小 $r = n $,所以可能需要对消息进行填充。
  3. ECB,OFB 和 CTR 不会发生错误传播。CBC 和 CFB 可能发生错误传播。

参考

  1. wikipedia
  2. Book: Cryptography and Network Security, Behrouz A. Forouzan