摸鱼的时候打了一下这个比赛,写个WP记录一下
baby_lattice
1 | from Crypto.Util.number import * |
简单的隐藏数问题
已知$g= (t \times key + z) mod p $,构造如下格,其中K就是z的比特数用来配格系数的,格规约后找到对应向量求出key后解密即可得到flag
$\begin{bmatrix}k_1&k_2&…&k_n&key&-1\end{bmatrix}\times\begin{bmatrix}p&0&\cdots&0&0&0\\0&p&\cdots&0&0&0\\\vdots&\vdots&\ddots&\vdots&\vdots&\vdots\\0&0&\cdots&p&0&0\\t_1&t_2&\cdots&t_n&\frac{K}{p}&0\\g_q&g_2&\cdots&g_n&0&K\end{bmatrix}=\begin{bmatrix}z_1&z_2&\cdots&z_n&\frac{key*K}{p}&K\end{bmatrix}$
代码如下:
1 | from output import * |
MIMT_RSA
1 | from Crypto.Util.number import * |
RSA加密,加密的明文比特只有36个比特,除了明文比特数较小外其他都很常规,所以攻击点只有可能在攻击明文,但是直接遍历的话,36个比特还是比较大的,所以假设明文可以分解为两个数的乘积,就可以使用mitm的方法进行遍历
代码如下:
1 | import tqdm |
EZ_Fermat_bag_PRO
1 | from Crypto.Util.number import getPrime, bytes_to_long |
观察题目发现$w=2^{f(p,q)}modn$,f是一个关于p,q的多项式,对于这个式子可以调整一下,$w_2=2^{f(p,q)}modp$,将模n变成模p后,指数就是模$p-1$,所以$w=w_2+kp$,所以求出来$w_2$后$gcd(w-w_2,n)$即可分解p,q
1 | from Crypto.Util.number import * |
分解n后还原flag,由于flag长度是88个字节,去掉前后缀后也还有80个字节,是640个比特,大于p的的512比特,所以分解后也无法直接还原flag。可以将$flag(modp)=c$看成一个方程:
$$
flag[0]\times 256^0+flag[1]\times 256^1+…+flag[79]\times 256^{79}(modp)=c
$$
对于这个方程可以使用格规约的方法规约出flag
观察题目
1 | assert all(chr(i) in ''.join(list(set(str(p)))) for i in flag[7:-1:]) |
告诉了flag中间的部分全都是数字,所以我们规约的目标向量是在$48-57$了,所以可以先将c减去bytes_to_long(b’0’*80)后目标向量就在$0-9$了,目标向量值在$0-9$平均值为5,配好系数后进行规约后判断一下即可得到目标向量
代码如下
1 | prefix = b"NSSCTF{" |
RSA_and_DSA
1 | from random import getrandbits, randint |
先使用维纳攻击分解p,q,阅读后面的代码发现就是一个模方程组,解方程即可。
代码如下:
1 | from Crypto.Cipher import AES |
Sin
1 | from Crypto.Util.number import bytes_to_long; |
题目很简洁,整理一下输出发现就是$4\times sin^3(m)$,但是由于m远大于$2\pi$,所以不能直接使用$arcsin$,对于下面式子构造格攻击即可
$$
m=arcsin(\frac{t}{4}^{\frac{1}{3}})+2\times k\pi
$$
代码如下:
1 | from sage.all import * |
river
1 | from Crypto.Cipher import AES |
这个题目当时参与了试题就没有做了,主要思路就是剪枝爆破得到seed后一一代入求解
具体可以参考一下别人的题解
[2025 GHCTF(校赛) Writeup - suhanhan的博客](https://suhanhan-cpu.github.io/2025/03/19/2025 GHCTF Writeup/)
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !