线性反馈移位寄存器(LFSR,Linear Feedback Shift Register)

移位寄存器

该寄存器可以保存一个二进制位集。

两种方法将位加载到寄存器中:①并行加载,位同时加载 ②使用移位寄存器来加载。

在移位时,每个位均往右移一位,最右边的位被丢弃,而最左边的位被输入位代替。

线性反馈移位寄存器(LFSR,Linear Feedback Shift Register)_第1张图片 标8位移位寄存器并行加载题 标题移入一个0后的寄存器内容

 线性反馈移位寄存器

最简单的反馈移位寄存器。

一般由两部分组成:①移位寄存器 ②反馈函数

每次移位寄存器中所有位右移一位,新的最左端的位根据寄存器中某些位计算得到,由寄存器某些位计算最左端的部分被称为反馈函数

反馈函数是寄存器中某些位简单异或,这些位叫做抽头,有时也叫Fibonacci配置。

移位寄存器是由位组成的序列,其长度用位来表示,如果它是n位长,则称其为n级移位寄存器

移位寄存器输出的一个位常常是最低有效的位。

移位寄存器的周期是指输出序列从开始到重复时的长度。

一个n位移位寄存器的当前存储内容能够处于2^n-1个状态中的任意一个。所以理论上,n级LFSR的输出序列在重复之前能够产生2^n-1位长的伪随机序列(是2^n-1而不是2^n,是因为全0的状态将使LFSR无止境地输出0序列)。

只有特定抽头序列的LFSR才能循环地遍历所有2^n-1个内部状态,且此时输出序列被称为m序列

为了使LFSR生成最大周期序列,其生成多项式(由抽头序列加上常数1形成的多项式)必须是本原多项式,多项式的阶数为移位寄存器的级数。


选择一个15次以上的不可约多项式,编写一个线性反馈移位寄存器。验证生成序列的周期。

def lfsr(ai, t):
    array_init = ai #初始位
    tap_init = t #抽头
    tap = tap_init[0:]
    tap_len=len(tap) #抽头长度
    array_init_bin = '{:0{taplen}b}'.format(array_init,taplen=tap_len) #把初始位转化为二进制 ‘:0{taplen}b’中‘tapen’为占位符
    #print("二进制为:",array_init_bin)
    array_init_bin=list(array_init_bin)
    
    #其实应该可以直接array_init_bin=list(array_init_bin)
    array_new = '0' * len(array_init_bin) #创建变量与array_init_bin长度相同的字符串
    array_new = list(array_new) #将字符串转换为列表
    for i in range(len(array_init_bin)):
        array_new[i] = str(array_init_bin[i])

    #print(array_new[0])
    with open('series.txt', 'a+') as f:  # 将序列写入txt
        f.write(str(array_new[0]) ) #array_new[0]为输出序列
    xorNum = int(array_new[0])
 
    for k in range(1, len(array_init_bin)):
        if (tap[k] == '1'):
            xorNum ^= int(array_new[k])

    for i in range(len(array_init_bin)-1): #寄存器右移,输入反馈部分
        j = i + 1
        array_new[i] = str(array_new[j])
    array_new[len(array_init_bin) - 1]=str(xorNum)

    array_new = ''.join(array_new)
    return int(array_new, 2) #将移位寄存器转换成整数

tap=input("请输入抽头:")
init=pow(2,len(tap))-1 #初始的位为2^n-1
primary = init
tt=1 #初始周期为1
#print("序列密码为:")
for i in range(4294967299): #计算移位寄存器的周期
    init = lfsr(init, tap)
    if(init!=primary):
        tt+=1
    else:
        break
print('序列周期为:',tt)

你可能感兴趣的:(python,web安全)