非线性反馈移位寄存器,线性反馈移位寄存器特征多项式
首先,让我们了解一下什么是线性反馈移位寄存器(LFSR)。
线性反馈移位寄存器(LFSR)的大纲直接引用于此处大佬的博客。
LFSR用于产生迭代伪随机序列PRBS。该电路由N级触发器和几个异或门组成,如下图所示。
这里gn是反馈系数,其值只有0或1。值0表示没有带有此反馈的路径,值1表示有带有此反馈的路径。这里的反馈系数决定了随机数生成算法的不同。Y=a0x 0a1x a2x 2 …用一个反馈函数来表示,其中线性反馈函数称为线性移位反馈序列,否则称为非线性反馈移位序列。
简而言之,LFSR用于提供前一个状态的输出,将其输出作为输入,并生成下一个随机输出。异或运算是最常见的单位线性函数。对作为输入的寄存器的一位进行异或运算,寄存器中的所有位作为一个整体移位。
本文中LFSR的实现。目前,作者的信息安全指针理论的初步工作和在此基础上,有必要实现线性反馈移位寄存器根据以下规则。
1.初始数组是学校编号的最后三个二进制数字,加上9个数字。
2.在反馈函数中,值为‘1’的后缀是初始序列中的XOR。
*当然,这样定义的反馈函数是不够的。默认学号转换成二进制后,可能只有一个,不能参与异或运算。
比如一个学号后三位是360的学生,要先把360转换成二进制数,再加上九位,得到10110110(最低是x0,最高是x8),对应的反馈函数是f(x1,x2,x3,x5,x6)。
知道基本规则后,我们开始执行这个代码,尝试随意读取学号。
代码如下。
python3是反馈移位寄存器的输出序列作者:monster date:2021/4/16 # End= )res=int(s(int)index[0])print),Implementation=utf-8 def get _ s _ cur(s):print())leex),forIinrange) s[int(index) I)],end= (print) XOR结果是:,RES,end= (print)这个输出是3: s [-1] (out.append (s [-1]) s=str) 确定输出序列cycle=1 for iinrange(len)s0))3360)查找位值为1)8-i1 end=“”)print(s=get _ s _ cur(s0)history。 append(s)while)true):if)s==s0)3360
注意到这一点后,当然所有组成内循环的学号都会被代码计算出来。当然这里的原理是9位序列的线性反馈移位寄存器的最大周期是2 ^ 9-1,也就是511,所以下面列出了所有不能用下面代码计算的学号。当然,这里只列出了100~200个学号。
python3爆炸无法计算学号作者:monster date:2021/4/16 # encoding=UTF-8 def get _ s _ cur(s):# printings)int)index [0])、end= )for iinrange(1,index[0])、end=)、forIin s[int(index[I]],end=
数字的后三位:)))] [2:]。zfill(9) #首先确定原始序列#s0=100index=[]out=[] #输出序列cycle=1for i in range(len(s0)):#查找if (s0 [i]) Index=[0,2]#print(初始序列为:,s0)#print(需要参与反馈函数异或运算的位数为:,end=) for I in index: print (b ,str (8-I 1),sep= ,End=) print
这个算法设计应该有问题,所以我赶紧联系了这里的老师,所以
好了,我们就把它当成一个内循环吧,内循环,所以我们继续设计下面的代码来存储每次运算的结果,如果运算过程中有内循环就退出。
python3实现反馈移位寄存器的输出序列作者:monster date:2021/4/16 # encoding=utf-8 def get _ s _ cur(s):print(当前序列为:,s,这次的异或为:,end= )RES=int(s[int(index[0])])print( ,s[int(index[0])],end= )for I in range(1,len(index)):res^=int(s[int(index[i])])print(,s[int(index[i])],End=)print(结果s[-1])out . append(s[-1])s=str(RES)s[:-1]return sdef get _ RES(out):re= for I in out:re=ireturnres 0=str(int(input(请先输入你的学号 index=[]out=[]# Output sequence cycle=1 for I in range(len(s0)):#查找位值为1的下标if (s0 [i]= 1): index s0)print( index中I需要参与反馈函数异或运算的位数为:,End= )print( b ,str (8-I 1),sep= ,End= )print()history=[]flag=0s=get _ s _ cur(s0)history。 append(s)while(true):if(s==s0):break else:print( * first ,str (cycle)。zfill(Sep= )cycle=1s=get _ s _ cur(s)for I in history:if s==I:flag=1 break if flag==1:print(此序列因内循环而终止!)破历史。append (s) re=get _ res (out) print(这个序列的周期是:,cycle)print(最后生成的序列是:,re)# print(history)# print(s)这样当内循环再次发生时,程序就能正确退出。下面的例子说明当程序继续运行时
学习,学习。