简单记录一下。
lastRSA
题目:
1 | from Crypto.Util.number import * |
题目的enc1和enc2给了两个关于leak0这个量的表达式,这两个表达式都可以看作是以leak0为根的多项式,所以可以用GCD把leak0求出来。
求出leak0后,由于leak0是$p \oplus (q >> 13)$,所以有两种办法可以把p、q求出来。
第一种办法是爆破q的高13位,然后当作普通的剪枝来做,将所有剪出来的p去检查能否被n整除
第二种办法就是,注意到这里由于p进行了13位的移位,所以leak0的高13位其实就是p的高13位,而利用p的高位,可以用n整除他得到q的高位,然后就可以利用leak0去进一步得到p的后续的高位,反复进行上述步骤就可以逐步把完整的p求出来。需要注意的是由于可能有进位,所以可能会产生两bit甚至以上的误差(极端一点的情况,最末位的0111…由于进位变成10…),不过这种概率并不高,所以控制2bit的误差已经可以解决绝大部分情况了。
exp:
1 | from Crypto.Util.number import * |
DexterJie师傅后面有问到我说这个题flag是groebner,所以leak0的求解也许出题人是用groebner做的。既然是一个变量两个方程那groebner肯定是可以,不过有个小问题就是一定要设置多元多项式环,不然sage应该会报错。
transformation
题目:
1 | #!/usr/bin/env python |
这个题依然基于扭曲爱德华曲线,只是最后为了求解flag还需要再映射回来,具体推导可以参考之前写过的另一篇博客:
Crypto趣题-曲线 | 糖醋小鸡块的blog (tangcuxiaojikuai.xyz)
exp:
1 | from Crypto.Util.number import * |