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

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

LFSR

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

在这里插入图片描述

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

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

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

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

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

Berlekamp-Massey 算法

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

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

多项式乘积

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

假设一个 l n l_n ln级的 LFSR 可以生成这个序列,对应的联接多项式为
f ( x ) = c l n x l n + ⋯ + c 1 x + 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]

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

注意到 a k + ∑ i = 1 l n c i a k − i a_k + \sum_{i=1}^{l_n} c_i a_{k-i} ak+i=1lnciaki 就是 f ⋅ A f \cdot A fA 的单项 x k x^k xk系数,也就是说:
f ( x ) ⋅ A ( x ) = t a i l n ( x ) m o d    x n + 1 f(x) \cdot A(x) = tail_n(x) \mod x^{n+1} f(x)A(x)=tailn(x)modxn+1

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

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

思路

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

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

如果
f n ( x ) ⋅ A ( x ) = t a i l n ( x ) m o d    x n + 2 f_{n}(x) \cdot A(x) = tail_n(x) \mod x^{n+2} fn(x)A(x)=tailn(x)modxn+2

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

如果
f n ( x ) ⋅ A ( x ) = t a i l n ( x ) + d n + 1 x n + 1 m o d    x n + 2 f_{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

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

我们寻找一个 ( f m , l m ) (f_m,l_m) (fm,lm),它无法约束 a [ 1 : m + 1 ] \textbf{a}[1:m+1] a[1:m+1],即
f m ( x ) ⋅ A ( x ) = t a i l m ( x ) + d m + 1 x m + 1 m o d    x m + 2 f_{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

那么,我们令
f n + 1 ( x ) = f n ( x ) − d n + 1 d m + 1 − 1 x m − n f m ( 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)

画的草图:

在这里插入图片描述

可以验证:
f n + 1 ( x ) ⋅ A ( x ) = f n ( x ) ⋅ A ( x ) − d n + 1 d m + 1 − 1 x n − m f m ( x ) ⋅ A ( x ) = t a i l 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 t a i l m ( x ) = t a i l n ( x ) − d n + 1 d m + 1 − 1 x n − m t a i l m ( x ) m o d    x n + 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

对应的 t a i l n + 1 = t a i l n ( x ) − d n + 1 d m + 1 − 1 x n − m t a i l m ( 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 ⁡ ( t a i l n + 1 ) ≤ max ⁡ ( l n ,   n − m + l m ) \deg(tail_{n+1}) \le \max(l_n,\, n-m+l_m) deg(tailn+1)max(ln,nm+lm)

多项式选取

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

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

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

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

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

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

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

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

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

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

  2. 由于 l n = l m + 1 = max ⁡ ( l m ,   m + 1 − l m ) > l m l_n = l_{m+1} = \max(l_m,\, m+1-l_m) > l_m ln=lm+1=max(lm,m+1lm)>lm,因此必然有 l n = m + 1 − l m l_{n} = m+1-l_m ln=m+1lm,从而 n − m + l m = n + 1 − l n n-m+l_m = n+1-l_n nm+lm=n+1ln,即
    deg ⁡ ( t a i l n ( x ) − d n + 1 d m + 1 − 1 x n − m t a i l m ( x ) ) ≤ max ⁡ ( l n ,   n + 1 − l n ) \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 的级数为 l n + 1 = max ⁡ ( l n ,   n + 1 − l n ) l_{n+1} = \max(l_n,\, n+1-l_n) ln+1=max(ln,n+1ln)

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

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

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

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

BM 算法

给定序列 a = a 1 a 2 ⋯ a N ∈ F N \textbf{a} = a_1a_2 \cdots a_N \in \mathbb F^N a=a1a2aNFN,算法如下:

  1. 初始化步骤

    1. 设置 d 0 = 0 d_0 = 0 d0=0 f 0 = 1 f_0 = 1 f0=1 l 0 = 0 l_0 = 0 l0=0
    2. 如果 a i = 0 ,   ∀ 1 ≤ i < n 0 a_i=0,\, \forall 1 \le i < n_0 ai=0,∀1i<n0,那么设置 d i = 0 d_i = 0 di=0 f i = 1 f_i = 1 fi=1 l i = 0 l_i = 0 li=0
    3. 设置 d n 0 = a n 0 d_{n_0} = a_{n_0} dn0=an0 f n 0 = 1 − d n 0 x n 0 f_{n_0} = 1-d_{n_0}x^{n_0} fn0=1dn0xn0 l n 0 = n 0 l_{n_0} = n_0 ln0=n0
  2. 迭代步骤

    1. 假设已经获得了 ( f n , l n ) (f_n,l_n) (fn,ln),那么计算 d n + 1 = a n + 1 + ∑ i = 1 l n c i a n + 1 − i d_{n+1} = a_{n+1} + \sum_{i=1}^{l_n} c_i a_{n+1-i} dn+1=an+1+i=1lncian+1i
    2. 如果 d n + 1 = 0 d_{n+1} = 0 dn+1=0,那么设置 f n + 1 = f n f_{n+1} = f_n fn+1=fn l n + 1 = l n l_{n+1} = l_n ln+1=ln
    3. 如果 d n + 1 ≠ 0 d_{n+1} \neq 0 dn+1=0,那么
      1. 寻找 l m < l m + 1 = ⋯ = l n l_m < l_{m+1} = \cdots = l_n lm<lm+1==ln m m m 对应的 f m f_m fm d m + 1 ≠ 0 d_{m+1} \neq 0 dm+1=0
      2. 设置 f n + 1 = f n − d n + 1 d m + 1 − 1 x n − m f m f_{n+1} = f_n - d_{n+1}d_{m+1}^{-1} x^{n-m} f_m fn+1=fndn+1dm+11xnmfm l n + 1 = max ⁡ ( l n ,   n + 1 − l n ) l_{n+1} = \max(l_n,\, n+1-l_n) ln+1=max(ln,n+1ln)
    4. n + 1 = N n+1=N n+1=N 时,结束迭代,输出 ( f N ,   l N ) (f_N,\, l_N) (fN,lN)

例子

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐