介绍
这题和其他的几题,例如streamgame1、2、4,有点不一样,因为直接爆破可能性太多了,根本不可行,所以我们有必要好好分析一下。
流密码
关于流密码的知识可以Google了解,在这里就不再多说。这道题基本思路是,R1、R2、R3三个初始值,每次经过lfsr轮转,产生新的R1、R2、R3,并且将lastbit经过简单运算out = (x1 * x2) ^ ( (x2 ^ 1) * x3)
的到一个out输出。out与tmp进行一系列运算得到最终结果,这题结果总共为1G的数据。(题目下载中只给了1M的,因为已经够了)
爆破R1、R3
而此题的突破点就在那个简单的运算,看一个表:
1 | x1 x2 x3 out |
可以发现,x1、x3与out相同的几率很大,约为75%。所以我们可以单独爆破x1、x3,将x1或x3视为out进行加密,然后统计加密结果与正确结果的相同的概率有多少,在75%左右的就是正确答案了,错误答案,理论上来说应该为50%。
爆破R2
在爆破成功了R1、R3之后我们就可以,直接爆破R2了。需要注意的是这里的爆破是根据概率统计来的,所以我们没有必要选全部加密文件来进行统计,选一小部分就可以了(32bit、64bit),因为根据前几题,错误的答案几乎不可能”蒙”出正确答案。
参考
本文参考了队内大佬的文章,文章链接:http://blog.leanote.com/post/xp0intjnu@gmail.com/66c91498d13b
脚本
详细解决脚本如下,脚本中有注释:
1 | def lfsr(R,mask): |
跑脚本需要一定的时间,需要耐心等待,在我电脑上约为18分钟。