应用密码学课上学习了 BM 算法,林老师说期末必考。做课后题时,让求解一个20长序列的 LFSR,本人算了两大页纸,还算错了两遍 (╬ ̄皿 ̄)
这里仔细研究下,谈谈我自己对它的理解。
文章目录
- LFSR
- Berlekamp-Massey 算法
-
- 多项式乘积
- 思路
- 多项式选取
- BM 算法
- 例子
LFSR
线性反馈移位寄存器(Linear-feedback shift register)可用于产生随机序列。有限域 F\mathbb FF 上的 nnn 级(包含nnn长的状态) LFSR 的结构如下:
其中 ci∈Fc_i \in \mathbb Fci∈F。如果cn=0c_n = 0cn=0,那么是退化的 LFSR。反馈逻辑为线性递推关系:
ak=∑i+1nciak−ia_k = \sum_{i+1}^n c_i a_{k-i} ak=i+1∑nciak−i
特征多项式为:
f(x)=xn+∑i=1ncixn−if(x) = x^n + \sum_{i=1}^n c_i x^{n-i} f(x)=xn+i=1∑ncixn−i
联接多项式为:
f~(x)=1+∑i=1ncixi\tilde f(x) = 1+\sum_{i=1}^n c_i x^i f~(x)=1+i=1∑ncixi
易知,degf=n\deg f = ndegf=n,degf~≤n\deg \tilde f \le ndegf~≤n
用 G(f)G(f)G(f) 表示由特征多项式 fff 可以生成的所有序列的集合,可以视为 F\mathbb FF上的nnn 维向量空间。若 a\textbf aa 是 F2F_2F2 上的周期序列,那么当仅当存在一个多项式 fff(极小多项式),使得 a∈G(h)\textbf{a} \in G(h)a∈G(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 的级数 degf\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 fxe≡1modf 的最小整数(多项式的阶,order)。
Berlekamp-Massey 算法
如果给定一个长度为 NNN 的序列片段 a=a1a2⋯aN∈FN\textbf{a} = a_1a_2 \cdots a_N \in \mathbb F^Na=a1a2⋯aN∈FN,已知它是由线性递归关系生成的。如何计算出生成它的最短的 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=a1a2⋯an,我们定义下述多项式
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+⋯anxn∈FN
假设一个 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+1∈F[x]
那么对于 ln+1≤k≤nl_n+1 \le k \le nln+1≤k≤n,要满足约束:
ak+∑i=1lnciak−i=0∈Fa_k + \sum_{i=1}^{l_n} c_i a_{k-i} = 0 \in \mathbb F ak+i=1∑lnciak−i=0∈F
注意到 ak+∑i=1lnciak−ia_k + \sum_{i=1}^{l_n} c_i a_{k-i}ak+∑i=1lnciak−i 就是 f⋅Af \cdot Af⋅A 的单项 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=0∈F,那么说明 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+1−1xm−nfm(x)
画的草图:
可以验证:
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+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
对应的 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+1−1xn−mtailm(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,n−m+lm)
多项式选取
给定序列 a=a1a2⋯aN∈FN\textbf{a} = a_1a_2 \cdots a_N \in \mathbb F^Na=a1a2⋯aN∈FN,我们首先找到第一个非零元素 an0≠0a_{n_0} \neq 0an0=0
-
设置 f0=1f_0=1f0=1,对应的 l0=0l_0=0l0=0 级的 LFSR 可以生成空序列。
-
对于 1≤i<n01 \le i < n_01≤i<n0,明显 a[1:i]=0i\textbf{a}[1:i] = 0^ia[1:i]=0i 是零序列,从而可以由 fi(x)=1f_i(x)=1fi(x)=1 的 li=0l_i=0li=0 级的 LFSR 来生成。
-
对于 i=n0≥1i=n_0 \ge 1i=n0≥1,序列 a[1:n0]=0n0−1∥1\textbf{a}[1:n_0] = 0^{n_0-1}\|1a[1:n0]=0n0−1∥1 可以由任意的 ln0=n0l_{n_0}=n_0ln0=n0 级的 LFSR 生成,方便起见选取:
fn0=1−an0xn0f_{n_0} = 1 – a_{n_0} x^{n_0} fn0=1−an0xn0
容易看出,这些 (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(ln0−1,n0−ln0−1),因为 ln0−1=0l_{n_0-1}=0ln0−1=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+1−lm)
这样,我们就获得了最初的 (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:
-
找到 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 是可逆元
-
由于 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+1−lm)>lm,因此必然有 ln=m+1−lml_{n} = m+1-l_mln=m+1−lm,从而 n−m+lm=n+1−lnn-m+l_m = n+1-l_nn−m+lm=n+1−ln,即
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+1−1xn−mtailm(x))≤max(ln,n+1−ln)因此,我们设置 LFSR 的级数为 ln+1=max(ln,n+1−ln)l_{n+1} = \max(l_n,\, n+1-l_n)ln+1=max(ln,n+1−ln)
定理 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 l′≥n+1−l
因此,上述的 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_na1a2⋯an 的(不一定唯一)最短 LFSR。
定理 2:如果 (f,l)(f,l)(f,l) 可以约束 NNN 长的序列 a\bf aa 的线性综合解,那么它是唯一解 ⟺2l≤N\iff 2l \le N⟺2l≤N
也就是说,如果求解的最终结果满足 ln≤n/2l_n \le n/2ln≤n/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=a1a2⋯aN∈FN,算法如下:
-
初始化步骤
- 设置 d0=0d_0 = 0d0=0,f0=1f_0 = 1f0=1,l0=0l_0 = 0l0=0
- 如果 ai=0,∀1≤i<n0a_i=0,\, \forall 1 \le i < n_0ai=0,∀1≤i<n0,那么设置 di=0d_i = 0di=0,fi=1f_i = 1fi=1,li=0l_i = 0li=0
- 设置 dn0=an0d_{n_0} = a_{n_0}dn0=an0,fn0=1−dn0xn0f_{n_0} = 1-d_{n_0}x^{n_0}fn0=1−dn0xn0,ln0=n0l_{n_0} = n_0ln0=n0
-
迭代步骤
- 假设已经获得了 (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+1−i
- 如果 dn+1=0d_{n+1} = 0dn+1=0,那么设置 fn+1=fnf_{n+1} = f_nfn+1=fn,ln+1=lnl_{n+1} = l_nln+1=ln
- 如果 dn+1≠0d_{n+1} \neq 0dn+1=0,那么
- 寻找 lm<lm+1=⋯=lnl_m < l_{m+1} = \cdots = l_nlm<lm+1=⋯=ln 的 mmm 对应的 fmf_mfm 和 dm+1≠0d_{m+1} \neq 0dm+1=0
- 设置 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=fn−dn+1dm+1−1xn−mfm,ln+1=max(ln,n+1−ln)l_{n+1} = \max(l_n,\, n+1-l_n)ln+1=max(ln,n+1−ln)
- 当 n+1=Nn+1=Nn+1=N 时,结束迭代,输出 (fN,lN)(f_N,\, l_N)(fN,lN)