流加密

维基百科,自由的百科全书
跳转至: 导航搜索

密码学中,流加密算法是对称加密算法的一种,加密和解密双方使用相同伪随机加密数据流(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]seedr[i] = (a * r[i-1] + b) mod p,其中a,b,p均为常数,则可轻易顺次推出整个密钥流,从而进行解密。

一次性密码本[编辑]

流加密攻击[编辑]

多次使用同一密码本[编辑]

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

用m表示明文,c表示密文,k表示种子,PRG表示密钥流生成算法,则:

  • C1 = m1 xor PRG(k)
  • C2 = m2 xor PRG(k)

攻击者监听到此段消息(包含两段相同密钥流加密的密文)后,即可利用:

  • C1 xor C2 得到 m1 xor m2

足量的冗余(此处表示m1,m2)则可破解明文。

例子[编辑]

WEP[编辑]

一个失败的例子即WEP网络传输协议。

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

更好的解决方案是针对不同段的信息使用伪随机密钥(不同 k 值),例如TLS所为。

硬盘加密[编辑]

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

CSS[编辑]

eStream[编辑]

参见en:Salsa20

参考文献[编辑]

参见[编辑]