流密码 Stream Cipher

跟块密码一样,本文的主角流密码,Stream Cipher ,也是一种对称加密方法,加密和解密用的是同一个密钥。Cipher 翻译成密码不是特别精确,精确的来说,一个 Cipher 是指一套加密解密算法。

基本原理

先来宏观的介绍一下流密码的工作原理,来避开细节,形成一个大致的概念。

块密码的思路是把信息分成多个小块去逐一加密。流密码把信息看成二进制数据流,基本工作原理是

把信息中的每一位跟密钥流的每一位进行运算来获得密文。

下面来详细解释一下这句话。

首先,流密码也有一个密钥,常见的是128位,但是加密和解密的时候却不是直接使用密钥,而是使用密钥流,术语叫 keystream 。从密钥获得密钥流的过程,就是一个伪随机数生成过程。把真随机数的密钥做种子,去生成伪随机数作为密钥流。加密时候需要用到的密钥流长度要和信息流的长度相等,密钥流中的每一位和相同位置的信息流的一位,进行异或运算,就得到的密文。

流密码既可以加密固定大小的数据,例如一个硬盘上的文件,也可以去加密数据流,例如电话语音。而用块密码去加密长度未知的数据流就很不合理。例如,如果块密码指定的块大小是128比特,而网络发送过来的是数据流,流数据一下子只传递了32比特过来,那么加密的时候,这个块就不得不出现很多填充数据了。而使用流密码加密数据流就没有这个问题。

解密过程,把密文和密钥流传递给解密算法即可。

这就是流密码的基本工作原理了。

技术细节

使用流密码还有一些要注意的技术细节。

理想情况下,我们认为密钥流的长度是无限的,于是可以加密的信息流的长度就任意了的。但是,因为伪随机数是有周期的,超出周期长度后之后,密钥流就会出现可识别的规律,继续使用就不安全了。所以加密时,信息的长度不能大于伪随机数的周期。实际中的算法,周期都是足够长的,对加密过程不会产生实际影响。

另外,生成密钥流的方式主要由两种,一种是跟信息本身完全无关,一种是跟信息加密后得到的密文有相关性的,具体细节可以参考维基百科的介绍。

常见的使用流密码的加密协议有 RC4 ,Salsa20 ,和 ChaCha 等。

和 One Time Pad 的差别

如果你听说过一次性密码本 One Time Pad 的话,就会觉得流密码的思路跟 One Time Pad 是很类似的。没错,但是二者的区别也是比较明显的。

因为流密码的密钥流本身不是真随机数,而是伪随机数。而 One Time Pad 是真随机数,而且使用一次即废弃,所以拥有最高的安全性。流密码的安全性肯定要低一些。

但是,流密码是有很高的实用性的。One Time Pad 本身在互联网上是没有实用性的,因为秘钥至少要跟信息一样长,不能在互联网上共享。流密码使用的秘钥一般是很短的,常见的是128位,这这样的秘钥可以通过秘钥交换算法来在互联网上进行共享。

这就是二者的差别。

总结

最后总结一下。流密码的原理是用伪随机数做密码流去加密信息的方法,信息被看做是一个二进制流。流密码的工作原理类似一次性密码本,只可以密码流不是真随机数,所以安全性比一次性密码本低。

参考: