Python实现线性反馈移位寄存器实例信息安全导论期中小作业
我们先来了解一下什么是线性反馈移位寄存器(LFSR)
线性反馈移位寄存器(LFSR)简介
这里直接引用了大佬的博客
LFSR用于产生可重复的伪随机序列PRBS,该电路有n级触发器和一些异或门组成,如下图所示。
其中,gn为反馈系数,取值只能为0或1,取为0时表明不存在该反馈之路,取为1时表明存在该反馈之路;这里的反馈系数决定了产生随机数的算法的不同。用反馈函数表示成y=a0x^0+a1x+a2x^2…反馈函数为线性的叫线性移位反馈序列,否则叫非线性反馈移位序列。
简单来说LFSR就是给定前一状态的输出,将该输出再用作输入,用于产生下一次的随机输出,异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位。
正文&LFSR的一种实现
今天,笔者的信息安全导论的期中小作业以及下方,要求实现一个遵循以下规则的线性反馈移位寄存器:
1.初始序列为:学号后三位的二进制,并补齐9位
2.反馈函数为:初始序列中,数值为’1’的下标进行异或运算
*当然,这样定义的反馈函数不够完善,有可能默认的学号转成二进制后只有一个1,这种情况将无法参与异或运算
例如:学号后三位为 360 的同学,应该首先将360转成2进制并补齐9位得到 101101110 (最低位为x0,最高位为x8),而对应的反馈函数为:f(x1,x2,x3,x5,x6,x8)=x1^x2^x3^x5^x6^x8
了解了基本的规则之后,我们就开始实现这个代码,然后就随便拿了一个学号试试
代码如下:
'''
python3 实现反馈移位寄存器的输出序列
author: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(" 异或的结果为: ",res,end=' ')print(" 本次输出是: ",s[-1])out.append(s[-1])s=str(res)+s[:-1]return s
def get_res(out):re=''for i in out:re+=ireturn re
s0=str(bin(int(input("请输入你学号的后三位:"))))[2:].zfill(9) #首先确定最初的序列
#s0='100'
index=[]
out=[] #输出序列
cycle=1
for i in range(len(s0)): #把位值为1的下标找到if(s0[i]=='1'):index.append(i)else:continue
print("初始序列为:",s0)
print("需要参与反馈函数作异或运算的位数为:",end='')
for i in index:print('b',str(8-i+1),sep='',end=' ')
print()
s=get_s_cur(s0)
history.append(s)
while(True):if(s==s0):breakelse:print('*第',str(cycle).zfill(3),'次循环* ',end='',sep='')cycle+=1 s=get_s_cur(s)
re=get_res(out)
print("该序列的周期为:",cycle)
print("最终得到的生成序列为:",re)
芜湖,感觉很完美呐,正当我感觉可以收工的时候,突然有同学就开始找我说某些学号算不出来,比如这个168,每两位之间构成了循环,进入循环之后永远也不能再回到最开始的序列010101000
发现这种情况之后当然是先用代码把构成了内循环的学号都算出来,当然这里的原理是9位序列的线性反馈移位寄存器的最大周期是2^9-1也就是511,所以我们用以下代码将不可被计算的学号都列举出来,当然我们这里仅列举了100~200的学号
'''
python3 爆破不可被计算的学号
author: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(" 异或的结果为: ",res)out.append(s[-1])s=str(res)+s[:-1]return sfor j in range(1,201):s0=str(bin(int(str(j))))[2:].zfill(9)#s0=str(bin(int(input("请输入你学号的后三位:"))))[2:].zfill(9) #首先确定最初的序列#s0='100'index=[]out=[] #输出序列cycle=1for i in range(len(s0)): #把位值为1的下标找到if(s0[i]=='1'):index.append(i)else:continue#index=[0,2]#print("初始序列为:",s0)#print("需要参与反馈函数作异或运算的位数为:",end='')'''for i in index:print('b',str(8-i+1),sep='',end=' ')print()'''s=get_s_cur(s0)m=1while(True):if(s==s0 or m>512):breakelse:m+=1cycle+=1 s=get_s_cur(s)if(m>512):print('学号',str(j).zfill(3),'不可被计算')
于是乎得到了如下一些计算结果
应该是这个算法设计有问题了,所以这里赶紧联系了老师,于是
好吧,姑且当作内循环也是循环吧,于是乎继续设计了如下代码,将每次运算的结果都进行储存,若在运算过程中出现了内循环则退出
'''
python3 实现反馈移位寄存器的输出序列
author: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(" 异或的结果为: ",res,end=' ')print(" 本次输出是: ",s[-1])out.append(s[-1])s=str(res)+s[:-1]return s
def get_res(out):re=''for i in out:re+=ireturn re
s0=str(bin(int(input("请输入你学号的后三位:"))))[2:].zfill(9) #首先确定最初的序列
#s0='100'
index=[]
out=[] #输出序列
cycle=1
for i in range(len(s0)): #把位值为1的下标找到if(s0[i]=='1'):index.append(i)else:continue
#index=[0,2]
print("初始序列为:",s0)
print("需要参与反馈函数作异或运算的位数为:",end='')
for i in index:print('b',str(8-i+1),sep='',end=' ')
print()
history=[]
flag=0
s=get_s_cur(s0)
history.append(s)
while(True):if(s==s0):breakelse:print('*第',str(cycle).zfill(3),'次循环* ',end='',sep='')cycle+=1 s=get_s_cur(s)for i in history:if s==i:flag=1breakif flag==1:print("该序列因产生内循环终止!")breakhistory.append(s)
re=get_res(out)
print("该序列的周期为:",cycle)
print("最终得到的生成序列为:",re)
# print(history)
# print(s)
这样当再次发生内循环时,就能够正确退出程序,下面的例子可以看到当程序继续运行时,得到的序列111010011将与历史序列构成内循环,所以程序停止
学习了学习了
Python实现线性反馈移位寄存器实例信息安全导论期中小作业相关推荐
- 序列密码体制(python随机数密码,RC4,线性反馈移位寄存器
目录 概念: Vernam密码技术(序列密码的起源 伪随机数 线性反馈移位寄存器: 线性反馈移位寄存器LFSR 概念: 明文按一定长度分组后表示成一个序列,称为明文流.加密时,由种子密钥通过密钥流生产 ...
- 数字IC前端学习笔记:LSFR(线性反馈移位寄存器)
引言 LSFR(线性反馈移位寄存器)用于产生可重复的伪随机序列PRBS(Pseudo-Random Binary Sequence),结构包括n级D触发器和一些异或门(或同或门)组成,在每个时钟沿,后 ...
- HDLBits 系列(21)LFSR(线性反馈移位寄存器)
目录 5 bit LFSR 3 bit LFSR 32 bit LFSR 5 bit LFSR A linear feedback shift register is a shift register ...
- quartus仿真6:74194构建线性反馈移位寄存器计数器LFSR
扭环形计数器具有8个有效状态,仍然有8个无效状态.进一步提高移位寄存器构建的计数器的有效状态数,可采用线性反馈移位寄存器计数器(Linear Feedback Shift-Register Count ...
- 流密码(一)同步流密码、自同步流密码以及线性反馈移位寄存器
正式进入密码学领域,发现密码学更像是一门数学,主要是对数论.近世代数的简单应用以及运用在算法中,常常结合模运算以及数字逻辑运算. 流密码的第一部分主要是比较了同步流密码和自同步流密码,其中自同步流密码 ...
- Verilog 实现伪随机数生成器(线性反馈移位寄存器)
Verilog 实现伪随机数生成器(线性反馈移位寄存器) 1,题目 2,RTL代码设计 3,testbench测试代码 4,前仿真,波形验证 参考文献1 1,题目 不简单的进行移位,而是在移位的基础上 ...
- 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)
移位寄存器总结 一.前言 二.简单循环左移/右移/双向移位寄存器 2.1 简单循环左移/右移/双向移位寄存器 2.2 verilog代码 2.3 Testbench 2.4 仿真结果 三.逻辑移位与算 ...
- 详解线性反馈移位寄存器(LFSR)
转载于(九)详解线性反馈移位寄存器(LFSR) 文章目录 LFSR的由来 LFSR具体内容 对LFSR的密钥流攻击 延伸 书籍推荐 LFSR的由来 1. 移位寄存器: 移位寄存器(ShiftRegis ...
- C实现多项式F_2上的阶(线性反馈移位寄存器)
C语言求多项式F_2上的的阶 F_2:{0,1}二元域 求阶的函数 反馈多项式的阶等于线性反馈移位寄存器不同初态输出序列的最大周期(类似最小公倍数). int getlev(const int n){ ...
- HDLBITS笔记29:移位寄存器(包括4位移位寄存器,创建100位左/右旋转器,算术偏移,线性反馈移位寄存器等)
题目1:4位移位寄存器(4-bit shift register) 构建一个具有异步复位.同步加载和使能功能的 4 位移位寄存器(右移位). reset:将移位寄存器重置为零. load: 加载数据[ ...
最新文章
- python的socket编程_Python Socket编程详细介绍
- 在CentOS上安装Java环境—openjdk1.7 解决https配置问题
- 【6】Zookeeper脚本及API
- layui中监听select下拉框改变事件
- 用TortoiseSVN忽略文件或文件夹(ignore)(网络摘抄记录)
- Matab 读取修改 XML
- 【python图像处理】】python绘制散点图
- android 字体像素转换工具类_Android中px与dip,sp与dip等的转换工具类
- sublime text2快捷键
- 高性能nginx HTTP服务器 配置实例(转自我的收藏)
- android的动态注册,Android JNI 函数注册的两种方式(静态注册/动态注册)
- 强命名保护DLL文件
- 会员登录 php,php $_SESSION会员登录实例分享
- lisp励遍图块中的实体_lisp励遍图块中的实体_「AutoCAD之图块编辑」八仙过海各显神通——图块编辑方法综述......
- 剑指offer-21.栈的压入弹出序列
- CSS3导入字体后用另外一种索引去加载字体里面的字符的问题。
- BigDecimal 加减乘除及对比
- OO第四单元UML作业总结暨OO课程总结
- 一文学会「内存映射」
- html背景图片的隐藏,CSS隐藏图片背景上方的文字内容