分组密码总结¶
一、基本概念¶
块加密(即分组密码)是每次加密一块明文的对称加密算法。常见的加密算法有 IDEA、DES、AES。
块加密可以理解为一种特殊的替代密码,但每次替代一大块,明文空间巨大,必须有复杂的加解密算法。
两个关键辅助机制: - 填充 (Padding):将明文填充到指定分组长度。 - 分组加密模式:明文分组加密的方式。
二、设计策略¶
Shannon 提出的两大策略:
混淆 (Confusion)¶
将密文与密钥之间的统计关系变得尽可能复杂,使攻击者即使获取密文的统计特性也无法推测密钥。常见方法: - S 盒 - 乘法运算
扩散 (Diffusion)¶
使明文中的每一位影响密文中的许多位。常见方法: - 线性变换 - 置换 - 移位、循环移位
三、迭代结构¶
目前块加密主要使用迭代结构,便于设计与实现,同时方便安全性评估。

迭代结构包括三个部分: - 密钥置换(密钥扩展) - 轮加密函数 - 轮解密函数
轮函数设计方法¶
- Feistel Network:由 Horst Feistel 发明(DES 的设计者之一),适用于 DES。
- Substitution-Permutation Network (SPN):适用于 AES。
- 其他方案。
密钥扩展¶
基本原则是使密钥的每一个比特尽可能影响多轮的轮密钥。
四、DES¶
基本参数¶
- 输入/输出:64 位
- 密钥:64 位(实际使用 56 位,剩余 8 位废弃或作奇偶校验)
- 结构:Feistel 迭代结构,16 轮迭代
加密流程¶

每轮加密过程:
\[
L_{i+1} = R_i
\]
\[
R_{i+1} = L_i \oplus F(R_i, K_i)
\]
在最后的 Permutation 之前,密文为 \((R_{n+1}, L_{n+1})\)。
解密流程¶
解密时使用相同的逻辑,只是密钥顺序相反:
\[
R_i = L_{i+1}
\]
\[
L_i = R_{i+1} \oplus F(L_{i+1}, K_i)
\]
核心部件¶
- 初始置换
- F 函数:
- E 扩展函数
- S 盒(设计标准未公开)
- P 置换
- 最后置换

衍生方案¶
双重 DES (2DES):使用两个密钥,长度 112 位。
\[
C = E_{k_2}(E_{k_1}(P))
\]
⚠ 双重 DES 不能抵抗中间相遇攻击。分别枚举 \(k_1\) 加密 P 和 \(k_2\) 解密 C,在中间匹配。
三重 DES (3DES):
\[
C = E_{k_3}(D_{k_2}(E_{k_1}(P)))
\]
密钥选择: - 3 个不同密钥:168 位 - 2 个不同密钥(\(k_3 = k_1\)):112 位
攻击方法¶
- 差分攻击
- 线性攻击
五、AES¶
基本参数¶
- 输入/输出:128 位
- 结构:SPN 网络结构
- 由 Joan Daemen 和 Vincent Rijmen 设计
轮数与密钥长度的关系:
| 密钥长度(位) | 迭代轮数 |
|---|---|
| 128 | 10 |
| 192 | 12 |
| 256 | 14 |
块与 State 的转换¶

块中的字节按**列排列**进入状态数组。
加解密过程¶

每轮包含四个操作:
- 轮密钥加 (AddRoundKey):状态矩阵与轮密钥逐字节异或。
- 字节替换 (SubBytes):通过 S 盒(定义在 \(GF(2^8)\) 中)进行非线性替换。

- 行移位 (ShiftRows):状态矩阵的每一行循环左移不同偏移量。
- 列混淆 (MixColumns):状态矩阵的每一列在 \(GF(2^8)\) 上与固定多项式矩阵相乘,使用的模多项式为 \(x^8 + x^4 + x^3 + 1\)。

等价解密算法¶
- 交换逆向行移位和逆向字节代替不影响结果。
- 交换轮密钥加和逆向列混淆不影响结果(异或可视为域上多项式加法,乘法对加法有分配率)。
密钥扩展¶

攻击方法¶
- 积分攻击