流密码
流密码通过从秘密密钥生成伪随机密钥流并将其与明文结合来加密数据,通常一次一个比特或一个字节,通过短密钥模拟完美安全的一次性密码本。
Definition
流密码是一种对称加密方案,它从秘密密钥(通常还有随机数)生成一个长的伪随机密钥流,并通过将密钥流与明文结合进行加密,最常见的是通过按位异或。
Scope
本主题涵盖流密码的设计和分析:由线性反馈移位寄存器构建的密钥流生成器、组合器和滤波器结构,以及ChaCha20和eSTREAM组合等现代面向软件的设计。它讨论了与一次性密码本的关系、绝不重复使用密钥流的关键要求,以及由密钥流重复使用或弱生成器引起的攻击。它不包括分组密码,尽管处于计数器模式的分组密码实际上可以作为流密码运行。
Core questions
- 短密钥如何能被扩展成一个长而不可预测的密钥流,从而模仿一次性密码本?
- 为什么重复使用密钥流是灾难性的,以及随机数如何防止这种情况发生?
- 是什么让密钥流生成器在密码学上强大,而不仅仅是统计上的随机?
- 像ChaCha20这样的现代流密码如何在没有专用硬件的情况下实现高速?
- 哪些经典攻击(相关性、代数)会破解基于LFSR的弱设计?
Key concepts
- 密钥流
- 一次性密码本
- 线性反馈移位寄存器
- 随机数和初始化向量
- 密钥流重用(两次密码本)
- ChaCha20和Salsa20
- 相关性攻击
- 同步密码与自同步密码
Key theories
- 一次性密码本和完美保密性
- 通过与消息一样长的真正随机密钥进行异或加密可以实现香农的完美保密性;流密码通过用伪随机密钥流代替不切实际的真正随机密码本来近似实现这一点。
- 密钥流生成和密码学伪随机性
- 安全的流密码是一个伪随机生成器:其密钥流必须在计算上与随机不可区分,以便即使观察到许多比特,任何高效的攻击者也无法预测未来的密钥流比特。
Mechanisms
同步流密码从密钥和随机数初始化内部状态,然后重复更新状态并发出独立于明文的密钥流输出。密钥流与明文进行异或以进行加密,与密文进行异或以进行解密。基于线性反馈移位寄存器的设计在硬件中速度快,但需要非线性组合器来抵抗代数攻击;像ChaCha20这样的软件密码使用大状态上的加法-旋转-异或(ARX)操作来实现速度和安全性。
Clinical relevance
ChaCha20(带Poly1305认证器)广泛部署在TLS 1.3、OpenSSH、WireGuard和移动消息中,在缺乏硬件AES加速的设备上,它优于AES。流密码非常适合流媒体和低延迟链接。历史上,RC4流密码保护了早期的SSL/TLS和WEP Wi-Fi,直到其偏差导致其被弃用。
Evidence & guidelines
ChaCha20-Poly1305在RFC 8439中标准化并被TLS批准。由于密钥流偏差,RC4在RFC 7465中被TLS禁止。eSTREAM项目(2004-2008)产生了一系列经过审查的流密码。所有标准中的首要规则是(密钥,随机数)对绝不能重复使用。
History
流密码源于维尔南密码(1917年)和一次性密码本。冷战时期的军事系统使用基于移位寄存器的密钥流生成器。Ron Rivest于1987年设计的RC4变得极其广泛,但最终在其协议使用中被破解。eSTREAM竞赛和Daniel Bernstein的Salsa20/ChaCha20系列(2008年)定义了现代的、对软件友好的新一代密码,现在在互联网协议中受到青睐。
Key figures
- Claude Shannon
- Daniel J. Bernstein
- Ronald Rivest
- Adi Shamir
Related topics
Seminal works
- shannon1949
- katz2020
- menezes1996
Frequently asked questions
- 如果流密码密钥流被重复使用会发生什么?
- 用相同的密钥流加密的两个密文进行异或会抵消密钥流,留下两个明文的异或结果——这通常会揭示两条消息。这就是为什么每次加密都必须使用新的随机数,以便在固定密钥下密钥流永不重复。
- 流密码是否不如分组密码安全?
- 并非本质上如此。像ChaCha20这样的现代流密码被认为与AES一样安全,并且在软件中有时更快。不安全性源于误用(密钥流重复使用)或像RC4这样的弱旧设计,而不是流密码概念本身。