LFSR python实现
一.LFSR部分(线性反馈移位寄存器)
LFSR的优点:
a.非常适合硬件实现
b.能产生大的周期序列
c.能产生好的统计特性的序列
d.能应用代数方法进行分析
实现思路:
a是n个寄存器(状态)
c是种子密钥,对应着a的系数
输出是a1&cn
迭代方程为:
ai(t+1)=ai+1(t)(i=1,2,…,n-1)
an(t+1)=Σ(ci*an-i(t))
class LFSR():def __init__(self, c=None, a=None, lenc=0): #c是开关(系数),a是初始状态 if a is None:a = []if c is None:c = []self.a = aself.c = cself.lenc = lenclena = len(a)#如果lena比lenc短,那么将其拓展 def LeftShift(self):lastb = 0lenc = self.lencfor i in range(lenc):lastb = lastb ^ (self.a[i] & self.c[i])b = self.a[1:]b.append(lastb)outp = self.a[0] #体现linear self.a = breturn outp
二.j-k触发器
j-k触发器有两个输入,对应着两个LFSR生成的序列输出
JK触发器的输出方程: ck = ak ^ (~(ak ^ bk) & ck-1)
class cypto_LFSR():def __init__(self, key, lfsr1 = None, lfsr2 = None):if lfsr1 is None:lfsr1 = [0, 1, 0, 1]if lfsr2 is None:lfsr2 = [0, 0, 1, 1]Keymap = keylenk = len(Keymap)self.lfsr1 = LFSR(Keymap, lfsr1, lenk)self.lfsr2 = LFSR(Keymap, lfsr2, lenk) #生成LFSR伪随机序列 self.Key = Keymapself.lc = 0def GetBit(self):ak = self.lfsr1.LeftShift()bk = self.lfsr2.LeftShift()ck = ak ^ (~(ak ^ bk) & self.lc) # JK触发器self.lc = ckreturn int(ck)def do_crypt(self, LFSR_msg):text = []for i in LFSR_msg:j, cnt = i, 8tmp = []while cnt > 0:tmp.append(self.GetBit() ^ (j & 1))#低位放在了前面 j = j >> 1cnt = cnt - 1res = 0for iti in range(7, -1, - 1):#按照[7,6,5,4,3,2,1]的顺序 res = res << 1res = res + tmp[iti]text.append(res)return bytes(text)
三.完整代码
# -*- coding: utf-8 -*-
"""
Created on Mon Dec 21 10:41:08 2020@author: 15061
"""
import base64
def get_str_bits( s:str):list_b = []for i in s:list_b.append((ord(i) - ord('0')))return list_b
class LFSR():def __init__(self, c=None, a=None, lenc=0): #c是开关(系数),a是初始状态 if a is None:a = []if c is None:c = []self.a = aself.c = cself.lenc = lenclena = len(a)#如果lena比lenc短,那么将其拓展 def LeftShift(self):lastb = 0lenc = self.lencfor i in range(lenc):lastb = lastb ^ (self.a[i] & self.c[i])b = self.a[1:]b.append(lastb)outp = self.a[0] #体现linear self.a = breturn outpclass cypto_LFSR():def __init__(self, key, lfsr1 = None, lfsr2 = None):if lfsr1 is None:lfsr1 = [0, 1, 0, 1]if lfsr2 is None:lfsr2 = [0, 0, 1, 1]Keymap = keylenk = len(Keymap)self.lfsr1 = LFSR(Keymap, lfsr1, lenk)self.lfsr2 = LFSR(Keymap, lfsr2, lenk) #生成LFSR伪随机序列 self.Key = Keymapself.lc = 0def GetBit(self):ak = self.lfsr1.LeftShift()bk = self.lfsr2.LeftShift()ck = ak ^ (~(ak ^ bk) & self.lc) # JK触发器self.lc = ckreturn int(ck)def do_crypt(self, LFSR_msg):text = []for i in LFSR_msg:j, cnt = i, 8tmp = []while cnt > 0:tmp.append(self.GetBit() ^ (j & 1))#低位放在了前面 j = j >> 1cnt = cnt - 1res = 0for iti in range(7, -1, - 1):#按照[7,6,5,4,3,2,1]的顺序 res = res << 1res = res + tmp[iti]text.append(res)return bytes(text)
s="i_love_hnu"k="1001"
key=get_str_bits(k)
l=cypto_LFSR(key)
print(l.do_crypt(get_str_bits(s)))
LFSR python实现相关推荐
- python求梅森尼数_谈谈梅森旋转:算法及其爆破
https://liam.page/https://liam.page/https://liam.page/ 现代编程语言,大都在标准库中包含了随机库.例如,C++ 在 C++11 标准中添加了 ra ...
- 线性反馈移位寄存器-LFSR
LFSR badmonkey的博客 最开始了解到LFSR的时候是在学习MT19937伪随机数生成器的时候,当时也是初步了解.也没有用代码实现过,最近做了几道相关的题,在这里记录一下. 原理 证明过程不 ...
- python电路仿真_Python创建PWL用于SPICE仿真
最近想使用免费的LTSPICE做一些简单的信号仿真,评估信号经过一些链路模型传输后信号SI表型如何?需要在LTSPICE中采用信号系统中通常采用的伪随二进制码序列(PRBS)作为信号激励,模拟真实传输 ...
- python电路仿真_如何使用Python自动产生SPICE仿真用PWL文件
最近想使用免费的LTSPICE做一些简单的信号仿真,评估信号经过一些链路模型传输后信号SI表型如何?需要在LTSPICE中采用信号系统中通常采用的伪随二进制码序列(PRBS)作为信号激励,模拟真实传输 ...
- Github配置(git+vscode+python+jupyter)
①下载git 打开 git bash 工具的用户名和密码存储 $ git config --global user.name "Your Name" $ git config -- ...
- 【实验楼】python简明教程
①终端输入python进入 欣赏完自己的杰作后,按 Ctrl + D 输入一个 EOF 字符来退出解释器,你也可以键入 exit() 来退出解释器. ②vim键盘快捷功能分布 ③这里需要注意如果程序中 ...
- 【Kaggle Learn】Python 5-8
五. Booleans and Conditionals Using booleans for branching logic x = True print(x) print(type(x))''' ...
- 【Kaggle Learn】Python 1-4
[Kaggle Learn]Python https://www.kaggle.com/learn/python 一. Hello, Python A quick introduction to Py ...
- 使用python愉快地做高数线代题目~
今天接触到了python,发现真是极易上手啊!对比c语言是什么鬼东西= = 诶,等下,看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了,觉得c语言真的是废材! 不...不是的. ...
最新文章
- linux awk命令
- hadoop定位文件读取
- Android Doze模式源码分析
- 远程链接oracle 12514,数据库建好后,本地连接正常,远程连接ORA-12514错误
- 大数据多属性的数据架构设计
- 《那些年啊,那些事——一个程序员的奋斗史》——74
- Mac 下Eclipse无法连接手机
- 01-H5语义化标签
- ubuntu 修改 ssh默认端口号
- 每天备份NAS上的www目录到一块单独的硬盘上
- linux 小巧的浏览器,Linux奇技淫巧:一款特别轻量级的网页浏览器
- 资深Java面试题及答案(汇总)
- android手机修改app名字,手机App名字图标随意改,藏羞羞东西再也不怕被发现了...
- 初中高中睡前必看古诗名句
- 计算机cpu温度显示原理,鲁大师的测温功能是怎么做到的?测温原理介绍
- 世界上到底有多少种编程语言?
- 将OpenGL渲染的结果保存为图片
- vue创建一个简易版高德地铁路线图
- Docker搭建个人网盘和私人仓库,创建Dockerfile制作镜像
- Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例