该更新更新blog了,总的来说今年体验不如去年,能学到东西的除了Card Shark的MT19937通用方法外,没啥新鲜的了
Choose_U_Flag
NTRU但不完全对。也没理解到出题人的意思,而且似乎题目的NTRU也有点问题。但不影响直接非预期解决。
题目流程挺简单的,服务端随机生成一个12bytes的可打印字符串,然后用NTRU加密,加密以后把密文coefficient发回来。
服务端提供了一次解密服务,但要求我们上传的密文coefficient不能是他发过来的那个,也就是说不能直接解密刚刚发回来的密文
对发送的密文的判断只是简单的判断和random_key的系数是否完全相同。哥们直接找个系数加个64不就不同了,反正到时候算的时候就被模掉了….
事实上我还可以旋转密文,还可以LLL日私钥,反正挺多解法的,就是不知道预期该是怎样的
exp
没有exp,key_coefficients复制下来找个你觉得喜欢的数字把他加个64发过去就拿到random_key了
有没有可能预期就是这样呢
Compare
题目要我们先传个表达式上去,这个表达式得够油,油到后面自己能根据
考的就是同态。看看加密
Encrypt:
所以计算
n是512位的 所以如果
所以我们传expr = MSG - 2 ** 511 < 0
,每轮算一次eval()
的内容就会变成
这个式子与
exp
1 | from pwn import * |
Card Shark
这题算是比较有意思的一题了(全靠其他题衬托。
就是单纯的日MT19937,通过前面的轮次来获得getrandbits()
的输出,利用这些输出来还原生成器内部的状态,从而预测后续的随机数。
这里用到一个利用线性关系构造矩阵的解决办法。
这个办法很牛,理论上只要拿到19968位的输出,就能日烂MT19937,就是需要的时间有一点长。
如果对MT19937有了解过,就知道里面的所有操作线性的,也就是说每一次输出的每一位都是由一开始的624个状态线性变换得来的。
因为每个状态是32位,不妨记初始状态为X
对于某次输出的某一位
这里的
而这个攻击方法的核心就是
也就是说,只要我们能知道19968位,并且知道它们都是第几次输出的第几位,就能够还原出
首先,从
通过上面的构造拿到对应的
然后就是由状态推后面的状态了
参考https://www.anquanke.com/post/id/205861#h3-9后面的扩展部分。
exp
矩阵
1 | # sage |
生成完
1 | # sage |