#流密码:
#逐字节或逐比特处理数据
#密钥长度会与明文的长度相同
#密钥派生自一个较短的密钥,派生算法通常为一个伪随机数生成算法
#关键在于设计好的伪随机数生成器
#统计特征被覆盖的非常好
#常见的流密码:反馈移位寄存器
#初态 a0,a1
#加密方式:线性 非线性
#状态转换 ai+n=F(a1,a2,an-1)
#线性反馈移位寄存器(LFSR)
def lfsr(R,mask):
output = (R << 1) & 0xffffffff #左移一位
i = ( R & mask) & 0xffffffff
lastbit = 0
while i != 0:
lastbit ^= (i & 1) #lastbit 异或i的最后一位
i = i >> 1
output ^= lastbit #lastbit为i的mask为1位的所有异或结果
print ('output: ' + bin(output))
return output,lastbit
#截取,以二进制读取
flag="1923701100110110105"
R = int(flag[5:-1],2)
key = [85,56,247,66,193,13,178,199,237,224,36,58]
#12位
mask = 0b1010011000100011100
#19位
for k in range(2**19):
R = k
a = ''
judge = 1
for i in range(12):
tmp = 0
for j in range(8):
(k,out) = lfsr(k, mask)
tmp = (tmp << 1)^out
if(key[i] != tmp):
judge = 0
break
if(judge == 1):
print('flag{'+bin(R)[2:]+'}')
break
#flag{1110101100001101011}