老样子,赛后解题
Yusa的密码学课堂——一见如故
1 | class Myrand(): |
- 函数
__init__(self,seed)
用于初始化 - 函数
rand(self)
为主要函数 - 函数
generate(self)
用于当index
为0时重新生成列表MT
- 函数
cs2l(self, y, shift)
用于将y
按bit循环左移shift
位 - 函数
cs2r(self, y, shift)
用于将y
按bit循环右移shift
位
由于是先生成了624个随机数,即遍历了一遍列表MT
,再生成了flag
所以我们用给出的624个随机数逆推出列表MT
的状态,再调用一下函数generate(self)
,最后在生成一个随机数即可获得flag
此题的难点在于这两条语句的逆算法
1 | y = y ^ self.cs2l(y, 11) ^ self.cs2l(y, 15) |
先看第一条语句,产生的结果等价如下方程组
其中,代表32位bit
已知,求
使,余下的式子模32递增下标
可得
重复上述操作得到
于是我猜想可能在进行足够多次的迭代运算后得到的结果是
即
编写脚本验证想法
1 | equ = [ |
最后的输出结果可以验证想法正确,且获得了迭代异或运算的shitf
值
第二条语句的逆向算法同理
1 | def bits_xor(bits, shift1, shift2): |
1 | DASCTF{49e225e5b1b57a1d3c9803b5ddfd38f9} |
后面两题随缘更新
更个锤子,Crypto2 3想破头都没思路