File
题目文件可以在BuuCTF上找到: https://buuoj.cn/challenges
CRT
考点主要是在中国剩余定理(CRT)这边。
平时遇到的要用CRT基本上都是只有一个解的,但是广义上的CRT是可能不止一解的。
所以就随便敲了几行代码出了这一题。
Intended Solution 1
在《信息安全数学基础》这本书上,CRT那边是给了两种证明方法的。
- 构造证明
- 递归证明
构造证明就是直接把解法构造出来。
递归证明挺有意思的,因为它联系到了前面学到的求解一次同余式的内容。 $$ \begin{aligned} \begin{cases} x &\equiv c_1 \pmod{n_1}\newline x &\equiv c_2 \pmod{n_2}\newline &\vdots \newline x &\equiv c_i \pmod{n_i} \end{cases} \end{aligned} $$ 怎么解这个玩意呢?
我们可以先把下标为1的同余式转化成等式: $$ x \equiv c_1 \pmod{n_1} \Leftrightarrow x = c_1 + k_1 n_1 $$ 然后我们把这个$x$的等式代入下标为2的同余式中, $$ c_1 + k_1n_1 \equiv c_2 \pmod{n_2} $$ 化简下, $$ n_1k_1 \equiv c_2 - c_1 \pmod{n_2} $$ 这就是一个求解一次同余式的问题,未知量是这个$k_1$。
求出$k_1$后,代入回$x = c_1 + k_1 n_1$,我们就可以得到$x \pmod{n_1 n_2}$的结果,然后一直这样操作下去,直到获得$x \pmod{n_1 n_2 \cdots n_i}$的结果。
直接引用我之前某个Notes 中的内容:
由于我们这边的模数$n$是这样取的:ms = [getRandomNBitInteger(128) for i in range(8)]
所以,很大概率上$\gcd(n_1, n_2)$会不等于1,导致多解(由于$x$是确实有的,所以不存在无解的情况)。
多解怎么办呢?
一个办法就是,我们在递归求解的时候,一定要求出这个一次同余式的所有解,再代入下一组。
一个草草的实现:
|
|
得到flag:flag{fa71921acdc2a756897d6b0c7ee41a7397386de2e7cde5b6adb525414b93deeb}
Intended Solution 2
不过后来想了想,由于模数里面肯定存在不互素的,我们实际上可以把这些不互素的,除去他们的最大公约数,也就是相当于算他们的最小公倍数$n_{lcm}$。
$x \pmod{n_{lcm}}$肯定就只有1解,假如说是$x_{lcm}$。
那么,$x$在$\mathbb{Z}$里的解就都可以表示为 $$ x = x_{lcm} + k\cdot n_{lcm} $$ 只要我们不断地增加这个$k$,然后检验sha256,就能找到那个想要的$x$。
甚至。。。我怀疑大家应该都是这么做的。。
wtcl。
Fast
这题灵感来源于某本书(An Introduction to Mathematical Cryptography)上的一道课后习题。
想法挺好的。
但是肯定有问题。
没问题的话,那我们现在用的RSA应该有大概率上就是这个版本的了。
其实仔细观察的话,一眼就能看出来问题所在:
$$ g^{p-1} \equiv 1 \pmod{p} $$ 那么, $$ g_1 = g^{r_1(p-1)} \equiv 1 \pmod{p} $$ 因此, $$ g^{r_1(p-1)} - 1 = k\cdot p $$ 只要 $$ \gcd(g_1 - 1, N) $$ 即可分解出$p$,再用$N$整除下$p$即可得到$q$。
然后直接调用decrypt
就能拿到flag了。
|
|
所以啊。。
有些题目,虽然看上去是挺复杂的:
但是,实际上是很简单的。
Backtrace
这题出的最轻松了,就10行代码就完事了。
就是想考一下对MT19937的掌握程度。
因为之前遇到过好几个要逆一下MT19937的题目:
-
EIS 2019
-
Byte CTF 2019
-
GXYCTF 2019
所以,就想考下如何从MT19937的1000个输出反推出前4个输出。
我之前也写过一个PRNG study ,不过写的实在是tcl。
推荐阅读:
- https://jazzy.id.au/2010/09/20/cracking_random_number_generators_part_1.html
- https://jazzy.id.au/2010/09/21/cracking_random_number_generators_part_2.html
- https://jazzy.id.au/2010/09/22/cracking_random_number_generators_part_3.html
- https://jazzy.id.au/2010/09/25/cracking_random_number_generators_part_4.html
Cryptopals 上也有一个叫你去日MT19937种子的任务。
badmoney师傅也有一篇post写的很好:浅析MT19937伪随机数生成算法
说来惭愧,想着去搞一下Cryptopals的,一直没去搞。。
画了一张简单的图:
希望有助于理解。
具体分析就不写了。
贴下exp:
|
|