流密码

在密码学中，流密码（），又譯為串流加密、資料流加密，是一种对称加密算法，加密和解密双方使用相同伪随机加密数据流（pseudo-random stream）作为密钥，明文数据每次与密钥数据流顺次对应加密，得到密文数据流。实践中数据通常是一个位（bit）并用异或（xor）操作加密。

该算法解决了对称加密完善保密性（perfect secrecy）的实际操作困难。「完善保密性」由克劳德·香农于1949年提出。由于完善保密性要求密钥长度不短于明文长度，故而实际操作存在困难，改由较短数据流通过特定算法得到密钥流。

概述
伪随机密钥流（keystream）由一个随机的种子（seed）通过算法（称为：PRG，pseudo-random generator）得到，k作为种子，则G（k）作为实际使用的密钥进行加密解密工作。

为了保证流加密的安全性，PRG必须是不可预测的。弱算法包括glibc random()函数，線性同餘方法（linear congruential generator）等。

线性同余生成器

线性同余生成器中，令r[0]为seed，r[i] =（a * r[i-1] + b）mod p，其中a，b，p均为常数，则可轻易顺次推出整个密钥流，从而进行解密。

一次性密码本

流加密攻击

多次使用同一密码本
一种严重的错误即反复使用同一密码本对不同明文进行加密。攻击者可利用这种方式对密文进行解密。

用p表示明文，C表示密文，k表示种子，PRG表示密钥流生成算法，则：
 C1 = p1 xor PRG (k)
 C2 = p2 xor PRG (k)
攻击者监听到此段消息（包含两段相同密钥流加密的密文）后，即可利用：
 C1 xor C2得到p1 xor p2
足量的冗余（此处表示p1，p2）则可破解明文。

例子

WEP
一个失败的例子即WEP网络传输协议。
 该协议中服务器和客户端共享同一密钥流，该密钥流由一段24位的数据IV和一段密钥组成，表示为PRG（IV || k），通过异或操作对明文数据流加密。而IV最多组合情况为224个（约16M大小），因而攻击者可轻易暴力破解获取IV，或通过多次截取数据包（当数据流量足够大，密钥流必定多次重复）最终得到明文。
 另一个弱点在于，802.11网卡重启后自动设置IV为初始状态0。两种情况下都能表明WEP安全性并不尽如人意。

WEP已被WPA和WPA2取代。

硬盘加密
当硬盘使用流加密时，同样会使用同一密码本对不同文本进行加密，因而调换两个文本中少量信息，可以得到同样的冗余结果。避免这个问题的方案通常是避免使用流加密。

CSS

eStream

RC4

Salsa20/Chacha20

参考文献

参见 
 另一种加密思路：分组加密
 对称加密

L
算法