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

LFSR算法描述

有几个注意点:
- 将参与线性运算f(a1,a2,...,an)的位称为抽头,也就是LFSR状态下影响输入的位
- LFSR最右边的位为输出位,同时它始终也是抽头。
- 抽头是有顺序的异或,然后反馈到最左边的位。
- 最右边的位序列称为输出流,如上图所示其实我们的输出流其实是a1先输出出来,然后a2,最后才是an
- 最大长度LFSR产生m序列具有2m−1种状态,寄存器全零状态的时候线性位移后还是全零(关于
m序列的概念这里不多说)
- 接下来我们使用Python实现一下简单的
32位LFSR伪随机数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| def _int32(x): return x & 0xFFFFFFFF
class LFSR: def __init__(self,seed): self.seed = _int32(seed)
def xor(self): x = bin(self.seed)[2:].zfill(32) tap = [25,15,10,0] tmp = 0 for i in tap: tmp ^=int(x[i],2) return tmp
def lshift(self,an,reg): return _int32((an<<31)|(reg>>1))
def LSF(self): for i in range(32): an = self.xor() self.seed=self.lshift(an,self.seed) return self.seed
LFSR = LFSR(0xF75a15663499) for i in range(10): print(LFSR.LSF())
|
LFSR数学表示
LFSR例子
-
先举一个例子看看:Z2上周期为7的拟完美序列如下:
- α=1001011...=a0a1a2a3a4a5a6....,观察a0、....、a7这七个数之间的关系。
- 注意到有如下关系,发现前三位a0、a1、a2确定下来了,这个序列的关系就可以确定了:
a3=a1+a0a4=a2+a1a5=a3+a2a6=a4+a3a7=a0=a5+a4
- 这样我们可以通过递推公式写出来关系式:ak+3=ak+1+ak,(k=0,1,2...),这是一个三阶递推公式。
LFSR数学推导
- 从上面的LFSR例子可以看到,我们用递推关系很好表示出来这个序列,所以一开始我们就使用递推公式来描述LFSR。
- 对于LFSR来说,需要有周期,并且周期长,这样才是好的LFSR,所以接下来需要研究它的周期。在研究周期之前,除了递推这个数学描述之外,LFSR还可以用矩阵描述、特征多项式描述,接下来通过递推公式逐渐引入这两个描述。
- 考虑一个Z2上的n阶线性常系数齐次递推关系式,可以用LFSR实现这个递推序列,接下来要研究它是否有周期,周期是否很大:
- ak+n=c1ak+n−1+c2ak+n−2+...+cn−1ak+1+cnak,(k=0,1,2,...,cn=0)该式子记为①
- 设正整数d是序列α=a0a1a2...的一个周期,定义式子为:ai+d=ai该式子记为②,满足②式的最小正整数l称为α的最小正周期。
- 等价条件:u是α的周期⇔u是最小正周期l的正整数倍
- 目前来说只有一个递推式子研究周期还是比较困难的,所以我们引入如下方程组:
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧ak+nak+n−1ak+n−2⋮ak+1=c1ak+n−1+=ak+n−1==c2ak+n−2+ak+n−2...+cn−1ak+1+ak+1cnak
- 这样一来就可以写成向量矩阵的形式,描述如下,从而记A=⎣⎢⎢⎢⎢⎢⎢⎡c110⋮0c201⋮0………⋱…cn−100⋮1cn00⋮0⎦⎥⎥⎥⎥⎥⎥⎤称为递推关系①式的生成矩阵:
⎝⎜⎜⎜⎜⎜⎜⎛ak+nak+n−1ak+n−2⋮ak+1⎠⎟⎟⎟⎟⎟⎟⎞=⎣⎢⎢⎢⎢⎢⎢⎡c110⋮0c201⋮0………⋱…cn−100⋮1cn00⋮0⎦⎥⎥⎥⎥⎥⎥⎤⎝⎜⎜⎜⎜⎜⎜⎛ak+n−1ak+n−2ak+n−3⋮ak⎠⎟⎟⎟⎟⎟⎟⎞
-
接下来对于初始值a0,a1,...,an−1如果确定了,我们希望各个位数求出来,
- 对于上述式子,我们令k=0那么我们就有:
⎝⎜⎜⎜⎜⎜⎜⎛anan−1an−2⋮a1⎠⎟⎟⎟⎟⎟⎟⎞=A⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞
⎝⎜⎜⎜⎜⎜⎜⎛an+1anan−1⋮a2⎠⎟⎟⎟⎟⎟⎟⎞=A⎝⎜⎜⎜⎜⎜⎜⎛anan−1an−2⋮a1⎠⎟⎟⎟⎟⎟⎟⎞=A2⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞
- 以此类推就有,这样不就有了个类似于通项公式的东西了么,我们将下面的式子记为④式
⎝⎜⎜⎜⎜⎜⎜⎛ak+n−1ak+n−2ak+n−3⋮ak⎠⎟⎟⎟⎟⎟⎟⎞=Ak⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞
命题1:
d是由n阶递推关系①式产生的Z2上序列α=a0a1a2...an−1...的一个周期的充分必要条件是Ad⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞
推论1:
若Ad−I=0,则d是①式产生的任意序列的周期
-
证明:
- 由d是序列的周期就可以得到:ai+d=ai,i=0,1,2...
- 利用递推关系①式⇒⎝⎜⎜⎜⎜⎜⎜⎛ad+n−1ad+n−2ad+n−3⋮ad⎠⎟⎟⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞,这个式子再由④式得到:Ad⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞
- 这就得到了⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞是Ad的属于特征值1的一个特征向量。
- 从而就有(Ad−I)⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞=0
-
回过来看式子①:
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧an+n−1⋮an+1an=c1an+n−2+...+cn−1an+cnan−1=c1an+...+cn−1a2+cna1=c1an−1+...+cn−1a1+cna0
⎝⎜⎜⎜⎜⎜⎜⎛an+n−1an+n−2an+n−3⋮an⎠⎟⎟⎟⎟⎟⎟⎞=c1⎝⎜⎜⎜⎜⎜⎜⎛an+n−2an+n−3an+n−3⋮an−1⎠⎟⎟⎟⎟⎟⎟⎞+...+cn−1⎝⎜⎜⎜⎜⎜⎜⎛anan−1an−2⋮a1⎠⎟⎟⎟⎟⎟⎟⎞+cn⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞
- 再使用④式⎝⎜⎜⎜⎜⎜⎜⎛ak+n−1ak+n−2ak+n−3⋮ak⎠⎟⎟⎟⎟⎟⎟⎞=Ak⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞带入到上面的向量形式的方程就有如下,对于一切a0,a1,...,an−1∈Z2都成立,记下面的式子为⑤式
(An−c1An−1−...−cn−1A1+cnI)⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎜⎜⎛000⋮0⎠⎟⎟⎟⎟⎟⎟⎞
- 由一个矩阵乘上任意一向量都是零矩阵,那么这个矩阵一定是零矩阵,可以得到,记该式子为⑥式:
An−c1An−1−...−cn−1A1+cnI=0
- 令f(x)=xn−c1xn−1−...−cn−1x−cn∈Z2[x],此时f(A)=0,只要递推关系式①给了,我们就能确定这个多项式。而多项式和递推关系可以互推,这样的多项式我们就称为递推关系式①的特征多项式。从而有命题⑥
命题2
设f(x)是n阶递推关系式①的特征多项式,A是①的生成矩阵则f(A)=An−c1An−1−...−Cn−1A−cnI=0
定理1
设f(x)是n阶递推关系式①的特征多项式,A是①的生成矩阵,若f(x)∣xd−1,则d是n阶递推关系①产生的任意序列的周期。
- 证明:
- 存在h(x)∈Z2[x]使得xd−1=h(x)f(x),用生成矩阵A带入x得到
- 可以得到:Ad−I=h(A)f(A)=0
- 由推论1可以得到d是n阶递推关系①产生的任意序列的周期。
定理2
设f(x)是n阶递推关系式①的特征多项式,A是①的生成矩阵,设f(x)在Z2上不可约,若d是n阶递推关系①产生的一个非零序列α=a0a1...an−1an...的一个周期,则f(x)∣xd−1
- 证明:使用反证法证明
- 假设f(x)∣xd−1,则(f(x),xd−1)=1
- 从而存在u(x),v(x)∈Z2[x],使得u(x)f(x)+v(x)(xd−1)=1,这个式子就是裴蜀定理在多项式中的推广
- x用生成矩阵A带入,就有u(A)f(A)+v(A)(Ad−I)=I
- 由命题2可以得到v(A)(Ad−I)=I,v(A)(Ad−I)⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞
- 从而得到⎝⎜⎜⎜⎜⎜⎜⎛000⋮0⎠⎟⎟⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞,与α是非零序列矛盾。
- 我们还希望这个n阶递公式的生成的任意序列都有周期,接下来我们就要从特征多项式入手:
- 由⑥式An−c1An−1−...−cn−1A−cnI=0可以得到:An=c1An−1+...+cn−1A+cnI记为式子⑦
- 从而:An+1=c1An+c2An−1+...+cn−1A2+CnA=c1(c1An−1+...+cn−1A+cnI)+...+cnA
- 说明A的任意非负整数次幂都可以属于下面这个集合:Ω={b1An−1+b2An−2+...+bn−1A+bnI∣bi∈Z2,i=1,2,....}
- 而Ω这个集合中元素个数有2n个,但是有些A的次幂可以由多个多项式生成相同的结果,所以∣Ω∣≤2n
- 从而Ω中的非零矩阵至多有2n−1个,下述2n个矩阵,I,A,A2,...,A2n−1,由于生成矩阵∣A∣=cn=0,因此A可逆矩阵。
- 从而上述2n个矩阵都是非零矩阵,于是存在一对i,j满足:Ai=Aj,0≤i<j≤2n−1,从而就有I=Aj−i,即Aj−i−I=0
- 由推论1可以得到,j−i是n阶递推关系①产生的任意序列的周期
- 从而任何一个①产生的任意序列的最小正周期l≤j−i≤2n−1,于是得到定理3
定理3
n阶递推关系①产生的任一序列都有周期,并且最小正周期不超过2n−1
定义1
设α是Z2上n阶常系数线性齐次递推关系产生的序列,如果α的最小正周期达到2n−1,那么称α是Z2上的一个m序列。
- 最后我们还要分析,这个线性递推关系满足的什么条件才会是
m序列,于是推导出了定理4,接下来先分析一下:
- 由定理1可以得到若f(x)∣x2n−1−T则2n−1是α的一个周期。
- α的最小正周期l∣2n−1
- 那么我们希望:对于d∣2n−1,且0<d<2n−1,d不是α的周期。若f(x)在Z2上不可约,且f(x)∣xd−1则根据定理2得到,d不是α的周期。
定理4
设f(x)是n阶递推关系①的特征多项式,如果满足:
- f(x)在Z2上不可约
- f(x)∣x2n−1−T
- 对于d∣2n−1,且0<d<2n−1,都有f(x)∣xd−1
那么①产生的任一非零序列α是m序列
定义2
Z2上的一个n次多项式f(x)如果满足定理4中的三个条件,那么称f(x)是Z2上的一个本原多项式(这个本原多项式与有理数上的本原多项式是不同的概念)
注:从定义2出发,我们可以重新这样叙述定理4,如果n阶递推关系①的多项式是Z2上的本原多项式,那么①产生的任何序列都是m序列。
定理5
Z2上的m序列都是拟完美序列。
总结
命题1:
d是由n阶递推关系①式产生的Z2上序列α=a0a1a2...an−1...的一个周期的充分必要条件是Ad⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎜⎜⎛an−1an−2an−3⋮a0⎠⎟⎟⎟⎟⎟⎟⎞
推论1:
若Ad−I=0,则d是①式产生的任意序列的周期
命题2
设f(x)是n阶递推关系式①的特征多项式,A是①的生成矩阵则f(A)=An−c1An−1−...−Cn−1A−cnI=0
定理1
设f(x)是n阶递推关系式①的特征多项式,A是①的生成矩阵,若f(x)∣xd−1,则d是n阶递推关系①产生的任意序列的周期。
定理2
设f(x)是n阶递推关系式①的特征多项式,A是①的生成矩阵,设f(x)在Z2上不可约,若d是n阶递推关系①产生的一个非零序列α=a0a1...an−1an...的一个周期,则f(x)∣xd−1
定理3
n阶递推关系①产生的任一序列都有周期,并且最小正周期不超过2n−1
定义1
设α是Z2上n阶常系数线性齐次递推关系产生的序列,如果α的最小正周期达到2n−1,那么称α是Z2上的一个m序列。
定理4
设f(x)是n阶递推关系①的特征多项式,如果满足:
- f(x)在Z2上不可约
- f(x)∣x2n−1−T
- 对于d∣2n−1,且0<d<2n−1,都有f(x)∣xd−1
那么①产生的任一非零序列α是m序列
定义2
Z2上的一个n次多项式f(x)如果满足定理4中的三个条件,那么称f(x)是Z2上的一个本原多项式(这个本原多项式与有理数上的本原多项式是不同的概念)
注:从定义2出发,我们可以重新这样叙述定理4,如果n阶递推关系①的多项式是Z2上的本原多项式,那么①产生的任何序列都是m序列。
定理5
Z2上的m序列都是拟完美序列。
LFSR破解
- 对于
LFSR的破解需要用上一个经典的算法也就是 Berlekamp-Massey算法。这里建议先去学习一下Berlekamp-Massey算法,先从它的数学抽象出来的问题入手,在破解LFSR的时候会更有助于理解。Berlekamp–Massey 算法 - OI Wiki
- 对于
Berlekamp-Massey算法,就不在这里详细介绍,这里只介绍Berlekamp-Massey算法在破解LFSR中的应用。
LFSR深入理解
- 接下来要介绍一些相关的定义和定理作为学习
Berlekamp-Massey算法的前置知识。
知识点1
假设一个LFSR长度为L,LFSR的最初状态其实就等于LFSR所产生的序列的前L位输出。如下图所示,序列a0、a1、...、an其实就是长度为N的LFSR的初始状态。
从第L+1位开始的所有输出,完全由LFSR的反馈结构和初始状态决定,说明了一旦LFSR的反馈结构确定并且设置了初始状态,那么输出序列就唯一确定

知识点2
当我们要用阶(其实是LFFR的长度)为L的LFSR,来生成长度为N的序列其实会出现以下两种情况:
- 当L>=N时,该LFSR一定能生成长度为N的序列,但是并不是最短的一个LFSR
- 当L<N时,如果该LFSR能生成长度为$$N$$的序列,那么从第L+1位开始就必须满足递推式sn=∑i=1Lcisn−i mod 2
定理1:
如果某个长度为L的LFSR能生成长度为N的序列,s0、s1、...、sN−1,但是无法生成第sN项,那么任何一个可以完整生成序列s0、s1、...、sn的LFSR,其长度必须满足L′≥N+1−L,这个其实是B-M算法的下界定理
引理:
如果一个长度为n的LFSR记为Ln(s),生成了s0,s1,...,sN−1但是该LFSR并不能生成s0,s1,...,sn−1,sn,那么就有Ln+1(s)≥max[LN(s),N+1−LN(s)]
定理2:
如果一个长度位N的LFSR