一.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实现相关推荐

  1. python求梅森尼数_谈谈梅森旋转:算法及其爆破

    https://liam.page/https://liam.page/https://liam.page/ 现代编程语言,大都在标准库中包含了随机库.例如,C++ 在 C++11 标准中添加了 ra ...

  2. 线性反馈移位寄存器-LFSR

    LFSR badmonkey的博客 最开始了解到LFSR的时候是在学习MT19937伪随机数生成器的时候,当时也是初步了解.也没有用代码实现过,最近做了几道相关的题,在这里记录一下. 原理 证明过程不 ...

  3. python电路仿真_Python创建PWL用于SPICE仿真

    最近想使用免费的LTSPICE做一些简单的信号仿真,评估信号经过一些链路模型传输后信号SI表型如何?需要在LTSPICE中采用信号系统中通常采用的伪随二进制码序列(PRBS)作为信号激励,模拟真实传输 ...

  4. python电路仿真_如何使用Python自动产生SPICE仿真用PWL文件

    最近想使用免费的LTSPICE做一些简单的信号仿真,评估信号经过一些链路模型传输后信号SI表型如何?需要在LTSPICE中采用信号系统中通常采用的伪随二进制码序列(PRBS)作为信号激励,模拟真实传输 ...

  5. Github配置(git+vscode+python+jupyter)

    ①下载git 打开 git bash 工具的用户名和密码存储 $ git config --global user.name "Your Name" $ git config -- ...

  6. 【实验楼】python简明教程

    ①终端输入python进入 欣赏完自己的杰作后,按 Ctrl + D 输入一个 EOF 字符来退出解释器,你也可以键入 exit() 来退出解释器. ②vim键盘快捷功能分布 ③这里需要注意如果程序中 ...

  7. 【Kaggle Learn】Python 5-8

    五. Booleans and Conditionals Using booleans for branching logic x = True print(x) print(type(x))''' ...

  8. 【Kaggle Learn】Python 1-4

    [Kaggle Learn]Python https://www.kaggle.com/learn/python 一. Hello, Python A quick introduction to Py ...

  9. 使用python愉快地做高数线代题目~

    今天接触到了python,发现真是极易上手啊!对比c语言是什么鬼东西= = 诶,等下,看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了,觉得c语言真的是废材! 不...不是的. ...

最新文章

  1. linux awk命令
  2. hadoop定位文件读取
  3. Android Doze模式源码分析
  4. 远程链接oracle 12514,数据库建好后,本地连接正常,远程连接ORA-12514错误
  5. 大数据多属性的数据架构设计
  6. 《那些年啊,那些事——一个程序员的奋斗史》——74
  7. Mac 下Eclipse无法连接手机
  8. 01-H5语义化标签
  9. ubuntu 修改 ssh默认端口号
  10. 每天备份NAS上的www目录到一块单独的硬盘上
  11. linux 小巧的浏览器,Linux奇技淫巧:一款特别轻量级的网页浏览器
  12. 资深Java面试题及答案(汇总)
  13. android手机修改app名字,手机App名字图标随意改,藏羞羞东西再也不怕被发现了...
  14. 初中高中睡前必看古诗名句
  15. 计算机cpu温度显示原理,鲁大师的测温功能是怎么做到的?测温原理介绍
  16. 世界上到底有多少种编程语言?
  17. 将OpenGL渲染的结果保存为图片
  18. vue创建一个简易版高德地铁路线图
  19. Docker搭建个人网盘和私人仓库,创建Dockerfile制作镜像
  20. Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例

热门文章

  1. 别混淆亚稳态和竞争冒险
  2. 2021 年元旦福利,小伙伴们来领现金红包
  3. 矩阵的范数和条件数(Norms and Condition Numbers)
  4. 新手项目遇到的小难题,后台带\n
  5. div怎么在css中设置字体大小,css如何设置div字体大小
  6. uni-app 项目调试遇到的问题
  7. 二次封装 ant-pro table + react-resizable实现表头控制拉拽
  8. 等保测评是什么?等保方案怎么做
  9. Google 奔跑吧小恐龙
  10. 【HDU 1870 --- 愚人节的礼物】栈水题