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 = a
        self.c = c
        self.lenc = lenc
        lena = len(a)
        #如果lena比lenc短,那么将其拓展 
        

    def LeftShift(self):
        lastb = 0
        lenc = self.lenc
        for 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 = b
        return 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 = key
        lenk = len(Keymap)
        self.lfsr1 = LFSR(Keymap, lfsr1, lenk)
        self.lfsr2 = LFSR(Keymap, lfsr2, lenk)  #生成LFSR伪随机序列 
        self.Key = Keymap
        self.lc = 0

    def GetBit(self):
        ak = self.lfsr1.LeftShift()
        bk = self.lfsr2.LeftShift()
        ck = ak ^ (~(ak ^ bk) & self.lc)  # JK触发器
        self.lc = ck
        return int(ck)

    def do_crypt(self, LFSR_msg):
        text = []
        for i in LFSR_msg:
            j, cnt = i, 8
            tmp = []
            while cnt > 0:
                tmp.append(self.GetBit() ^ (j & 1))#低位放在了前面 
                j = j >> 1
                cnt = cnt - 1
            res = 0
            for iti in range(7, -1, - 1):#按照[7,6,5,4,3,2,1]的顺序 
                res = res << 1
                res = 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 = a
        self.c = c
        self.lenc = lenc
        lena = len(a)
        #如果lena比lenc短,那么将其拓展 
        

    def LeftShift(self):
        lastb = 0
        lenc = self.lenc
        for 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 = b
        return outp


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 = key
        lenk = len(Keymap)
        self.lfsr1 = LFSR(Keymap, lfsr1, lenk)
        self.lfsr2 = LFSR(Keymap, lfsr2, lenk)  #生成LFSR伪随机序列 
        self.Key = Keymap
        self.lc = 0

    def GetBit(self):
        ak = self.lfsr1.LeftShift()
        bk = self.lfsr2.LeftShift()
        ck = ak ^ (~(ak ^ bk) & self.lc)  # JK触发器
        self.lc = ck
        return int(ck)

    def do_crypt(self, LFSR_msg):
        text = []
        for i in LFSR_msg:
            j, cnt = i, 8
            tmp = []
            while cnt > 0:
                tmp.append(self.GetBit() ^ (j & 1))#低位放在了前面 
                j = j >> 1
                cnt = cnt - 1
            res = 0
            for iti in range(7, -1, - 1):#按照[7,6,5,4,3,2,1]的顺序 
                res = res << 1
                res = 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)))
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值