-
-
[原创]第三题 七十二疑冢
-
发表于:
2018-12-6 23:38
4789
-
题目逻辑比较清晰,不需要太多逆向工作,main函数逻辑如下:
逻辑很清晰,拿到9字节的输入后,根据对应的72bit生成key,然后加密已知明文,要求所得密文是“序列号输入正确”。同时可以看到,key虽然长度是138,但在生成的过程中最多只改变前87个字节。
加密函数流程也很简单,
138轮的操作,实际上后面138-87=51轮是固定的。
可以用python模拟一下这key生成和加密两步操作,
其中dec
可以把后面51轮固定操作倒推掉。
要求输出中文,也就是,
这里有两张表,d1和d2,d1用来生成key,d2用于加密过程。观察d2,其中几列明显有规律,第10、11两列看起来不规律。
整体流程中只有异或操作,不妨看看d2[:,10]
是否在GF(2)上线性。
果然是线性的,11列同理。
所以整个流程都是线性的,严格来说明文到密文是线性的,但题目中明文是固定的,这里可以试试看key到密文是不是线性的。只修改key中的固定位置pos的一个bit,看结果中的bit如何变化,如果这种变化跟pos之外的位置上是0是1无关,那么我们就可以得到key和密文的线性关系。
可以看到,虽然前面71个bit不同,但最后一位的bit变化带来的结果变化是一致的。
所以现在的加密过程等效于方程AX+B=Y。其中X是key,B是key全为0时的Y,A就是关系阵,dec(ans)
可以拿到题目要求的Y,之后解线性方程就可以拿到我们要的X。
先拿Y和B,
再遍历key的每一个bit,拿到A,
注意这里搞错了矩阵列数,实际上只需要72列,这里弄了成了128*128的,当然其实是无所谓的,多余的都是0。
现在就可以算答案了,
故答案为E7DFE373BFF25B92B6。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课