2025 n1junior crypto

出了三道 Easy xxx problem,都是比较纯粹考知识点的题目。

CheckIn

考虑

简单估计可以得到 ,也就是说 实际上是一个跟 差不多规模的量。

所以枚举这个 ,解方程可以得到 的估计值,然后使用 coppersmith 求出

exp 大概需要跑十几分钟。

MyRandom

熟悉 mt19937 可以立即发现这个就是改了一下 mt19937 的一些系数。

有一个网站 https://stackered.com/blog/python-random-prediction/ 对 mt19937 的各个原理讲的很详细了,本来是准备做 hint 放这个网站的,但是有的选手很快过了这题所以没放

上面这个网站里也有现成的代码,可以直接拿来改改用。

然后做这个题,首先是 CFB mode 的加密方式可以拿到一半的数据,并且按照 mt19937 的状态计算就是连续 8 个拿到后 4 个。

这个题的 seed size 为 288 bit 实际上是很特殊的,因为如果是 256 bit 应该是没有办法还原这个 seed——mt19937 使用 seed 的过程从 9 个为一循环变成 8 个一循环,导致我们知道的这些连续数据实际上的效果重复了。

当然 288bit 太小了,可以 z3 直接解出来,预期是注意到 9 个一循环所以我们恰好可以用连续四个恢复一个 seed 的状态,跑 9 次就行了。

StrangeCurve

一个较简化的 csidh fault attack,论文是 https://eprint.iacr.org/2020/1006.pdf。

可以先去 cryptohack 上了解 isogeny 相关的知识,然后结合这个论文就很简单了。

我们令

问题点在于我们会在第 轮时, 的概率不在 上,而在 的 quadratic twist 上,导致 isogeny 方向变化。

我们令 比较大,那么就会得到正确的 ,然后第 轮的影响会大概率得到 ,满足

因此我们可以直接对 和各个 分别 mitm,就能还原 privkey。

是为了在 sage 上跑的比较快,我的 exp 10min 以内能出。

这个题实际上还有可以优化的点,比如我们可以先从 之间 mitm,并且注意到 是随机的,所以 的不可能很多,这样可以减少 mitm 的枚举量,并且知道哪些 的也可以减少求 的路径的复杂度,这样就可以让 更大一些。