2025.4.26ACTF
2025.4.26ACTF
是 2025.4.26ACTF 哒!
难难难。跑了4个小时的脚本说无解…
总之就是我自己爆0了。
easy_log
E@sy L0g
1 |
|
题目让我们求2个在自定义曲线上的DLP。
NaCl是把这个问题转化为了矩阵上的问题,我们构造如下矩阵:
$$M_G=
\begin{bmatrix}
G.y-G.x,Q.x \
Q.x, Q.y
\end{bmatrix} \mod n$$
所有点加就被转换为了矩阵的乘法,倍乘就是矩阵的次方。
这个问题就转化为了矩阵的DLP了。
之后看他做的比较痛苦,我也不是很懂,但这个思路感觉还是不错的,记录一下。
然后就是照着小鸡块的博客的复现了。
easy_log
2个思路:
- 手写一个pohlig hellman+bsgs的ECDLP求解
- 可以通过曲线上的点来求出这条曲线(点可以通过点加和倍乘来得到,然后解个方程得到系数就好了,但再往后我就看不懂了…)
第一个思路:
先讲一下bsgs(baby-step giant-step)吧,这次遇到了,正好浅浅的学一下
对于一个离散对数问题(DLP):
$a^x \equiv b\ (mod p)$
我们可以令$x=A\lceil \sqrt{p} \rceil + B$
那么等式就可以化为:
$a^{A\lceil \sqrt{p} \rceil}\equiv b^{-B}\ (mod p)$
那么我们只需要枚举A的值,从0到$\sqrt{p}$然后存入哈希表,再枚举B的值,从0到$\sqrt{p}$,每次枚举的时候查找表中是否有值和$b^{-B}$相同的值,有则取出对应的A,把$A\lceil \sqrt{p} \rceil + B$返回即可,可以在$O(\sqrt{p})$的时间复杂度下完成。
下面是这题中小鸡块写的bsgs:
1 |
|
其中参数里的order是G的阶,而不是所在的群的阶。
然后再是pohlig hellman
值得一提的是,这里我们在应用pohlig hellman的时候,是需要分解一下这个群的order的。
即对于一个在$p * q$上的群,其中p,q都是质数,我们需要分解$(p-1) * (q-1)$,然后把整个群投影到阶更小的群中去(阶会比p-1,q-1更小),再用bsgs求解然后crt。在投影到阶更小的群后,bsgs里传入这个群的阶就可以了。
在其它情况下,如果我们的运算是在sagemath上有定义的,比如加减乘除,椭圆曲线的点加和点乘,我们可以直接使用sagemath内置的discrete_log函数来求解离散对数,这时我们就不需要分解order了,直接在discrete_log里传入ord=order即可,discrete_log函数会自动选择pohlig hellman来分解order求解(AI说的,但确实是不需要分解order,但在阶太大的情况下还是要考虑pohlig hellman+discrete_log,即先初步分解一下order,比如在前面那种情况下可以分解成p-1和q-1来传入)
回到题目中,至于投影的操作,比如整个群的阶是order,而你需要把这个群投影到阶为ord1的群上,那么对于点G,计算double_and_add(order//ord1,G,n),这个点就是投影后的点了,kG也是一样的。
但是这题pohlig hellman还是不够,还是太慢了,所以我们需要再套一层,也就是小鸡块wp中的dlp函数:
1 |
|
这里我去问了小鸡块,勉强搞懂了部分代码。
题目中的点加和点乘可以看作是二阶矩阵的运算,前面也有提到,所以我们可以把这个求自定义曲线的DLP转化成求二阶矩阵的DLP。
在模p上的矩阵,它的阶是$p*(p-1)*(p^2-1)$,也就是说我们可以把这个二阶矩阵投影到阶更小的子群上去求解,比如说阶为$p-1$,$p^2-1$的子群,而点的运算和这个二阶矩阵矩阵的运算是一样的,所以直接用点的运算即可,前面讲的也就不需要更改了。
个人感觉这个思路和pohlig hellman是很像的,整个思路就变成了:对一个阶很大的二阶矩阵矩阵构成的群,先把它投影到阶较小的子群上求解,在这个求解过程中再投影一次,投影到阶更小的子群上。
在实际的过程中,只需要最后一次投影即可,子群的子群还是子群,所以只需要在最后投影就好了,第一次就做了投影的话可能就是多此一举了,甚至可能会出现错误了。
而dlp函数中有的时候用的是$p-1$,有的时候是$p^2-1$,是这些子群有的阶是$p-1$,有的是$p^2-1$,实际测一下即可。
还有一点,我们可以注意到n的分解中有一个$p^3$,小鸡块在处理这个因子的时候特意加入了另一组解,这种是把$p^3$拆成了$p$和$p^2$,其中p用正常的pohlig hellman来解,$p^2$的求解用的是p-adic,但这个我还不是很懂,只知道这个也能用来求解离散对数,并且我遇到的都是用来求解$p^x$的,这题中x=2正好可以用。但实际原理我是不太懂的。
小鸡块的dlp这块的exp:
1 |
|
或者可以这么理解第一个思路:
这实际上就是一种矩阵的dlp,我之前见过的矩阵的dlp的用矩阵的行列式来代替矩阵,这样就是把矩阵的dlp转化成了普通的dlp。
但第一个思路里,我们就是直接通过手写一个bsgs去求矩阵的dlp。
在模质数p上的矩阵的阶是$p*(p-1)*(p^2-1)$,所以可以分别用pohlig hellman求一下子群的dlp。
第二个思路就不讲了,我也还没去试过。
AAALLL
Let’s welcome AAA’s LLL master!
1 |
|
题目我不是很能看懂,大致意思就是构造了一个多项式,最高次是$x^{449}$,多项式的系数是从$-1,0,1$中随机抽取的,然后用一个值带入这个多项式并给出结果,总共生成了$n/2$组数据,subset是带入的值的列表,values的结果的列表。然后要求我们解出这个$-1,0,1$序列。
一开始就感觉这个和背包问题很像,然后事实证明在数据量比较小的情况下,比如n=100,背包确实能解。但这题数据量明显特别大,即使用了flatter加速也要好几个小时才能跑完,并且随着数据量的增大,背包也很难求出我们所需要的解。
后来问了下小鸡块,他是把背包构造的矩阵进行了拆解,然后使得数据量减小了,也就更容易解出来了。
在背包问题中我们有系数向量s,$s * A=b$,其中A是由求s用的$450 * 450$的单位矩阵和255个规约组成的,这样的格明显会特别大,所以小鸡块对s和A进行了拆分,可以让A的构造变小很多,也就是降维。
我们把s按左右拆成$s_1$和$s_2$,A则对应的按上下拆成$A_1$和$A_2$,我们仍然有$s_1 \cdot A_1 + s_2 \cdot A_2 = \mathbf{b}$,然后移项化简得出:
$s_1 * A_1 * A_2^{-1}+s_2=b * A_2^{-1}$
所以我们可以构造格
$$
\begin{pmatrix}
1 & 0 & -A_1A_2^{-1} \
0 & 1 & \mathbf{b}A_2^{-1} \
0 & 0 & p
\end{pmatrix}
\to
(s_1, 1, \mathbf{k})
\begin{pmatrix}
1 & 0 & -A_1A_2^{-1} \
0 & 1 & \mathbf{b}A_2^{-1} \
0 & 0 & p
\end{pmatrix}
= (s_1, 1, s_2)
$$
这样我们构造的格就会小很多了,求解也就更容易了。
感觉这样的构造会很有用,以后格过大的时候可以参考一下来降维。
构造完就是直接flatter加速,然后拿出$s_1$和$s_2$组成s就是我们要求的了。
小鸡块的exp
顺带提一下arch上安装flatter(目前还是电脑小白,只会这个喵)
直接
1 |
|
就可以了
然后要用就
1 |
|
以及我发现传入flatter的矩阵如果是在QQ上的就会报错,ZZ上的就不会,很神奇。
OhMyTetration
Welcome to my Lottery Center!
1 |
|
你可以指定t和g,靶机会计算
$$
f(t, g) = g^{g^{g^{\dots(\text{共} t \text{个} g)^{x}}}} \mod p
$$
并返回
实际测一下可以发现有些p,p-1是很光滑的,所以我们可以使用pohlig hellman,同样也是手写一个bsgs。
只不过这次我们要解的方程是$g^{g^x} \equiv f\ (mod p)$,
To Be Continue…