密码学之流密码(Stream Cipher)
前言
Stream cipher由两个部分组成,一个是内部的state,一个是key。
一般而言,Stream cipher通过key和initialization vector进行初始化(初始化只进行一次)。然后每一个timestep ,基于我们的key和state,stream cipher将输出一个单位的密码。重复执行的话就能连续地输出密码。

一、Linear Feedback Shift Registers (LFSR)
LFSR有两个部分,一个是内部的state,由个所谓的register组成——
,每一个register只储存1个bit的信息(要么是0要么是1,另外注意下标的顺序)。另外一个是,长度同样为
的feedback coefficients——
.
在初始化阶段,我们让state 等同于我们的key
,设置好我们的feedback
。接下来,每一个timestep
,我们输出最右侧的那个bit
,然后将state里面的所有bit朝右位移1个bit:
,最后,最左侧的那个bit
由我们的state和feedback决定:

当我们的LSFR遍历所有 state,并且没有遇到过重复时,这个时候我们称我们的LFSR具有maximum length. 而LFSR具有maximum length的条件是:
为primitive.
LFSR并非一个安全的cipher,因为我们可以从前个输出的bit中知道我们的初始state(也就是我们的key),然后从前
个输出的bit中知道我们的feedback coefficient
.

二、RC4
RC4以8-bit的byte为单位,每次输出一个byte的密码。我们使用一个长度为256-byte的state,以及一个任意长度的key:

下面是自己用Python写的一段代码(未验证正确性,只供参考):
RC4也并不是一个安全的cipher,如果我们的初始state的第3个byte为0,第2个byte不为2,那么我们输出的密码流的第2个byte为0,这个情况出现的概率为.
RC4还有其他的一些统计学上的bais,导致攻击者可以利用这些特性来攻击基于RC4的密码.

后记
Stream cipher(看上去)其实还是挺简单的。
参考资料:
Jonathan Katz; Yehuda Lindell - Introduction to Modern Cryptography
使用工具:Drawio

THE END.