410 字
2 分钟
伪随机生成器与流密码:用短密钥保护长消息

一次一密要求密钥与消息等长,现实系统难以承担这种分发成本。伪随机生成器(PRG)提供了另一条路线:由短种子确定性地产生很长、计算上难以区分于随机数的序列。

PRG 的形式#

G:{0,1}s{0,1}n,snG: \{0,1\}^{s} \rightarrow \{0,1\}^{n}, \qquad s \ll n

其中 ss 是种子长度、nn 是输出长度。相同种子必然产生相同输出;它的安全要求不是“真正随机”,而是有效攻击者无法在计算上将输出与真正随机序列区分开。

短种子 → PRG → 长伪随机密钥流

流密码如何加密#

流密码将 PRG 生成的密钥流与明文逐位或逐字节异或:

c=mkeystreamc = m \oplus \operatorname{keystream}

解密使用同一密钥流再次异或即可恢复明文。它的结构与 OTP 相似,核心差异在于密钥流来自短密钥和算法,而非等长真随机密钥。

维度一次一密流密码
密钥材料真随机、与消息等长短密钥与 nonce/IV
安全基础信息论安全计算安全
可扩展性很差很好
密钥流不能复用

同一密钥和 nonce/IV 组合绝不能加密两条消息。复用后会产生与 OTP 密钥复用相同的问题:攻击者可通过两个密文的异或得到两个明文的异或。

实践建议#

不要自行组合“PRG + XOR”实现加密。工程中优先使用带认证的成熟方案,例如 ChaCha20-Poly1305 或 AES-GCM,并由可靠库负责 nonce、标签验证与密钥管理。

伪随机生成器与流密码:用短密钥保护长消息
https://blog.xqcherry.top/posts/cryptography/prg-and-stream-ciphers/
作者
xqcherry
发布于
2026-09-17
许可协议
CC BY-NC-SA 4.0