什么是分组加密模式?

AES 是分组加密算法,将数据分成固定长度(128 位)的块进行加密。工作模式定义了如何处理多个数据块。

不同模式决定了各块之间是否关联,直接影响安全性。

ECB 模式(Electronic Codebook)

原理

每个数据块独立加密,相同明文块产生相同密文块。

安全问题

致命缺陷:模式泄露。相同内容产生相同密文,暴露数据模式。

示例:加密重复数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 创建测试文件:两个相同的 16 字节块
printf 'AAAAAAAAAAAAAAAA' > /tmp/ecb_test.txt
printf 'AAAAAAAAAAAAAAAA' >> /tmp/ecb_test.txt
printf 'BBBBBBBBBBBBBBBB' >> /tmp/ecb_test.txt
printf 'BBBBBBBBBBBBBBBB' >> /tmp/ecb_test.txt

# ECB 加密(使用固定密钥)
openssl enc -aes-128-ecb -in /tmp/ecb_test.txt -out /tmp/ecb_enc.bin \
  -K 0123456789abcdef0123456789abcdef

# 查看密文(注意重复模式)
od -A x -t x1z /tmp/ecb_enc.bin

输出显示重复的密文块(* 表示与前一行相同):

1
2
3
4
000000 37 b5 61 68 c3 0b 0c 9b a1 c5 31 20 be 60 4b 7f
*
000020 84 a4 6e 60 2c 82 76 92 58 86 2b 21 38 d9 14 2a
*

攻击者可识别数据模式,甚至进行块替换攻击。

结论

禁止在生产环境使用 ECB 模式

CBC 模式(Cipher Block Chaining)

原理

每个明文块先与前一个密文块异或,再加密。第一个块与 IV(初始化向量)异或。

关键: IV 必须是随机且不可预测的。

示例

1
2
3
4
5
6
7
# CBC 加密(相同数据)
openssl enc -aes-128-cbc -in /tmp/ecb_test.txt -out /tmp/cbc_enc.bin \
  -K 0123456789abcdef0123456789abcdef \
  -iv 0123456789abcdef0123456789abcdef

# 查看密文(无重复模式)
od -A x -t x1z /tmp/cbc_enc.bin

输出显示完全不同的密文块:

1
2
3
4
000000 ac 7f d9 63 eb 5d f6 79 bb aa a0 7a c8 78 29 fd
000010 a3 ff f7 23 10 fc f8 22 a9 95 f1 ac c2 68 2c fb
000020 34 4c e6 eb cf 1c d5 cf da c4 78 7d dc 3d c6 df
000030 f7 28 d6 b8 b0 df 62 28 2a 95 e0 d1 27 8e 7b d1

使用 OpenSSL 进行 CBC 加密

1
2
3
4
5
6
7
8
9
# 加密文件(推荐使用 PBKDF2)
openssl enc -aes-256-cbc -salt -pbkdf2 \
  -in plaintext.txt -out encrypted.bin \
  -pass pass:YourPassword

# 解密文件
openssl enc -d -aes-256-cbc -pbkdf2 \
  -in encrypted.bin -out plaintext.txt \
  -pass pass:YourPassword

安全注意事项

  1. IV 必须随机:相同密钥+相同 IV 加密相同数据会暴露关系
  2. 需要填充:数据长度不是块大小倍数时需要填充(PKCS#7)
  3. 无完整性保护:需要配合 HMAC 或使用认证加密

CTR 模式(Counter)

原理

将分组加密转换为流加密,加密计数器值后与明文异或。无需填充,支持并行加密解密。

使用示例

1
2
3
4
5
6
7
# CTR 模式加密
openssl enc -aes-256-ctr -in plaintext.txt -out encrypted.bin \
  -pass pass:YourPassword -pbkdf2

# CTR 模式解密
openssl enc -d -aes-256-ctr -in encrypted.bin -out plaintext.txt \
  -pass pass:YourPassword -pbkdf2

特点

  1. 无需填充:流加密模式,任意长度数据
  2. 可并行:加密解密都可并行处理
  3. Nonce 不可重用:相同密钥+相同 Nonce 会导致严重安全问题
  4. 无完整性保护:同样需要配合 HMAC

GCM 模式(Galois/Counter Mode)

原理

GCM 是 认证加密(AEAD) 模式,同时提供加密和完整性验证:

  • 加密:使用 CTR 模式
  • 认证:使用 GHASH 算法计算认证标签

OpenSSL enc 不支持 GCM

1
2
openssl enc -aes-256-gcm -in plaintext.txt -out encrypted.bin -pass pass:pwd
# 输出:enc: AEAD ciphers not supported

OpenSSL 的 enc 命令不支持 AEAD 密码。如需使用 GCM,应通过编程接口(如 EVP API)或其他工具实现。

GCM 的优势

  1. 认证加密:一次操作完成加密和认证
  2. 无需额外 HMAC:内置完整性保护
  3. 高性能:可并行计算
  4. TLS 1.3 默认:现代协议的首选模式

模式对比总结

模式 填充 完整性 并行 安全性 推荐场景
ECB 需要 ❌ 不安全 禁止使用
CBC 需要 ✓ 安全 文件加密
CTR 无需 ✓ 安全 流数据
GCM 无需 ✓ 最佳 TLS、网络

选择建议

文件加密

1
2
# 推荐:AES-256-CBC + PBKDF2
openssl enc -aes-256-cbc -salt -pbkdf2 -in file.txt -out file.enc -pass pass:pwd

网络传输

使用 GCM 模式(通过编程接口或 TLS 协议)。

不要使用

  • ECB 模式(任何场景)
  • DES、3DES 算法(已过时)

参考来源