经典对称加密算法

DES(Data Encryption Standard)

1977 年成为美国联邦标准,由 IBM 设计(基于 Lucifer 算法),密钥长度 56 位,块大小 64 位。

Feistel 结构

DES 的核心架构。将 64 位块分为左右两半 L 和 R(各 32 位),经过 16 轮迭代:

Li = Ri-1
Ri = Li-1 ⊕ f(Ri-1, Ki)

Feistel 结构的优点:加密和解密使用相同的结构(只需反转子密钥顺序),f 函数不需要可逆。

DES 轮函数

  1. 扩展置换 E:将 32 位 R 扩展为 48 位
  2. 密钥混合:与 48 位子密钥异或
  3. S 盒替换:8 个 S 盒将 48 位压缩为 32 位——这是 DES 唯一的非线性部分
  4. P 置换:32 位置换,扩散 S 盒的输出

密钥调度

56 位密钥(加上 8 位奇偶校验共 64 位)经过置换选择、循环左移,生成 16 个 48 位子密钥。

安全性

56 位密钥太短:1998 年 EFF 的"Deep Crack"专用硬件在 56 小时内暴力破解。现代 FPGA 可在一天内破解。DES 已完全不安全。

2DES 与中间相遇攻击

双重 DES:C = E(K₂, E(K₁, P)),密钥长度 112 位。

中间相遇攻击(Meet-in-the-Middle):攻击者不需要搜索 2112 个密钥对,而是:

  1. 对已知明文 P,计算所有可能的 E(K₁, P)(256 个值),存入哈希表
  2. 对已知密文 C,计算所有可能的 D(K₂, C)(256 个值)
  3. 在两组值中找匹配

复杂度从 2112 降到 2 × 256 ≈ 257,几乎不比单 DES 安全。

3DES(Triple DES)

使用 EDE(Encrypt-Decrypt-Encrypt)模式:C = E(K₃, D(K₂, E(K₁, P)))。

用 D 而不是 E 的原因:当 K₁ = K₂ = K₃ 时退化为普通 DES(向后兼容)。

双密钥 3DES(K₁ = K₃):有效安全强度约 80 位,仍在金融支付系统(ATM、POS)中广泛使用。

三密钥 3DES:112 位安全强度,但速度慢(是 AES 的数十分之一)。

AES(Advanced Encryption Standard)

1997 年 NIST 公开征集新标准。2000 年从 15 个候选算法中选出 Rijndael(由比利时密码学家 Joan Daemen 和 Vincent Rijmen 设计),2001 年正式成为标准。

密钥长度:128、192、256 位;块大小:128 位;轮数:10、12、14 轮。

设计思想

AES 不是 Feistel 结构,而是替代-置换网络(SPN)。每一轮对整个 128 位块同时操作。

将 128 位状态排列为 4×4 字节矩阵(State Matrix):

S₀₀  S₀₁  S₀₂  S₀₃
S₁₀  S₁₁  S₁₂  S₁₃
S₂₀  S₂₁  S₂₂  S₂₃
S₃₀  S₃₁  S₃₂  S₃₃

四步轮函数

  1. SubBytes(字节替换):每个字节通过 S 盒替换。AES 的 S 盒基于 GF(28) 中的乘法逆元后仿射变换,具有优秀的非线性特性。
  2. ShiftRows(行移位):第 i 行循环左移 i 个字节。提供行间扩散。
  3. MixColumns(列混合):每列在 GF(28) 中乘以固定矩阵。提供列间扩散。
  4. AddRoundKey(轮密钥加):状态与轮密钥异或。

注意:最后一轮没有 MixColumns(解密时同样处理)。

密钥扩展

从 128/192/256 位主密钥扩展出所有轮密钥。使用 RotWord、SubWord(S 盒)、Rcon(轮常数)操作。

安全性

AES 是目前最安全、最广泛使用的对称加密算法。最好的已知攻击只能将复杂度降低约 4 倍(对于 AES-128 的 7 轮版本),完整 10 轮 AES 无实际攻击。

AES-256 是美国国家安全等级最高的机密信息允许使用的算法。

其他重要算法

RC4

流密码,密钥长度可变(40~2048 位)。曾是 SSL/TLS、WEP 的标准算法。现已不安全:密钥调度存在偏差,可用于 WEP 破解和 TLS 攻击(如 RC4 NOMORE)。

ChaCha20

由 Daniel J. Bernstein 设计的现代流密码。使用 256 位密钥 + 96 位 Nonce,生成密钥流。

核心是 ARX(Add-Rotate-XOR)操作,每轮 20 步(ChaCha20)。在软件中比 AES 快(尤其没有 AES-NI 的平台)。

与 Poly1305 组合成 ChaCha20-Poly1305 提供 AEAD,被 TLS 1.3、WireGuard 等广泛采用。