1.本题给了一个加密脚本和一个加密过后的key。
2.脚本将flag做为二进制读入,做为密钥。然后循环1024*1024次,每次循环8次nlfsr函数,将结果变换写入key中。所以可以进行爆破,每次检测key的一位,从第一位开始,如果正确在检测下一位。脚本如下:
def nlfsr(R,mask):
output = (R << 1) & 0xffffff
i=(R&mask)&0xffffff
lastbit=0
changesign=True
while i!=0:
if changesign:
lastbit &= (i & 1)
changesign=False
else:
lastbit^=(i&1)
i=i>>1
output^=lastbit
return (output,lastbit)
f=open("key","rb").read()
mask=0b110110011011001101110
flag = False
for x in range(0,pow(2,27-6)-1):
R=x
for i in range(1024*1024): #此处可以把1024*1024改成一个较小的数
tmp=0
for j in range(8):
(R,out)=nlfsr(R,mask)
tmp=(tmp << 1)^out
if f[i]!=tmp:
break
elif i==1024*1024-1: #此处也要同时更改
flag=True
break
if x%100000==0:
print('x =',x)
if flag==True:
flag=x
break
print("flag{"+bin(x)[2:]+"}"