线性反馈移位寄存器(LFSR)和 Berlekamp-Massey 算法
如果给定一个长度为 $N$ 的序列片段 $\textbf{a} = a_1a_2 \cdots a_N \in \mathbb F^N$,已知它是由线性递归关系生成的。如何计算出生成它的最短的 LFSR ?我们使用联接多项式 $f$ 以及阶数 $l$ 来描述 LFSR。我们将 $(f_N,l_N)$ 称作 $\textbf{a}$ 的**线性综合解**,如果 $f_N$ 对应的 $l_N$ 级 L
应用密码学课上学习了 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
ci∈F。如果
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+1∑nciak−i
特征多项式为:
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=1∑ncixn−i
联接多项式为:
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=1∑ncixi
易知, 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) a∈G(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 xe≡1modf 的最小整数(多项式的阶,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=a1a2⋯aN∈FN,已知它是由线性递归关系生成的。如何计算出生成它的最短的 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=a1a2⋯an,我们定义下述多项式
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+⋯anxn∈FN
假设一个
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+1∈F[x]
那么对于
l
n
+
1
≤
k
≤
n
l_n+1 \le k \le n
ln+1≤k≤n,要满足约束:
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=1∑lnciak−i=0∈F
注意到
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=1lnciak−i 就是
f
⋅
A
f \cdot A
f⋅A 的单项
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=0∈F,那么说明 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+1−1xm−nfm(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+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
对应的 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+1−1xn−mtailm(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,n−m+lm)
多项式选取
给定序列 a = a 1 a 2 ⋯ a N ∈ F N \textbf{a} = a_1a_2 \cdots a_N \in \mathbb F^N a=a1a2⋯aN∈FN,我们首先找到第一个非零元素 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 1≤i<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=n0≥1,序列 a [ 1 : n 0 ] = 0 n 0 − 1 ∥ 1 \textbf{a}[1:n_0] = 0^{n_0-1}\|1 a[1:n0]=0n0−1∥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=1−an0xn0
容易看出,这些 ( 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(ln0−1,n0−ln0−1),因为 l n 0 − 1 = 0 l_{n_0-1}=0 ln0−1=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+1−lm)
这样,我们就获得了最初的
(
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:
-
找到 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 是可逆元
-
由于 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+1−lm)>lm,因此必然有 l n = m + 1 − l m l_{n} = m+1-l_m ln=m+1−lm,从而 n − m + l m = n + 1 − l n n-m+l_m = n+1-l_n n−m+lm=n+1−ln,即
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+1−1xn−mtailm(x))≤max(ln,n+1−ln)因此,我们设置 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+1−ln)
定理 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
l′≥n+1−l
因此,上述的 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 a1a2⋯an 的(不一定唯一)最短 LFSR。
定理 2:如果 ( f , l ) (f,l) (f,l) 可以约束 N N N 长的序列 a \bf a a 的线性综合解,那么它是唯一解 ⟺ 2 l ≤ N \iff 2l \le N ⟺2l≤N
也就是说,如果求解的最终结果满足 l n ≤ n / 2 l_n \le n/2 ln≤n/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=a1a2⋯aN∈FN,算法如下:
-
初始化步骤
- 设置 d 0 = 0 d_0 = 0 d0=0, f 0 = 1 f_0 = 1 f0=1, l 0 = 0 l_0 = 0 l0=0
- 如果 a i = 0 , ∀ 1 ≤ i < n 0 a_i=0,\, \forall 1 \le i < n_0 ai=0,∀1≤i<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
- 设置 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=1−dn0xn0, l n 0 = n 0 l_{n_0} = n_0 ln0=n0
-
迭代步骤
- 假设已经获得了 ( 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+1−i
- 如果 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
- 如果
d
n
+
1
≠
0
d_{n+1} \neq 0
dn+1=0,那么
- 寻找 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
- 设置 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=fn−dn+1dm+1−1xn−mfm, 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+1−ln)
- 当 n + 1 = N n+1=N n+1=N 时,结束迭代,输出 ( f N , l N ) (f_N,\, l_N) (fN,lN)
例子
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)