ISCTF2025wp
Ez_Caesar
凯撒密码的变种,每次偏移量递增。仿照题目逻辑写一下就行,代码如下:
1 | |
运行结果如图:
Power tower
读完代码之后,我们求解的关键在于计算出 l ,根据代码的生成过程,我们是无法直接计算的。
理由如下: $$ \begin{gathered} l = 2^e \bmod n\\ e = 2^t \end{gathered} $$ 所以指数部分是非常大的,计算机内存不够,进而我们必须想办法化简这个形式。如何化简呢?我们利用一下扩展欧拉定理就可以了,证明过程就不多赘述了。
代码如下:
1 | |
运行结果如图:
baby_equation
多元高次方程组,在 sagemath 中直接求解是显然不太现实的了,求解速度太慢了。显然,我们要通过数学手段化简一下。首先,我们已知: $$ \begin{gathered} 4b^6-2a^3+3ac = N_1 \\ b^5+6c^3+2abc = N_2 \\ 3a^3-3ac-3b^6 = N_3 \end{gathered} $$ 接着,我们会很自然地将一式与三式叠加消去交叉项: $$ \begin{gathered} a^3+b^6 = N_1+N_3 = S \\ a^3 = S-b^6 \end{gathered} $$ 因为直接求解是不太现实的,我们最好能根据数量上的关系初步确定未知量的范围,进而求解。观察后发现 N1和 N3 是很接近互为相反数的,由于高位很多位数是一致的。因此 S 相对于来说是一个小的数,所以: $$ \begin{gathered} a^3 \approx -b^6 \\ a \approx -b^2 \\ 4b^6-2a^3+3ac = 4b^6-2(S-b^6)+3ac = 6b^6+3ac-2S = N_1 \end{gathered} $$ 综上,b6 在式子中占据了较大的权重,所以我们近似认为: 6b6 ≈ N1 最后,在近似值附近搜索即可,确定 a, b 后即可解出 c 。
具体代码如下:
1 | |
运行结果如图:
easy_RSA
结合提示知道,这道题我们要用上欧拉定理了,过程如下: $$ \begin{gathered} c_2 = m^{p+q} \mod N \\ \varphi(N) = (p-1)(q-1) = pq-(p+q)+1 = N-(p+q)+1 \\ p+q = N-\varphi(N)+1 \\ c_2 \equiv m^{N-\varphi(N)+1} \mod N \\ m^{\varphi(N)} \equiv 1\mod N \\ c_2 \equiv m^{N+1} \mod N \end{gathered} $$ 又因为: c1 = me mod N 所以,我们使用共模攻击即可,具体代码如下:
1 | |
运行结果如下:
小蓝鲨的RSA密文
RSA,又是泄露特定位上的信息,很难让人不认为是考察 coppersmith 攻击方法的理解,但是仔细查看过后又并非如此,我们来分析一下代码。
首先,密文的生成逻辑是这样的: $$ \begin{gathered} c\equiv m^3+a_2m^2+a_1m+a_0 \mod N \\ a_2 = A+n \end{gathered} $$ 其中,A 是已经泄露的高位信息,n 是未知的低位。所以进一步而言,上述方程简化为: c ≡ m3 + Am2 + nm2 + a1m + a0 mod N 又因为 m, n 是比较小的量,所以显然我们会考虑构造 f(m, n) ≡ 0 mod N 的一个二元同余多项式,对其使用 coppersmith 攻击求解。
但是,正是因为 m, n 实在是太小了,所以我们可以认为这个方程就是一个整数域上的多项式。因此,我们直接遍历 n 的所有取值,直接解出 m 。
具体代码如下:
1 | |
运行结果如下:
baby_math
我们还是关注一下密文的生成过程,过程如下: c = asin (x) + bcos (x) 其中, a, b 各是我们要求解的明文的一部分,显然我们会考虑构造格进行求解,构造如下的矩阵 M 。
$$ M=\begin{pmatrix} 1 & 0 & K\sin(x)\\ 0 & 1 & K\cos(x)\\ 0 & 0 & Kc\\ \end{pmatrix} $$ 矩阵 M 的每行是格的基向量, K 是缩放因子,将有理数转为整数。我们考虑这样的线性组合 (a, b, −1) ,那么组合后得到: (a, b, K(asin (x) + bcos (x) − c)) ≈ (a, b, 0)
为什么我们使用约等号,因为计算机计算浮点数的时候是有精度损失的。
因为组合得到的向量存在分量为 0 ,而 a, b 相对于 K 来说是非常小的(a, b 约为 Flag 的一半长度,大概几百比特,而 K 可以设得很大)。因此,向量 (a, b, 0) 将是格中的一个短向量,进而我们使用格基规约求解。
具体代码如下:
1 | |
运行截图如下:
小蓝鲨的 LSFR 系统
题目的输出中已经给出了初始状态和移位生成的输出状态,题目中的密钥是通过掩码生成的,所以我们把目光看到掩码上来:
1 | |
这个操作还是很常见的,我们可以将其看为 GF(2) 上的线性运算,掩码共有 128 位未知,而循环生成有 256 轮,这是一个超定方程组,剩下的就是写代码求解了。
具体代码如下:
1 | |
运行截图如下:
emm,值得注意的问题是题目的代码好像存在着一些问题,请看到这几行代码。
1 | |
每次循环都是求解状态列表的前 128 位,但是题目并没有做到旧状态的弹出,这意味着在 256 次循环生成的状态应该是全部一致的,这就是矛盾的地方了。
小蓝鲨的密码箱
打开题目发现是没怎么接触过的黑盒密码,那我们只能尝试带入一些特殊值分析加密算法了。
首先当然是尝试最特殊的 0, 1, -1 这样的数了,发现不允许参数为 0 ,那我们接着尝试 1 。加密的明文我们选取单个字符,然后观察密文的 16 进制表示,单个字符比较好看出加密过程发生的变化。此外,我们发现当 c = 1 时,不管明文是什么,输出的密文总为 0 。结合数学知识想一下,我们推测 c 是模数,当模为 1 的时候,任何数对 1 取模都等于 0 。
因此,我们可以输入一个非常大的 c 值,从而忽略模数的影响。然后,我们得到如下结果。
而字符 1 的 ASCII 码的十六进制表示就是 0x31 ,与加密后相比就是少了 1 ,所以我们推测加密逻辑就是对每个字符的十六进制加一然后输出十六进制。
最后,我们可以给出代码如下:
1 | |
运行后得到 flag:ISCTF{e34d3ee6-80c0-4623-b8f6-bf18bc5812f0}
沉迷数学的小蓝鲨
这场比赛最谜语人的题目来了,包括出题人也承认了这题受到了比较多师傅的吐槽()。首先根据广泛用于区块链的提示,我们知道了这条曲线是 Secp256k1 ,进而我们确定了p, a, G 这三个参数。接着我们就会发现 G, Q 这两个点不在题目给出的这条曲线上,所以这道题实际考察的是无效曲线攻击(Invalid Curve Attack)。
这个攻击的简要思想是这样的,椭圆曲线加密的关键在于计算点的乘法,也就是 Q = kP 。在计算乘法的过程就是不断地计算切线,然后求解交点,最后对称获得。又因为椭圆曲线一般形式如下: y2 = x3 + ax2 + b 所以曲线上任意一点的切线斜率为: $$ 2y\frac{\mathrm{d}y}{\mathrm{d}x}=3x^2+2ax $$ 从上式可以看出求解切线斜率与 b 是没有关系的,因此如果攻击者发送一个点 P′,这个点并不满足原来的曲线方程(即它属于另一个 b′ 不同的曲线),受害者的计算程序如果没有检查机制,依然会照常套用公式进行计算。程序虽然在“跑”,但实际上是在另一条参数为 (a, b′) 的曲线上运行。
而我们作为攻击者会特意选择这个 b′ ,使得这条新曲线 E′ 的阶包含很多小的素数因子,这使得在该曲线上解决离散对数问题变得极其容易。
具体代码如下:
1 | |
运行后得到结果:
小蓝鲨的费马谜题
题目都提到了费马,那显然我们要用到费马小定理了,我们做如下的数学推导。
首先我们需要分析 hint_value 的数学构成。代码中给出:
hi, j ≡ bip − 1 + bjp − 1 (mod n)
其中 bi, bj
是很小的素数(100以内),而 p
是一个 1024 位的大素数。显然 gcd (bi, p) = 1。
根据费马小定理:如果 p 是素数,且 a 是不可被 p 整除的整数,那么: ap − 1 ≡ 1 (mod p) 我们可以将 hi, j 对 p 取模来观察其性质:
$$ \begin{aligned} h_{i,j} \pmod p &= (b_i^{p-1} + b_j^{p-1}) \pmod p \\ &= (b_i^{p-1} \pmod p + b_j^{p-1} \pmod p) \pmod p \\ &= (1 + 1) \pmod p \\ &= 2 \pmod p \\ \end{aligned} $$
这意味着: hi, j − 2 = k ⋅ p 即 hi, j − 2 是 p 的倍数。因此,p 是 n, hi, j − 2的最大公因数,进而我们便可分解得到私钥。
具体代码如下:
1 | |
运行后得到 flag:ISCTF{M0dIFi3D_f3RM47_7H30r3m_I5_fUn_8U7_h4rD3r!}
小蓝鲨的后门
emm,很典型的一个 RSA 素数生成存在漏洞的问题,当私钥的选取满足如下形式时: 4p − 1 = D × V2 其中,D 是给定的某个整数,V 是随机生成的 2048 bits的正整数。对于这种满足 4p − 1 形式的质数等式,我们可以利用基于复杂乘法 / 特殊构造椭圆曲线 + n 次除法多项式的方法来暴露 p 。
原作者及其代码链接: https://github.com/pwang00/Cryptographic-Attacks/tree/master/Public%20Key/Factoring
由于这个标准脚本每次只是针对一个 D 进行尝试分解,所以这道题我们直接多试几次,最后可以确定具体的值。
从而得到具体代码如下:
1 | |
运行得到结果:
详细的题目文件与解题脚本以及 WriteUp 的 pdf 可以通过关于页中我的 GitHub 仓库找到。