LFSR伪随机数生成器
LFSR英文名为Linear feedback shift register,中文翻译过来就是线性反馈移位寄存器,其伪随机数生成的特点已经包含在LFSR的名称中,也就是线性、反馈这两个词。- 由于
LFSR是非常容易使用硬件实现的,所以在以前很多流密码的密钥都是通过LFSR伪随机数生成算法来实现的,但是该伪随机数生成的算法在密码学体制中是比较不安全的,容易被预测到。 - 本篇文章写于
2025.6.16但是写的不怎么好,而在2025.9.11在图书馆随便看看,看到了这本书,从数学原理讲LSFR,于是决定重写博客,重新学习LSFR相关的。

LFSR初步认识
LFSR是指给定前一状态的输出,将该输出的线性函数在用作输入的移位寄存器。其中异或运算是最常见的单比特线性函数,对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位。也就是先进行异或运算再进行位移运算LFSR是计算机可以比较快的构造出一个拟完美序列。
LFSR的两种形式
- LFSR其实不止上面介绍的一种形式,其实还有另一种形式。
- 对于上面介绍的这种,是比较经典的,将其称为Fibonacci型,其实就是指定抽头影响输入位。

- 还有一种LFSR类型,该类型为Galois型,这种类型是输出位送给输入位后逐位异或,从而影响其他位,得到伪随机。

- 大致介绍一下
LFSR的工作流程:- 首先
FF0、FF1、FF2、...、FFn会被初始化bit位。 - 接着
CLK时钟,发出一个脉冲,这就会使得- 的值输出出去(其中输出其实还要画一个箭头,这边只有参与异或的箭头),的值会输出到两个地方,其中一个地方是输出给用户使用,另一个输出是参与生成下一个
FF0的运算。 - 接着的值就会被输出(移动)到这个寄存器中,的值就会被输出(移动)到这个寄存器中,以此类推,这就是移位
- 的值输出出去(其中输出其实还要画一个箭头,这边只有参与异或的箭头),的值会输出到两个地方,其中一个地方是输出给用户使用,另一个输出是参与生成下一个
- 输出的过程中,其实还会将输出的值输出给就会参与运算,运算的结果就是的值,这就是反馈。
- 首先
- 上面就是LFSR的大致过程,接下来展示一个真实的
LFSR电路图,由于LFSR的特性,其是比较容易在硬件中实现的,逻辑电路图并不复杂。其组成其实就是n个触发器,加上一些异或门再通过导线连接即可得到一个硬件的LFSR。

LFSR算法描述
-
我们先来给出一张图片,这张图片就简单介绍了
LFSR算法。这张图主要做了一下几个事情:-
对于初始的状态,经过一个线性函数的运算,其实这个线性函数就是异或操作,即,得到一个结果作为我们后续的输入的
bit值,所以这个函数运算结果只有0或者1,先暂时保存这个值 -
之后将经过位移后整体就变成,此时其实就是作为输出值了
-
最后我们再将运算得到的结果传递给,此时就构成了新的一组序列
-
之后像这样不断的线性位移计算,我们就能得到这些二进制序列,我们每线性位移
n次取一次序列,这样就得到了n位伪随机数 -
注意:不一定所有的位都参与线性运算,一般只选择几个位参与线性运算
-

有几个注意点:
- 将参与线性运算的位称为抽头,也就是LFSR状态下影响输入的位
- LFSR最右边的位为输出位,同时它始终也是抽头。
- 抽头是有顺序的异或,然后反馈到最左边的位。
- 最右边的位序列称为输出流,如上图所示其实我们的输出流其实是先输出出来,然后,最后才是
- 最大长度LFSR产生m序列具有种状态,寄存器全零状态的时候线性位移后还是全零(关于
m序列的概念这里不多说)
- 接下来我们使用Python实现一下简单的
32位LFSR伪随机数:
1 | def _int32(x): |
- 在实际过程中,一般会有一个
mask,这个mask的作用一般就是作为反馈系数进行异或操作,将初始序列和mask进行与操作这样 - 下面是带有
mask的LFSR简单实现代码:
1 | 1 |
LFSR数学表示
LFSR例子
-
先举一个例子看看:上周期为7的拟完美序列如下:
- ,观察这七个数之间的关系。
- 注意到有如下关系,发现前三位确定下来了,这个序列的关系就可以确定了:
- 这样我们可以通过递推公式写出来关系式:,这是一个三阶递推公式。
LFSR数学推导
- 从上面的LFSR例子可以看到,我们用递推关系很好表示出来这个序列,所以一开始我们就使用递推公式来描述LFSR。
- 对于LFSR来说,需要有周期,并且周期长,这样才是好的LFSR,所以接下来需要研究它的周期。在研究周期之前,除了递推这个数学描述之外,LFSR还可以用矩阵描述、特征多项式描述,接下来通过递推公式逐渐引入这两个描述。
- 考虑一个上的n阶线性常系数齐次递推关系式,可以用LFSR实现这个递推序列,接下来要研究它是否有周期,周期是否很大:
- 该式子记为①
- 设正整数是序列的一个周期,定义式子为:该式子记为②,满足②式的最小正整数称为的最小正周期。
- 等价条件:是的周期是最小正周期的正整数倍
- 目前来说只有一个递推式子研究周期还是比较困难的,所以我们引入如下方程组:
- 这样一来就可以写成向量矩阵的形式,描述如下,从而记称为递推关系①式的生成矩阵:
-
接下来对于初始值如果确定了,我们希望各个位数求出来,
- 对于上述式子,我们令那么我们就有:
- 令就有:
- 以此类推就有,这样不就有了个类似于通项公式的东西了么,我们将下面的式子记为④式
命题1:
是由阶递推关系①式产生的上序列的一个周期的充分必要条件是
推论1:
若,则是①式产生的任意序列的周期
-
证明:
- 由是序列的周期就可以得到:
- 利用递推关系①式,这个式子再由④式得到:
- 这就得到了是的属于特征值1的一个特征向量。
- 从而就有
-
回过来看式子①:
- 通过一系列的递推我们就可以得到如下的方程组:
- 写成向量的的形式,这一看这个结构不就是线性表出
- 再使用④式带入到上面的向量形式的方程就有如下,对于一切都成立,记下面的式子为⑤式
- 由一个矩阵乘上任意一向量都是零矩阵,那么这个矩阵一定是零矩阵,可以得到,记该式子为⑥式:
- 令,此时,只要递推关系式①给了,我们就能确定这个多项式。而多项式和递推关系可以互推,这样的多项式我们就称为递推关系式①的特征多项式。从而有命题⑥
命题2
设是阶递推关系式①的特征多项式,A是①的生成矩阵则
定理1
设是阶递推关系式①的特征多项式,A是①的生成矩阵,若,则是阶递推关系①产生的任意序列的周期。
- 证明:
- 存在使得,用生成矩阵带入得到
- 可以得到:
- 由推论1可以得到是阶递推关系①产生的任意序列的周期。
定理2
设是阶递推关系式①的特征多项式,A是①的生成矩阵,设在上不可约,若是阶递推关系①产生的一个非零序列的一个周期,则
- 证明:使用反证法证明
- 假设,则
- 从而存在,使得,这个式子就是裴蜀定理在多项式中的推广
- 用生成矩阵带入,就有
- 由命题2可以得到,
- 从而得到,与是非零序列矛盾。
- 我们还希望这个阶递公式的生成的任意序列都有周期,接下来我们就要从特征多项式入手:
- 由⑥式可以得到:记为式子⑦
- 从而:
- 说明的任意非负整数次幂都可以属于下面这个集合:
- 而这个集合中元素个数有个,但是有些的次幂可以由多个多项式生成相同的结果,所以
- 从而中的非零矩阵至多有个,下述个矩阵,,由于生成矩阵,因此可逆矩阵。
- 从而上述个矩阵都是非零矩阵,于是存在一对满足:,从而就有,即
- 由推论1可以得到,是阶递推关系①产生的任意序列的周期
- 从而任何一个①产生的任意序列的最小正周期,于是得到定理3
定理3
阶递推关系①产生的任一序列都有周期,并且最小正周期不超过
- 我们希望周期越大越好,所以引入了如下的定义
定义1
设是上阶常系数线性齐次递推关系产生的序列,如果的最小正周期达到,那么称是上的一个
m序列。
- 最后我们还要分析,这个线性递推关系满足的什么条件才会是
m序列,于是推导出了定理4,接下来先分析一下:- 由定理1可以得到若则是的一个周期。
- 的最小正周期
- 那么我们希望:对于,且,不是的周期。若在上不可约,且则根据定理2得到,不是的周期。
定理4
设是阶递推关系①的特征多项式,如果满足:
- 在上不可约
- 对于,且,都有
那么①产生的任一非零序列是
m序列定义2
上的一个次多项式如果满足定理4中的三个条件,那么称是上的一个本原多项式(这个本原多项式与有理数上的本原多项式是不同的概念)
注:从定义2出发,我们可以重新这样叙述定理4,如果阶递推关系①的多项式是上的本原多项式,那么①产生的任何序列都是
m序列。定理5
上的
m序列都是拟完美序列。
总结
命题1:
是由阶递推关系①式产生的上序列的一个周期的充分必要条件是
推论1:
若,则是①式产生的任意序列的周期
命题2
设是阶递推关系式①的特征多项式,A是①的生成矩阵则
定理1
设是阶递推关系式①的特征多项式,A是①的生成矩阵,若,则是阶递推关系①产生的任意序列的周期。
定理2
设是阶递推关系式①的特征多项式,A是①的生成矩阵,设在上不可约,若是阶递推关系①产生的一个非零序列的一个周期,则
定理3
阶递推关系①产生的任一序列都有周期,并且最小正周期不超过
定义1
设是上阶常系数线性齐次递推关系产生的序列,如果的最小正周期达到,那么称是上的一个
m序列。定理4
设是阶递推关系①的特征多项式,如果满足:
- 在上不可约
- 对于,且,都有
那么①产生的任一非零序列是
m序列定义2
上的一个次多项式如果满足定理4中的三个条件,那么称是上的一个本原多项式(这个本原多项式与有理数上的本原多项式是不同的概念)
注:从定义2出发,我们可以重新这样叙述定理4,如果阶递推关系①的多项式是上的本原多项式,那么①产生的任何序列都是
m序列。定理5
上的
m序列都是拟完美序列。
LFSR相关题目
- 大概了解完
LFSR的代码实现以及数学表示了,那么就可以来牛刀小试一下一些题目。 - 题目难度依次递增,比较适合
LFSR入门。
LFSR 题目1 求反馈系数
- 题目来源:
简单的LFSR,题目地址:攻防世界 - 题目附件如下:
1 | from secret import secret |
LFSR 题目2 求初始状态
- 题目来源:
[CISCN2018]oldstreamgame,题目地址:CISCN 2018 oldstreamgame - NSSCTF - 题目附件如下:
1 | flag = "flag{xxxxxxxxxxxxxxxx}" |
key文件如下:
1 |
LFSR破解
- 对于
LFSR的破解需要用上一个经典的算法也就是Berlekamp-Massey算法。这里建议先去学习一下Berlekamp-Massey算法,先从它的数学抽象出来的问题入手,在破解LFSR的时候会更有助于理解。Berlekamp–Massey 算法 - OI Wiki - 对于
Berlekamp-Massey算法,就不在这里详细介绍,这里只介绍Berlekamp-Massey算法在破解LFSR中的应用。

