应用密码学课上学习了 BM 算法,林老师说期末必考。做课后题时,让求解一个20长序列的 LFSR,本人算了两大页纸,还算错了两遍 (╬ ̄皿 ̄)

这里仔细研究下,谈谈我自己对它的理解。

文章目录

  • LFSR
  • Berlekamp-Massey 算法
    • 多项式乘积
    • 思路
    • 多项式选取
    • BM 算法
    • 例子

LFSR

线性反馈移位寄存器(Linear-feedback shift register)可用于产生随机序列。有限域 F\mathbb FF 上的 nnn 级(包含nnn长的状态) LFSR 的结构如下:

线性反馈移位寄存器(LFSR)和 Berlekamp-Massey 算法-编程知识网

其中 ci∈Fc_i \in \mathbb FciF。如果cn=0c_n = 0cn=0,那么是退化的 LFSR。反馈逻辑为线性递推关系:
ak=∑i+1nciak−ia_k = \sum_{i+1}^n c_i a_{k-i} ak=i+1nciaki

特征多项式为:
f(x)=xn+∑i=1ncixn−if(x) = x^n + \sum_{i=1}^n c_i x^{n-i} f(x)=xn+i=1ncixni

联接多项式为:
f~(x)=1+∑i=1ncixi\tilde f(x) = 1+\sum_{i=1}^n c_i x^i f~(x)=1+i=1ncixi

易知,deg⁡f=n\deg f = ndegf=ndeg⁡f~≤n\deg \tilde f \le ndegf~n

G(f)G(f)G(f) 表示由特征多项式 fff 可以生成的所有序列的集合,可以视为 F\mathbb FF上的nnn 维向量空间。若 a\textbf aaF2F_2F2 上的周期序列,那么当仅当存在一个多项式 fff极小多项式),使得 a∈G(h)\textbf{a} \in G(h)aG(h) ⟺\iff h∈(f)h \in (f)h(f),这里 (f)⊆F2[x](f) \subseteq F_2[x](f)F2[x] 是个主理想。即,fff 是可以生成 a\textbf{a}a 的次数最低的特征多项式,对应的 LFSR 的级数 deg⁡f\deg fdegf 叫做序列 a\textbf aa线性复杂度。同时,周期 p(a)=p(f)p(\textbf{a}) = p(f)p(a)=p(f),这里 p(f)p(f)p(f) 是满足 xe≡1modfx^e \equiv 1 \mod fxe1modf 的最小整数(多项式的,order)。

Berlekamp-Massey 算法

如果给定一个长度为 NNN 的序列片段 a=a1a2⋯aN∈FN\textbf{a} = a_1a_2 \cdots a_N \in \mathbb F^Na=a1a2aNFN,已知它是由线性递归关系生成的。如何计算出生成它的最短的 LFSR ?

我们使用联接多项式 fff 以及阶数 lll 来描述 LFSR。我们将 (fN,lN)(f_N,l_N)(fN,lN) 称作 a\textbf{a}a线性综合解,如果 fNf_NfN 对应的 lNl_NlN 级 LFSR 是可以生成 a\textbf aa 的阶数最小的 LFSR。

多项式乘积

给定序列 a=a1a2⋯an\textbf{a} = a_1a_2 \cdots a_na=a1a2an,我们定义下述多项式
A(x)=1+a1x+a2x2+⋯anxn∈FNA(x) = 1 + a_1x + a_2x^2 + \cdots a_nx^n \in \mathbb F^N A(x)=1+a1x+a2x2+anxnFN

假设一个 lnl_nln级的 LFSR 可以生成这个序列,对应的联接多项式为
f(x)=clnxln+⋯+c1x+1∈F[x]f(x) = c_{l_n}x^{l_n} + \cdots + c_1x + 1 \in \mathbb F[x] f(x)=clnxln++c1x+1F[x]

那么对于 ln+1≤k≤nl_n+1 \le k \le nln+1kn,要满足约束
ak+∑i=1lnciak−i=0∈Fa_k + \sum_{i=1}^{l_n} c_i a_{k-i} = 0 \in \mathbb F ak+i=1lnciaki=0F

注意到 ak+∑i=1lnciak−ia_k + \sum_{i=1}^{l_n} c_i a_{k-i}ak+i=1lnciaki 就是 f⋅Af \cdot AfA 的单项 xkx^kxk系数,也就是说:
f(x)⋅A(x)=tailn(x)modxn+1f(x) \cdot A(x) = tail_n(x) \mod x^{n+1} f(x)A(x)=tailn(x)modxn+1

这里 tailn(x)tail_n(x)tailn(x) 是多项式截尾,明显满足 deg⁡(tailn)≤ln\deg(tail_n) \le l_ndeg(tailn)ln,这对应到 f(x)f(x)f(x) 无法约束的可生成 a[1:n]\textbf{a}[1:n]a[1:n] 所需的初始状态 a[1:ln]\textbf{a}[1:l_n]a[1:ln](是自由的,无法被 LFSR 约束)

所以,我们想要找出最短的 LFSR,只需找出满足上述约束的联接多项式 f(x)f(x)f(x)。给定序列 a\textbf{a}a,BM 算法的思路是:迭代地构造一系列 fnf_nfn,使得 (fn,ln)(f_n,l_n)(fn,ln) 是可以生成 a[1:n]\textbf{a}[1:n]a[1:n] 的线性综合解,当 n=Nn = Nn=N 时结束迭代。

思路

假设我们获得了 (fn,ln)(f_n,l_n)(fn,ln),满足
fn(x)⋅A(x)=tailn(x)modxn+1f_n(x) \cdot A(x) = tail_n(x) \mod x^{n+1} fn(x)A(x)=tailn(x)modxn+1

也就是 fnf_nfn 可以约束 a[1:n]\textbf{a}[1:n]a[1:n]

如果
fn(x)⋅A(x)=tailn(x)modxn+2f_{n}(x) \cdot A(x) = tail_n(x) \mod x^{n+2} fn(x)A(x)=tailn(x)modxn+2

那么 fnf_nfn 依然可以约束 a[1:n+1]\textbf{a}[1:n+1]a[1:n+1],从而 (fn+1,ln+1):=(fn,ln)(f_{n+1},l_{n+1}) := (f_n,l_n)(fn+1,ln+1):=(fn,ln)

如果
fn(x)⋅A(x)=tailn(x)+dn+1xn+1modxn+2f_{n}(x) \cdot A(x) = tail_n(x) + d_{n+1}x^{n+1} \mod x^{n+2} fn(x)A(x)=tailn(x)+dn+1xn+1modxn+2

其中 dn+1≠0∈Fd_{n+1} \neq 0 \in \mathbb Fdn+1=0F,那么说明 fnf_nfn 无法约束 a[1:n+1]\textbf{a}[1:n+1]a[1:n+1] 了,我们需要对它做调整

我们寻找一个 (fm,lm)(f_m,l_m)(fm,lm),它无法约束 a[1:m+1]\textbf{a}[1:m+1]a[1:m+1],即
fm(x)⋅A(x)=tailm(x)+dm+1xm+1modxm+2f_{m}(x) \cdot A(x) = tail_m(x) + d_{m+1}x^{m+1} \mod x^{m+2} fm(x)A(x)=tailm(x)+dm+1xm+1modxm+2

那么,我们令
fn+1(x)=fn(x)−dn+1dm+1−1xm−nfm(x)f_{n+1}(x) = f_n(x) – d_{n+1}d_{m+1}^{-1} x^{m-n} f_m(x) fn+1(x)=fn(x)dn+1dm+11xmnfm(x)

画的草图:

线性反馈移位寄存器(LFSR)和 Berlekamp-Massey 算法-编程知识网

可以验证:
fn+1(x)⋅A(x)=fn(x)⋅A(x)−dn+1dm+1−1xn−mfm(x)⋅A(x)=tailn(x)+dn+1xn+1−dn+1dm+1−1dm+1xm+1xn−m−dn+1dm+1−1xn−mtailm(x)=tailn(x)−dn+1dm+1−1xn−mtailm(x)modxn+2\begin{aligned} f_{n+1}(x) \cdot A(x) &= f_n(x) \cdot A(x) – d_{n+1}d_{m+1}^{-1} x^{n-m} f_m(x) \cdot A(x)\\ &= tail_n(x) + d_{n+1}x^{n+1} – d_{n+1}d_{m+1}^{-1}d_{m+1}x^{m+1}x^{n-m} – d_{n+1}d_{m+1}^{-1}x^{n-m}tail_m(x)\\ &= tail_n(x) – d_{n+1}d_{m+1}^{-1}x^{n-m}tail_m(x) \mod x^{n+2} \end{aligned} fn+1(x)A(x)=fn(x)A(x)dn+1dm+11xnmfm(x)A(x)=tailn(x)+dn+1xn+1dn+1dm+11dm+1xm+1xnmdn+1dm+11xnmtailm(x)=tailn(x)dn+1dm+11xnmtailm(x)modxn+2

对应的 tailn+1=tailn(x)−dn+1dm+1−1xn−mtailm(x)tail_{n+1} = tail_n(x) – d_{n+1}d_{m+1}^{-1}x^{n-m}tail_m(x)tailn+1=tailn(x)dn+1dm+11xnmtailm(x),其度数为 deg⁡(tailn+1)≤max⁡(ln,n−m+lm)\deg(tail_{n+1}) \le \max(l_n,\, n-m+l_m)deg(tailn+1)max(ln,nm+lm)

多项式选取

给定序列 a=a1a2⋯aN∈FN\textbf{a} = a_1a_2 \cdots a_N \in \mathbb F^Na=a1a2aNFN,我们首先找到第一个非零元素 an0≠0a_{n_0} \neq 0an0=0

  • 设置 f0=1f_0=1f0=1,对应的 l0=0l_0=0l0=0 级的 LFSR 可以生成空序列

  • 对于 1≤i<n01 \le i < n_01i<n0,明显 a[1:i]=0i\textbf{a}[1:i] = 0^ia[1:i]=0i零序列,从而可以由 fi(x)=1f_i(x)=1fi(x)=1li=0l_i=0li=0 级的 LFSR 来生成。

  • 对于 i=n0≥1i=n_0 \ge 1i=n01,序列 a[1:n0]=0n0−1∥1\textbf{a}[1:n_0] = 0^{n_0-1}\|1a[1:n0]=0n01∥1 可以由任意的 ln0=n0l_{n_0}=n_0ln0=n0 级的 LFSR 生成,方便起见选取:
    fn0=1−an0xn0f_{n_0} = 1 – a_{n_0} x^{n_0} fn0=1an0xn0

容易看出,这些 (fi,li)(f_i,l_i)(fi,li) 都是最短的 LFSR。易知,ln0=max⁡(ln0−1,n0−ln0−1)l_{n_0} = \max(l_{n_0-1},n_0-l_{n_0-1})ln0=max(ln01,n0ln01),因为 ln0−1=0l_{n_0-1}=0ln01=0

后续将证明,每一次对 LFSR 的修正,从 (fm,lm)(f_m,l_m)(fm,lm)(fm+1,lm+1)(f_{m+1},l_{m+1})(fm+1,lm+1),都会满足
lm+1=max⁡(lm,m+1−lm)l_{m+1} = \max(l_{m},\, m+1 – l_m) lm+1=max(lm,m+1lm)

这样,我们就获得了最初的 (fn0,ln0)(f_{n_0},l_{n_0})(fn0,ln0),这个 LFSR 满足
fn0(x)⋅A(x)=tailn0(x)=0modxn0+1f_{n_0}(x) \cdot A(x) = tail_{n_0}(x)=0 \mod x^{n_0+1} fn0(x)A(x)=tailn0(x)=0modxn0+1

也就是 fn0f_{n_0}fn0 可以约束 a[1:n0]\textbf{a}[1:n_0]a[1:n0],然后我们就可以迭代计算后续所有的 (fn,ln)(f_n,l_n)(fn,ln) 了。

当我们遇到 dn+1≠0d_{n+1} \neq 0dn+1=0 时,我们可以这么选取 fmf_mfm

  1. 找到 lm<lm+1=⋯=lnl_m < l_{m+1} = \cdots = l_nlm<lm+1==ln,此时必然有 fmf_mfm 无法约束 a[1:m+1]\textbf{a}[1:m+1]a[1:m+1],于是存在对应的 dm+1≠0d_{m+1} \neq 0dm+1=0 是可逆元

  2. 由于 ln=lm+1=max⁡(lm,m+1−lm)>lml_n = l_{m+1} = \max(l_m,\, m+1-l_m) > l_mln=lm+1=max(lm,m+1lm)>lm,因此必然有 ln=m+1−lml_{n} = m+1-l_mln=m+1lm,从而 n−m+lm=n+1−lnn-m+l_m = n+1-l_nnm+lm=n+1ln,即
    deg⁡(tailn(x)−dn+1dm+1−1xn−mtailm(x))≤max⁡(ln,n+1−ln)\deg(tail_n(x) – d_{n+1}d_{m+1}^{-1}x^{n-m}tail_m(x)) \le \max(l_n,\, n+1-l_n) deg(tailn(x)dn+1dm+11xnmtailm(x))max(ln,n+1ln)

    因此,我们设置 LFSR 的级数为 ln+1=max⁡(ln,n+1−ln)l_{n+1} = \max(l_n,\, n+1-l_n)ln+1=max(ln,n+1ln)

定理 1:如果 (f,l)(f,l)(f,l) 可以约束前 nnn 项,而无法约束第 n+1n+1n+1 项。那么对于可以生成前 n+1n+1n+1 项的 LFSR,它的级数必然满足:
l′≥n+1−ll' \ge n+1-l ln+1l

因此,上述的 fmf_mfm 的选择就是最优的。使用其他的选择,得到的 LFSR (fn+1,ln+1)(f_{n+1},l_{n+1})(fn+1,ln+1) 的级数不会更短。于是 BM 算法产生的每个 (fn,ln)(f_n,l_n)(fn,ln) 就是可以生成 a1a2⋯ana_1a_2\cdots a_na1a2an 的(不一定唯一)最短 LFSR

定理 2:如果 (f,l)(f,l)(f,l) 可以约束 NNN 长的序列 a\bf aa 的线性综合解,那么它是唯一解 ⟺2l≤N\iff 2l \le N2lN

也就是说,如果求解的最终结果满足 ln≤n/2l_n \le n/2lnn/2,那么它就是唯一解,与一开始的 fn0f_{n_0}fn0 的选择无关。但如果不是,那么选择其他的 fn0f_{n_0}fn0 结果就可能会不一样(为了考试!),当然它们都是正确的 LFSR。

BM 算法

给定序列 a=a1a2⋯aN∈FN\textbf{a} = a_1a_2 \cdots a_N \in \mathbb F^Na=a1a2aNFN,算法如下:

  1. 初始化步骤

    1. 设置 d0=0d_0 = 0d0=0f0=1f_0 = 1f0=1l0=0l_0 = 0l0=0
    2. 如果 ai=0,∀1≤i<n0a_i=0,\, \forall 1 \le i < n_0ai=0,∀1i<n0,那么设置 di=0d_i = 0di=0fi=1f_i = 1fi=1li=0l_i = 0li=0
    3. 设置 dn0=an0d_{n_0} = a_{n_0}dn0=an0fn0=1−dn0xn0f_{n_0} = 1-d_{n_0}x^{n_0}fn0=1dn0xn0ln0=n0l_{n_0} = n_0ln0=n0
  2. 迭代步骤

    1. 假设已经获得了 (fn,ln)(f_n,l_n)(fn,ln),那么计算 dn+1=an+1+∑i=1lncian+1−id_{n+1} = a_{n+1} + \sum_{i=1}^{l_n} c_i a_{n+1-i}dn+1=an+1+i=1lncian+1i
    2. 如果 dn+1=0d_{n+1} = 0dn+1=0,那么设置 fn+1=fnf_{n+1} = f_nfn+1=fnln+1=lnl_{n+1} = l_nln+1=ln
    3. 如果 dn+1≠0d_{n+1} \neq 0dn+1=0,那么
      1. 寻找 lm<lm+1=⋯=lnl_m < l_{m+1} = \cdots = l_nlm<lm+1==lnmmm 对应的 fmf_mfmdm+1≠0d_{m+1} \neq 0dm+1=0
      2. 设置 fn+1=fn−dn+1dm+1−1xn−mfmf_{n+1} = f_n – d_{n+1}d_{m+1}^{-1} x^{n-m} f_mfn+1=fndn+1dm+11xnmfmln+1=max⁡(ln,n+1−ln)l_{n+1} = \max(l_n,\, n+1-l_n)ln+1=max(ln,n+1ln)
    4. n+1=Nn+1=Nn+1=N 时,结束迭代,输出 (fN,lN)(f_N,\, l_N)(fN,lN)

例子

线性反馈移位寄存器(LFSR)和 Berlekamp-Massey 算法-编程知识网