4. 流密码原理与工程实现

流密码(Stream Cipher)是一类逐比特或逐字节加密的对称密码体制。它的核心思想是:用一个短密钥通过伪随机数生成器(PRNG)扩展成与明文等长的密钥流,再与明文进行异或运算得到密文。解密时用同一密钥流再次异或即可还原明文。流密码在实时通信、无线网络、TLS 早期版本等场景中应用广泛,其安全性直接取决于密钥流的随机性和不可预测性。

4.1 一次一密:理想但不可工程化

一次一密(One-Time Pad, OTP)是唯一被证明具有信息论安全性的加密方案。其要求是:密钥流必须与明文等长、完全随机、仅使用一次,且严格保密。满足这些条件时,密文不泄露明文的任何信息。然而,OTP 在工程中几乎不可行:密钥分发需要安全信道,密钥存储量与通信量成正比,且密钥重用会立即导致灾难性泄露。因此,实际流密码用伪随机序列替代真随机序列,牺牲信息论安全性换取可工程性。

4.2 伪随机序列与 LFSR

伪随机序列由确定性算法生成,但统计特性接近随机序列。评价伪随机序列的常用指标包括:周期长度、平衡性(0 和 1 的数量接近相等)、游程分布、自相关函数等。线性反馈移位寄存器(LFSR)是最基础的伪随机序列生成结构,由移位寄存器和反馈抽头组成。一个 n 级 LFSR 的周期最大为 2^n - 1,当反馈多项式为本原多项式时达到最大周期。

LFSR 的优点是速度快、硬件实现简单,但纯 LFSR 序列具有线性关系,已知 2n 个连续比特即可通过 Berlekamp-Massey 算法恢复整个序列。因此,实际流密码通常将多个 LFSR 组合,或引入非线性函数来破坏线性性。

4.3 RC4 算法

RC4 是 Ron Rivest 于 1987 年设计的流密码,曾广泛应用于 WEP、WPA 早期版本和 SSL/TLS。RC4 分为密钥调度算法(KSA)和伪随机生成算法(PRGA)两个阶段。

KSA 阶段:初始化 256 字节的状态数组 S,使 S[i] = i;然后用密钥 K 对 S 进行置换,伪代码如下:

for i = 0 to 255:
    j = (j + S[i] + K[i mod keylen]) mod 256
    swap(S[i], S[j])

PRGA 阶段:每次生成一个字节的密钥流,并更新状态:

i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap(S[i], S[j])
output = S[(S[i] + S[j]) mod 256]

RC4 的密钥流与明文异或得到密文。其优点是软件实现极快,但存在严重安全缺陷:密钥流的前几个字节存在偏差,且存在大量弱密钥。2015 年 RFC 7465 已禁止在 TLS 中使用 RC4。

4.4 密钥流重用攻击与防护

流密码最致命的错误是密钥流重用。若同一密钥流 K 加密两条明文 M1 和 M2,得到密文 C1 = M1 ⊕ K 和 C2 = M2 ⊕ K,则 C1 ⊕ C2 = M1 ⊕ M2。攻击者无需知道密钥即可获得两条明文的异或值,结合语言统计、已知明文片段等即可恢复明文。WEP 协议因 IV 空间过小导致密钥流重用,是经典反面案例。

防护措施包括:

  • 每次加密使用唯一 Nonce 或随机 IV,并将其与密钥一起输入密钥流生成器;
  • 确保 IV 空间足够大,避免碰撞;
  • 使用经过认证的流密码模式(如 ChaCha20-Poly1305),同时提供机密性和完整性;
  • 避免使用已知弱密钥或短密钥。
密钥流重用是流密码工程实现中的头号禁忌。任何情况下都不得用同一密钥流加密两份不同的数据。

4.5 流密码安全性分析要点

评估流密码安全性时,应关注以下维度:

  • 密钥流周期:周期必须足够长,避免重复。
  • 线性复杂度:应足够高,抵抗 Berlekamp-Massey 攻击。
  • 统计随机性:通过 NIST SP 800-22 等测试套件。
  • 抗已知明文攻击:已知部分明文不应能推导密钥流其余部分。
  • 初始化向量处理:IV 应参与密钥流生成,且不同 IV 产生独立密钥流。

下图展示了流密码的典型加解密流程与密钥流重用攻击的对比关系:

流密码加解密流程与密钥流重用攻击 正常加密/解密 密钥 K 伪随机生成器 PRNG / LFSR / RC4 密钥流 KS ⊕ 明文 M 密文 C = M ⊕ KS 解密(同一密钥流) 密文 C ⊕ 密钥流 KS 明文 M 密钥流重用攻击 明文 M₁ 明文 M₂ ⊕ ⊕ 同一密钥流 KS(重用!) 密文 C₁ 密文 C₂ ⊕ C₁ ⊕ C₂ = M₁ ⊕ M₂ 密钥流被抵消

4.6 工程实现建议

在实际工程中,若必须使用流密码,应优先选择经过充分分析且标准化的算法,如 ChaCha20。ChaCha20 使用 256 位密钥和 96 位 Nonce,密钥流生成速度快且抗密码分析能力强。实现时需注意:Nonce 必须唯一,推荐使用计数器模式;密钥应通过安全随机数生成器产生;加密后应附加消息认证码(如 Poly1305)以防止篡改。

对于自研流密码,必须经过严格的密码学审查和统计测试,切勿直接使用纯 LFSR 或 RC4 等已知不安全的算法。流密码的安全性建立在密钥流的不可预测性之上,任何线性、偏差或重用都会导致整个系统的崩溃。

教学示例:假设使用 RC4 加密两条消息,密钥相同且未使用 IV,则攻击者可通过 C₁ ⊕ C₂ 获得 M₁ ⊕ M₂,再结合英文空格(0x20)的统计特性即可逐步恢复明文。这说明了密钥流重用的实际危害。