StreamGame4

1.本题给了一个加密脚本和一个加密过后的key。

2.脚本将flag做为二进制读入,做为密钥。然后循环1024*1024次,每次循环8次nlfsr函数,将结果变换写入key中。所以可以进行爆破,每次检测key的一位,从第一位开始,如果正确在检测下一位。脚本如下:

  1. def nlfsr(R,mask):
  2. output = (R << 1) & 0xffffff
  3. i=(R&mask)&0xffffff
  4. lastbit=0
  5. changesign=True
  6. while i!=0:
  7. if changesign:
  8. lastbit &= (i & 1)
  9. changesign=False
  10. else:
  11. lastbit^=(i&1)
  12. i=i>>1
  13. output^=lastbit
  14. return (output,lastbit)
  15. f=open("key","rb").read()
  16. mask=0b110110011011001101110
  17. flag = False
  18. for x in range(0,pow(2,27-6)-1):
  19. R=x
  20. for i in range(1024*1024): #此处可以把1024*1024改成一个较小的数
  21. tmp=0
  22. for j in range(8):
  23. (R,out)=nlfsr(R,mask)
  24. tmp=(tmp << 1)^out
  25. if f[i]!=tmp:
  26. break
  27. elif i==1024*1024-1: #此处也要同时更改
  28. flag=True
  29. break
  30. if x%100000==0:
  31. print('x =',x)
  32. if flag==True:
  33. flag=x
  34. break
  35. print("flag{"+bin(x)[2:]+"}"