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