目录

AES算法(四)基本工作模式

本文所述工作模式可适用于 DES、AES 等分组密码算法中

分组密码算法只能加密固定长度为 N 比特的分组数据(DES 和 3DES 算法中 N=64,AES 算法中 N=128),若待加密数据长度 != N ,则待加密数据需要被分组或填充至长度为 N 比特的数据块用以加密,至于如何分组及填充则取决于使用的工作模式和填充方式。

早在 1981 年,DES 算法公布之后,NIST 在标准文献 FIPS 81 中公布了 4 种工作模式:

  • 电子密码本:Electronic Code Book Mode (ECB)
  • 密码分组链接:Cipher Block Chaining Mode (CBC)
  • 密文反馈:Cipher Feedback Mode (CFB)
  • 输出反馈:Output Feedback Mode (OFB)

后面又新增了一些工作模式:

  • 计数器模式:Counter Mode (CTR)
  • 填充密码分组链接:Propagating Cipher Block Chaining Mode(PCBC)

ECB 模式

ECB 加密所需数据:明文 P、加密密钥 Key、数据填充模式 M。

ECB 加密步骤如下:

  • 将 P 分为 P0、P1、P2、…、Pn,Px 长度为 = 128,长度不足需填充
  • 用 Key 将 P0 加密得出 C0
  • 用 Key 将 P1 加密得出 C1
  • 用 Key 将 Pn 加密得出 Cn
  • 拼接 C0、C1、…Cn 得到密文 C

./topic-encryption-aes-4-1.png

./topic-encryption-aes-4-2.png

ECB 的理想应用场景是短数据(如加密密钥)的加密。ECB 模式中明文和密文是一一对应的,相同的明文分组加密将会得到相应的密文分组,因此它不能很好的隐藏模式。

CBC 模式

CBC 加密所需数据:明文 P、加密密钥 Key、初始向量 IV、数据填充模式 M。

CBC 加密步骤如下:

  • 将 P 分为 P0、P1、P2、…、Pn,Px 长度 = 128,长度不足需填充
  • 将 P0、IV 做异或运算得到 P0_IV,用 Key 将 P0_IV 加密得到 C0
  • 将 P1、C0 做异或运算得到 P1_IV,用 Key 将 P1_IV 加密得到 C1
  • 将 Pn、C(n-1) 做异或运算得到 Pn_IV,用 Key 将 Pn_IV 加密得到 Cn
  • 拼接 C0、C1、…Cn 得到密文 C

./topic-encryption-aes-4-3.png

./topic-encryption-aes-4-4.png

CBC 模式相比 ECB 实现了更好的模式隐藏,但因为其将密文引入运算,加解密操作无法并行操作。同时引入的 IV 向量,还需要加、解密双方共同知晓方可。

CFB 模式

CFB 加密所需数据:明文 P、加密密钥 Key、初始向量 IV。

CFB 加密步骤如下:

  • 将 P 分为 P0、P1、P2、…、Pn,Px 长度 <= 128
  • 用 Key 加密 IV 得到 IV0,将 IV0、P0 做异或运算得到 C0
  • 用 Key 加密 C0 得到 IV1,将 IV1、P1 做异或运算得到 C1
  • 用 Key 加密 C(n-1) 得到 IVn,将 IVn、Pn 做异或运算得到 Cn
  • 拼接 C0、C1、…Cn 得到密文 C,加密结束

./topic-encryption-aes-4-5.png

./topic-encryption-aes-4-6.png

CFB 模式是用分组算法实现流算法,明文数据不需要按分组大小对齐。

OFB 模式

OFB 加密所需数据:明文 P、加密密钥 Key、初始向量 IV。

OFB 加密步骤如下:

  • 将 P 分为 P0、P1、P2、…、Pn,Px 长度 <= 128
  • 用 Key 加密 IV 得到 IV0,将 IV0 与 P0 做异或运算得到 C0
  • 用 Key 加密 IV0 得到 IV1,将 IV1 与 P1 做异或运算得到 C1
  • 用 Key 加密 IV(n-1) 得到 IVn,将 IVn 与 Pn 做异或运算得到 Cn
  • 拼接 C0、C1、…Cn 得到密文 C

./topic-encryption-aes-4-7.png

./topic-encryption-aes-4-8.png

CTR 模式

CTR 加密所需数据:明文 P、加密密钥 Key、初始向量 IV。

CTR 加密步骤如下:

  • 将 P 分为 P0、P1、P2、…、Pn,Px 长度 <= 128
  • 生成累加计数器 c0、c1、c2、…、cn
  • 将 IV、c0 进行运算(连接、加和、异或等)得到 IV_c0,用 Key 加密 IV_c0 得到 IV0,将 IV0、P0 做异或运算得到 C0
  • 将 IV、c1 进行运算(连接、加和、异或等)得到 IV_c1,用 Key 加密 IV_c1 得到 IV1,将 IV1、P1 做异或运算得到 C1
  • 将 IV、cn 进行运算(连接、加和、异或等)得到 IV_cn,用 Key 加密 IV_cn 得到 IVn,将 IVn、Pn 做异或运算得到 Cn
  • 拼接 C0、C1、…Cn 得到密文 C

./topic-encryption-aes-4-9.png

./topic-encryption-aes-4-10.png

PCBC 模式

PCBC 加密所需数据:明文 P、加密密钥 Key、初始向量 IV、数据填充模式 M。

PCBC 加密步骤如下:

  • 将 P 分为 P0、P1、P2、…、Pn,Px 长度 = 128,长度不足需填充
  • 将 P0、IV 做异或运算得到 P0_IV,用 Key 将 P0_IV 加密得到 C0
  • 将 P1、C0、P0 做异或运算得到 P1_IV,用 Key 将 P1_IV 加密得到 C1
  • 将 Pn、C(n-1)、P(n-1) 做异或运算得到 Pn_IV,用 Key 将 Pn_IV 加密得到 Cn
  • 拼接 C0、C1、…Cn 得到密文 C

./topic-encryption-aes-4-11.png

./topic-encryption-aes-4-12.png