3. 对称密码基础:流密码与分组密码

对称密码是现代密码学的基石,其核心特征是加密和解密使用相同的密钥。根据处理数据的方式不同,对称密码主要分为两大流派:流密码(Stream Cipher)和分组密码(Block Cipher)。理解它们的区别、内部结构以及工作模式,是掌握安全通信协议的前提。

3.1 流密码与分组密码的核心区别

流密码与分组密码的根本差异在于数据处理的粒度和加密状态。

对比维度 流密码 分组密码
处理单位 逐比特或逐字节(通常为1比特) 逐块(如64比特、128比特)
加密方式 密钥流与明文流按位异或(XOR) 对固定大小的明文块进行复杂置换与代换
状态记忆 有状态(内部状态随加密过程变化) 无状态(每个块独立处理,工作模式引入状态)
典型算法 RC4、Salsa20、ChaCha20 AES、DES、SM4
错误传播 无错误传播(单比特错误仅影响对应比特) 有错误传播(取决于工作模式,可能影响整个块)
适用场景 实时流媒体、低延迟通信 文件加密、网络协议(TLS/IPsec)
关键理解:流密码的核心是生成一个与明文等长的、不可预测的密钥流(Keystream)。分组密码的核心则是通过多轮迭代,将明文块彻底“打乱”成密文块。流密码可以看作是一种“一次一密”的工程近似,而分组密码则更接近“伪随机置换”。

3.2 Feistel 网络结构

Feistel 网络是设计分组密码的一种经典结构,由 Horst Feistel 在 IBM 提出,是 DES 算法的基础。其核心思想是将数据块分为左右两半,通过多轮迭代,每轮只处理一半数据,并利用轮函数与另一半进行混合。

Feistel 网络单轮结构 明文块 (2w 比特) L₀ (w 比特) R₀ (w 比特) 轮函数 F (使用子密钥 K₁) R₁ = L₀ ⊕ F(R₀) L₁ = R₀ Feistel 网络特点 • 加密与解密结构相同,仅子密钥使用顺序相反 • 轮函数 F 不需要可逆,设计更灵活 • 典型轮数:DES 为 16 轮 • 代表算法:DES、Blowfish、Twofish
Feistel 网络单轮运算公式:
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)来快速实现混淆与扩散。

SPN 结构(单轮) 明文块 (n 比特) 轮密钥加 (AddRoundKey) 代换层 (S-box) 置换层 (P-box) 输出到下一轮 SPN 特点 • 代换层提供混淆(非线性),置换层提供扩散(线性) • 代表算法:AES(Rijndael)、SM4、PRESENT
Feistel vs SPN 关键差异:
  • 处理粒度: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 模式支持完全并行化,且预处理密钥流可实现极低延迟。

CTR 模式加密公式:
Cᵢ = Pᵢ ⊕ Eₖ(Nonce || Counterᵢ)

其中,Pᵢ 是第 i 个明文块,Cᵢ 是第 i 个密文块,Eₖ 是分组加密函数,Nonce 是每次加密唯一的随机数,Counterᵢ 是递增的计数器值。

3.5 工作模式对比总结

选择工作模式时,需要综合考虑安全性、性能和应用场景。以下是一个快速决策指南:

  • 需要并行加密且安全性高:选择 CTR 模式(现代首选)。
  • 需要兼容旧系统或标准:选择 CBC 模式(注意 IV 必须随机且不可预测)。
  • 需要流式加密且容忍少量错误:选择 CFB 模式。
  • 需要无错误传播的流式加密:选择 OFB 模式。
  • 不要使用:ECB 模式(除非是加密随机数据且长度固定)。
实践建议:在现代密码学应用中,CTR 模式和其认证变体 GCM(Galois/Counter Mode) 已成为事实标准。GCM 在 CTR 基础上增加了认证标签,能同时提供机密性和完整性保护,被广泛应用于 TLS 1.3、IPsec 和 SSH 中。