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 轮函数
- 扩展置换 E:将 32 位 R 扩展为 48 位
- 密钥混合:与 48 位子密钥异或
- S 盒替换:8 个 S 盒将 48 位压缩为 32 位——这是 DES 唯一的非线性部分
- 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 个密钥对,而是:
- 对已知明文 P,计算所有可能的 E(K₁, P)(256 个值),存入哈希表
- 对已知密文 C,计算所有可能的 D(K₂, C)(256 个值)
- 在两组值中找匹配
复杂度从 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₃₃
四步轮函数
- SubBytes(字节替换):每个字节通过 S 盒替换。AES 的 S 盒基于 GF(28) 中的乘法逆元后仿射变换,具有优秀的非线性特性。
- ShiftRows(行移位):第 i 行循环左移 i 个字节。提供行间扩散。
- MixColumns(列混合):每列在 GF(28) 中乘以固定矩阵。提供列间扩散。
- 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 等广泛采用。