f=open("key","ab") #以二进制追加模式打开 for i in range(12): tmp=0 for j in range(8): (R,out)=lfsr(R,mask) tmp=(tmp << 1)^out f.write(chr(tmp)) #将lfsr输出的序列每8个二进制为一组,转化为字符,共12组 f.close()
思路: 第一种方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
from Crypto.Util.number import*
f = open('key.txt','rb').read() r = bytes_to_long(f) bin_out = bin(r)[2:].zfill(12*8) R = bin_out[:19] #获取输出序列中与掩码msk长度相同的值 print(R) mask = '1010011000100011100' #顺序 c_n,c_n-1,。。。,c_1 key = '0101010100111000111'
R = '' for i in range(19): output = 'x'+key[:18] out = int(key[-1])^int(output[-3])^int(output[-4])^int(output[-5])^int(output[-9])^int(output[-13])^int(output[-14])^int(output[-17]) R += str(out) key = str(out)+key[:18]
#根据生成规则,初始状态最后一位拼接输出序列 #我们可以猜测seed的第19位(0或1),如果seed19+R[:18]输出值等于R[:19],那么就可以确定seed值了 def decry(): cur = bin_out[0:19] #前19位 2 进制数 res = '' for i in range(19): if lfsr(int('0'+cur[0:18],2),mask)[0] == int(cur,2): res += '0' cur = '0'+cur[0:18] else: res += '1' cur = '1' + cur[0:18] return int(res[::-1],2)
R = "" index = 0 key = key[18] + key[:19] while index < 19: tmp = 0 for i in range(19): if mask >> i & 1: tmp ^= int(key[18 - i]) R += str(tmp) index += 1 key = key[18] + str(tmp) + key[1:18]