LFSR(线性反馈移位寄存器)
生成序列
LFSR是一种流密码,加密方式
加密方式如下 \[ mask=(c_0,c_1,\dots,c_m)\\ a_n=c_ma_{n-1}+c_{m-1}a_{n-2}+\dots+c_0a_{n-m-1}\ mod\ 2 \] 用矩阵表示有 \[ \begin{pmatrix} &1\\\\ &&1\\\\ &&&\ddots&\\\\ &&&&1\\\\ c_0&c_{1}&\dots&&c_m \end{pmatrix} \begin{pmatrix} a_{n-m-1}\\\\ a_{n-m}\\\\ \vdots\\\\ a_{n-1} \end{pmatrix}= \begin{pmatrix} a_{n-m}\\\\ a_{n-m+1}\\\\ \vdots\\\\ a_{n} \end{pmatrix} \]
可以看出,右边的矩阵是一般线性群 \(G=GL_{m+1}(Z_2)\) 的一个元素,群 \(G\) 的阶为 \(\prod_{i=0}^{m+1}(2^{m+1}-2^i)\) ,所以该 LFSR 在经过最多与阶相等的周期后就会重复序列(矩阵非群的生成元可以有更短的周期)
逆推序列
注意到,该矩阵是满秩矩阵,所以一定会有逆,从而回推序列 \[ \begin{pmatrix} &1\\\\ &&1\\\\ &&&\ddots&\\\\ &&&&1\\\\ c_0&c_{1}&\dots&&c_m \end{pmatrix}^{-1} \begin{pmatrix} a_{n-m}\\\\ a_{n-m+1}\\\\ \vdots\\\\ a_{n} \end{pmatrix} = \begin{pmatrix} a_{n-m-1}\\\\ a_{n-m}\\\\ \vdots\\\\ a_{n-1} \end{pmatrix} \]
计算掩码
我们可以通过序列连续2(m+1)个元素计算出mask掩码 \[ \begin{pmatrix} a_n&a_{n+1}&\dots&a_{n+m}\\\\ a_{n+1}&a_{n+2}&\dots&a_{n+m+1}\\\\ \vdots&&\ddots&\vdots\\\\ a_{n+m}&a_{n+m+1}&\dots&a_{n+2m} \end{pmatrix} \begin{pmatrix} c_{0}\\\\ c_{1}\\\\ \vdots\\\\ c_{m} \end{pmatrix} = \begin{pmatrix} a_{n+m+1}\\\\ a_{n+m+2}\\\\ \vdots\\\\ a_{n+2m+1} \end{pmatrix} \] 解上面方程得到掩码 \(mask=(c_0,c_1,\dots,c_m)\)
sage代码
1 | def lfsr(R,mask,n): |