3. 对称密码基础:流密码与分组密码
对称密码是现代密码学的基石,其核心特征是加密和解密使用相同的密钥。根据处理数据的方式不同,对称密码主要分为两大流派:流密码(Stream Cipher)和分组密码(Block Cipher)。理解它们的区别、内部结构以及工作模式,是掌握安全通信协议的前提。
3.1 流密码与分组密码的核心区别
流密码与分组密码的根本差异在于数据处理的粒度和加密状态。
| 对比维度 | 流密码 | 分组密码 |
|---|---|---|
| 处理单位 | 逐比特或逐字节(通常为1比特) | 逐块(如64比特、128比特) |
| 加密方式 | 密钥流与明文流按位异或(XOR) | 对固定大小的明文块进行复杂置换与代换 |
| 状态记忆 | 有状态(内部状态随加密过程变化) | 无状态(每个块独立处理,工作模式引入状态) |
| 典型算法 | RC4、Salsa20、ChaCha20 | AES、DES、SM4 |
| 错误传播 | 无错误传播(单比特错误仅影响对应比特) | 有错误传播(取决于工作模式,可能影响整个块) |
| 适用场景 | 实时流媒体、低延迟通信 | 文件加密、网络协议(TLS/IPsec) |
3.2 Feistel 网络结构
Feistel 网络是设计分组密码的一种经典结构,由 Horst Feistel 在 IBM 提出,是 DES 算法的基础。其核心思想是将数据块分为左右两半,通过多轮迭代,每轮只处理一半数据,并利用轮函数与另一半进行混合。
Lᵢ = Rᵢ₋₁
Rᵢ = Lᵢ₋₁ ⊕ F(Rᵢ₋₁, Kᵢ)
其中,i 表示轮数,F 是轮函数,Kᵢ 是第 i 轮的子密钥。经过 n 轮后,输出 (Rₙ, Lₙ) 即为密文块。
3.3 SPN 结构(代换-置换网络)
SPN(Substitution-Permutation Network)是另一种主流的分组密码设计结构,AES 是其最著名的实现。与 Feistel 网络不同,SPN 在每一轮中同时处理整个数据块,通过交替进行“代换”(S-box)和“置换”(P-box)来快速实现混淆与扩散。
- 处理粒度:Feistel 每轮只处理一半数据;SPN 每轮处理整个数据块。
- 轮函数可逆性:Feistel 的轮函数无需可逆;SPN 的 S-box 必须可逆(解密时使用逆 S-box)。
- 扩散速度:SPN 通常比 Feistel 扩散更快,安全性分析更直观。
- 硬件实现:Feistel 更节省硬件资源;SPN 更适合并行化。
3.4 分组密码工作模式
分组密码本身只能加密固定长度的数据块。为了加密任意长度的消息,并增强安全性,需要定义不同的工作模式。以下是五种经典模式。
| 模式 | 全称 | 是否需要 IV | 并行加密 | 错误传播 | 典型应用 |
|---|---|---|---|---|---|
| ECB | 电子密码本 | 否 | 是 | 无(块内) | 不建议使用 |
| CBC | 密码分组链接 | 是(随机) | 否 | 影响当前块及下一块 | 文件加密、TLS 1.0 |
| CFB | 密文反馈 | 是(随机) | 否 | 影响当前块及后续块 | 流式加密 |
| OFB | 输出反馈 | 是(随机) | 否 | 无(仅影响当前比特) | 卫星通信 |
| CTR | 计数器 | 是(Nonce + 计数器) | 是 | 无(仅影响当前块) | 磁盘加密、TLS 1.2/1.3 |
3.4.1 ECB 模式(电子密码本)
最简单的模式,每个明文块独立使用相同的密钥加密。相同的明文块产生相同的密文块,容易泄露数据模式,不建议在任何安全场景中使用。
3.4.2 CBC 模式(密码分组链接)
每个明文块先与前一个密文块进行 XOR,然后再加密。第一个块使用随机生成的初始化向量(IV)。CBC 是历史上最广泛使用的模式,但加密过程是串行的,无法并行。
3.4.3 CFB 模式(密文反馈)
将分组密码转换为自同步的流密码。加密时,前一个密文块被送入分组密码加密,输出与当前明文块 XOR 生成密文。解密时,即使丢失一个密文块,也能从后续块中恢复同步。
3.4.4 OFB 模式(输出反馈)
将分组密码转换为同步流密码。加密时,分组密码的输出被反馈到输入,形成密钥流。密钥流与明文 XOR 生成密文。OFB 模式没有错误传播,但需要保持发送方和接收方的密钥流同步。
3.4.5 CTR 模式(计数器)
当前最推荐的工作模式。加密时,使用一个 Nonce(一次性随机数)与递增的计数器拼接,作为分组密码的输入,生成密钥流。CTR 模式支持完全并行化,且预处理密钥流可实现极低延迟。
Cᵢ = Pᵢ ⊕ Eₖ(Nonce || Counterᵢ)
其中,Pᵢ 是第 i 个明文块,Cᵢ 是第 i 个密文块,Eₖ 是分组加密函数,Nonce 是每次加密唯一的随机数,Counterᵢ 是递增的计数器值。
3.5 工作模式对比总结
选择工作模式时,需要综合考虑安全性、性能和应用场景。以下是一个快速决策指南:
- 需要并行加密且安全性高:选择 CTR 模式(现代首选)。
- 需要兼容旧系统或标准:选择 CBC 模式(注意 IV 必须随机且不可预测)。
- 需要流式加密且容忍少量错误:选择 CFB 模式。
- 需要无错误传播的流式加密:选择 OFB 模式。
- 不要使用:ECB 模式(除非是加密随机数据且长度固定)。