美文网首页
Python实现LFSR(线性反馈移位寄存器)

Python实现LFSR(线性反馈移位寄存器)

作者: 听左边的鱼 | 来源:发表于2019-02-21 20:47 被阅读0次

1.简介

LFSR(线性反馈移位寄存器),可以生成伪随机序列,用于数据压缩,数据加解密等。 一般采用verilog等硬件描述语言实现,此处使用python描述其行为,有些地方写法较生硬,可作为硬件生成序列的一个比对参考。

2.实现

以图1为例(verilog实现见https://blog.csdn.net/limanjihe/article/details/52400969),

图1
n=8:D7~D0,反馈系数如图蓝色标示从右到左(高位到低位)为“101110001”,除图上最左边和最右边的‘1’外,其余各位可看成是否进行异或操作的指示。从反馈系数的左数第二位开始取,同时把D0的反馈系数置零,得到实际的异或指示为:“01110000”,分别对应D7~D0的系数。

定义输入:

array_init = 255       #多项式初值,设为十进制255
tap_init = "101110000" #LFSR抽头,已将D0系数置零
tap = tap_init[1:]     #从第2位开始取,为实际的异或指示“01110000”

把输入转化为8位二进制,注意“08b”的‘0’不能省略,以保证高位为0时仍然是8位数:

array_init_bin = '{:08b}'.format(array_init)

定义输出,由于python不支持直接对字符串的某位赋值,而list可以。此处先将输出转成list,处理完后在转回字符串:

array_new = '0'*len(array_init_bin)
array_new = list(array_new)        #转为list,以对字符串位进行赋值

开始移位并异或反馈,注意array[0:7]与图1的D7~D0对应:

for i in range(len(array_init_bin)):  #对每位进行操作,D6->D7、D5->D6、D4->D5...
    j = i+1                                           
    if(i == (len(array_init_bin)-1)): #array[0]-->array[7],即D7-->D0,
        j = 0
    if(tap[i]=='1'):                  #‘1’表示需进行异或操作,Dx^D7
        array_new[i] = str(int(array_init_bin[j])^int(array_init_bin[0]))
    else:
        array_new[i] = str(array_init_bin[j])

 array_new = ''.join(array_new)      #将list转回字符串

最终由“11111111”得到了第二轮array:“10001111”。

将其定义成def,然后循环调用,可以得到更多序列,完整代码如下:

def lfsr(ai,t):
    array_init = ai#255 #多项式
    tap_init = t#"101110000"#抽头
    tap = tap_init[1:]
    array_init_bin = '{:08b}'.format(array_init)
    
    array_new = '0'*len(array_init_bin)
    array_new = list(array_new)

    for i in range(len(array_init_bin)):
        j = i+1
        if(i == (len(array_init_bin)-1)):
            j = 0
        if(tap[i]=='1'):
            array_new[i] = str(int(array_init_bin[j])^int(array_init_bin[0]))
        else:
            array_new[i] = str(array_init_bin[j])
        
    array_new = ''.join(array_new)
        print(array_new)              #二进制
    print(int(array_new,2))           #十进制
    print(hex(int(array_new,2)))      #十六进制
    with open('test.txt', 'a+') as f: #写入txt
        f.write(str(hex(int(array_new,2)))+'\n')
    return int(array_new,2)

#调用20次
init = 255
tap = "101110000"
for i in range(20):
    init = lfsr(init,tap)

相关文章

  • CTF竞赛密码学之 LFSR

    概述: 线性反馈移位寄存器(LFSR)归属于移位寄存器(FSR),除此之外还有非线性移位寄存器(NFSR)。移位寄...

  • Python实现LFSR(线性反馈移位寄存器)

    1.简介 LFSR(线性反馈移位寄存器),可以生成伪随机序列,用于数据压缩,数据加解密等。 一般采用verilog...

  • 2022-10-20

    已知线性反馈移位寄存器半个周期的输出序列 和 线性递推式,求另外半个周期的输出序列,不会做跳过去,先看后面的。 题...

  • 线性回归--sklearn框架实现

    线性回归--原理 线性回归--python实现(不使用框架) 线性回归--sklearn框架实现 这里使用skle...

  • 线性回归--python实现(不使用框架)

    线性回归--原理 线性回归--python实现(不使用框架) 线性回归--sklearn框架实现 这里使用pyth...

  • 线性回归--原理

    线性回归--原理 线性回归--python实现(不使用框架) 线性回归--sklearn框架实现 通常我们学习机器...

  • [Stay Sharp]线性回归代码实现

    纯Python实现线性回归 源码地址 https://github.com/Yalye/SharpMachineL...

  • 实现多元线性回归

    多元线性回归的实现下面我们来使用python代码实现多元线性回归: 其实在代码中,思想很简单,就是使用公式即可。其...

  • 数学建模心得(1)

    1. 线性规划问题以及可以转换成线性规划问题。相应问题:机器工作安排,投资收益等。 python实现线性规划 - ...

  • 线性回归python实现

    参考书籍:机器学习-周志华 参考链接:https://www.cnblogs.com/sumai/p/521155...

网友评论

      本文标题:Python实现LFSR(线性反馈移位寄存器)

      本文链接:https://www.haomeiwen.com/subject/usidyqtx.html