LFSR 线性反馈移位寄存器
LFSR 原理
线性反馈移位寄存器(LFSR)归属于移位寄存器(FSR),除此之外还有非线性移位寄存器(NFSR)。移位寄存器是流密码产生密钥流的一个主要组成部分。

移位寄存器的三要素:
- 初始状态: 由用户确定
- 反馈函数:
是n元布尔函数,即函数的自变量和因变量只取0和1这两个可能值 - 输出序列
如果反馈函数是线性的,那么我们称其为 LFSR,如下图所示:

LFSR的输出序列{
- .....
(i = 1,2,3,...)
举例:
下面是一个5级的线性反馈移位寄存器,其初始状态为

反馈函数为:
可以得到输出序列为:
周期为31。
对于 n 级线性反馈移位寄存器,最长周期为
(排除全零)。达到最长周期的序列一般称为 m 序列
已知反馈函数和输出序列,逆推求初始状态
例题1 2018 强网杯 Streamgame1
题目:
from flag import flag
assert flag.startswith("flag{")
assert flag.endswith("}")
assert len(flag) == 25
def lfsr(R, mask):
output = (R << 1) & 0xffffff
i = (R & mask) & 0xffffff
lastbit = 0
while i != 0:
lastbit ^= (i & 1) # 按位异或运算,得到输出序列
i = i >> 1
output ^= lastbit # 将输出值写入 output的后面
return output, lastbit
R = int(flag[5:-1], 2) # flag为二进制数据
mask = 0b1010011000100011100
f = open("key", "ab") # 以二进制追加模式打开
for i in range(12):
tmp = 0
for j in range(8):
(R, out) = lfsr(R, mask)
tmp = (tmp << 1) ^ out
f.write(chr(tmp)) # 将lfsr输出的序列每8个二进制为一组,转化为字符,共12组
f.close()
考点:
def lfsr(R,mask):
output = (R << 1) & 0xffffff
i=(R&mask)&0xffffff
lastbit=0
while i!=0:
lastbit^=(i&1)
i=i>>1 # R和mask进行异或操作,得到输出序列值
output^=lastbit #将输出值设置为output的最后一位
return (output,lastbit)
题目已知条件为 flag 长度为19bits,mask 长度也为19bits.
由LFSR的输出序列{
可知,输出值
题目中mask中只有第(3,4,5,9,13,14,17,19)位为1,其余都是0
注:(mask这里右边才是第一位,从右往左增大)
现在我们的目的就是为了求出前19位seed的值,而我们已知了seed后面输出序列的值(题目中给的附件key.txt)。那么我们逆推就能得到seed的值了。lfsr(R,mask)函数执行的是19bits的值。那么我们获取到输出序列前19bits值,即:key = 0101010100111000111
现在需要计算
1 =
得1 =
同理:R =