Misay's blog

Back

TH_Curve#

题目给出如下运算式子

P(x1,y1)  Q(x2,y2)P(x_1,y_1)\;Q(x_2,y_2) x3≡(x1−y12x2y2)(2x1y1x22−y2)−1mod  px_3\equiv (x_1-y_1^2x_2y_2)(2x_1y_1x_2^2-y_2)^{-1}mod\;p y3≡(y1y22−2x12x2)(2x1y1x22−y2)−1mod  py_3\equiv (y_1y_2^2-2x_1^2x_2)(2x_1y_1x_2^2-y_2)^{-1}mod\;p

自定义了一个曲线上的计算

然后我们知道

Q=mGQ=mG

这里我们的曲线方程实际是

2x3+y3+1≡dxy  mod  p2x^3+y^3+1\equiv dxy\;mod\;p

我们可以由Q    GQ\;\;G解出来这里的dd

我们做一个换元

x=XZ    y=YZx=\frac{X}{Z}\;\;y=\frac{Y}{Z}

可得

2X3+Y3+Z3≡dXYZ  mod  p2X^3+Y^3+Z^3\equiv dXYZ\;mod\;p

参照鸡块师傅的博客

2023-CryptoCTF-wp-crypto | 糖醋小鸡块的blog (tangcuxiaojikuai.xyz) ↗ Barak中,sage的EllipticCurve_from_cubic方法可以从一个三元多项式方程来衍生出一条标准维尔斯特拉斯椭圆曲线

我们可以由这个多项式衍生出一条标准的维尔斯特拉斯椭圆曲线,并且获得它和原曲线的映射关系,之后就是在这条标准曲线上做ECDLP即可

exp

这里我们获得的E是包含映射关系的曲线,而Ee就是正常的维尔斯特拉斯曲线,所以用E进行坐标转化,用Ee来算阶即可,如果这里我们DLP出来的mm不满足范围的话再考虑加减几个曲线的阶爆破即可

Baby_Curve#

给出了曲线上点加的计算方式

P(x1,y1)  Q(x2,y2)P(x_1,y_1)\;Q(x_2,y_2) x3≡(x1y2+y1x2)(1−dx12x22)−1mod  px_3\equiv (x_1y_2+y_1x_2)(1-dx_1^2x_2^2)^{-1}mod\;p y3≡(y1y2+2ax1x2)(1+dx12x22)+2dx1x2(x12+x22)(1−dx12x22)−1mod  py_3\equiv (y_1y_2+2ax_1x_2)(1+dx_1^2x_2^2)+2dx_1x_2(x_1^2+x_2^2)(1-dx_1^2x_2^2)^{-1}mod\;p

不是常规的椭圆曲线 先不管往下看

我们先给出第一组曲线参数(a,d,p1)(a,d,p_1),以及点G1G_1然后计算

P1=c⋅G1Q1=b⋅G1P_1=c\cdot G_1\\Q_1=b\cdot G_1

然后再用(−c,b)(-c,b)建立一条标准椭圆曲线,要你解ECDLP

P=k⋅GP=k\cdot G

那么我们就考虑爆破求出b    cb\;\;c然后直接解AES即可

exp

RSA_Loss#

给出了RSA解密的一个小mm,但不是我们的预期解 猜测原因是M>nM>n导致的,简单爆破M=kn+mM=kn+m不可行

我们仍有

M≡m  mod  nM\equiv m\;mod\; n

这里尝试利用我们的flag的组成规律 即

m = b'DASCTF{' + ?????? + b'}'

中间的??????字符串大致20~60字节 且是可打印字符 可以考虑来爆破,我们知道flag最小的情况是

m0 = b'DASCTF{' + b'\x00' * i + b'}'

最大是

m1 = b'DASCTF{' + b'\xff' * i + b'}'

我们就很自然的能想尝试去进行个爆破

设m的长度是i+8,可以计算出上下界m0~m1,我们又知道必有M−m≡0  mod  nM-m\equiv 0\;mod\; n,然后去找这个解即可

运气很好 能直接爆出来,需要大概15分钟

但是这个解法不够优雅 我们还能再进行一个优化


前面提到 我们有

M≡m  mod  nM\equiv m\;mod\; n

根据bytes_to_long函数的特性 我们已知,对于字符串

a0a1a2a3⋯ana_0a_1a_2a_3\cdots a_n

它的转换长整数结果会是

long=an2560+an−12561+⋯+an−i2i+⋯+a22n−2+a12n−1+a02nlong=a_n256^0+a_{n-1}256^{1}+\cdots+a_{n-i}2^{i}+\cdots+a_22^{n-2}+a_12^{n-1}+a_02^{n}

这里我们的前缀是DASCTF{ 后缀是},我们都是知道的 也就是说 我们能得到中间的?????的byts_to_long结果 就转化为求它了,设这里是flag

我们可以得到

c′≡flagmod  nc^{'}\equiv flag\mod n

flag又可以拆成

fnfn−1fn−2⋯f1f0f_nf_{n-1}f_{n-2}\cdots f_1f_0 flag=fl256l+fl−1256l−1+⋯+f12561+f02560flag=f_l256^{l}+f_{l-1}256^{l-1}+\cdots+f_1256^1+f_0256^0

这不就是个背包格问题吗?

我们要求的ff的值是ASCII码 满足

33<f<12533<f<125

我们直接令

x+79=fx+79=f

就得到了一个很小小量的xx的方程 这里xx满足

∣x∣<46|{x}|<46

带入上面已有的方程就是

c′≡∑i=0l(xi+79)256imod  nc^{'}\equiv\sum^{l}_{i=0}(x_i+79)256^{i}\mod n

简单移项

xl−1256l−1+xl−2256l−2+⋯+x12561+x02560≡c′−79∑i=0l−1256imod  nx_{l-1}256^{l-1}+x_{l-2}256^{l-2}+\cdots+x_1256^1+x_0256^0\equiv c^{'}-79\sum^{l-1}_{i=0}256^i\mod n

那就是

xl−1256l−1+xl−2256l−2+⋯+x12561+x02560=c′−79∑i=0l−1256i+knx_{l-1}256^{l-1}+x_{l-2}256^{l-2}+\cdots+x_1256^1+x_0256^0= c^{'}-79\sum^{l-1}_{i=0}256^i+k n

做换元

C=c′−79∑i=0l−1256iC=c^{'}-79\sum^{l-1}_{i=0}256^i

造格子

(x0,x1,⋯ ,xl−1,k,1)(10⋯00t⋅2560001⋯00t⋅25610⋮⋮⋱⋮⋮⋮⋮00⋯01t⋅256k−1000⋯00−t⋅C′000⋯00t⋅nR)=(x0,x1,⋯ ,xl−1,0,R)(x_0,x_1,\cdots,x_{l-1},k,1)\begin{pmatrix}1 & 0 & \cdots & 0 & 0 & t \cdot 256^0 &0\\ 0 & 1 & \cdots & 0 & 0 & t \cdot 256^1 &0\\ \vdots & \vdots & \ddots & \vdots & \vdots & \vdots&\vdots \\ 0 & 0 & \cdots & 0 & 1 & t \cdot 256^{k-1} &0\\ 0 & 0 & \cdots & 0 & 0 & -t \cdot C' &0\\ 0 & 0 & \cdots & 0 & 0 & t\cdot n&R\end{pmatrix}=(x_0,x_1,\cdots,x_{l-1},0,R)

这里格的大小是

det(M)=tRC′det(M)=tRC^{'}

取l+2l+2次根,这里的CC是200比特左右 需要我们的tt配大一点点 取22002^{200}先试试

调不出来 参考N0wayBack师傅的题解 造这样的格子效果更好

(x0,x1,⋯ ,xl−1,1,k)(10⋯000t⋅256001⋯000t⋅2561⋮⋮⋱⋮⋮⋮⋮00⋯010t⋅256k−100⋯001−t⋅C′00⋯000n⋅t)=(x0,x1,⋯ ,xl−1,1,0)(x_0,x_1,\cdots,x_{l-1},1,k)\begin{pmatrix}1 & 0 & \cdots & 0 & 0 &0 & t \cdot 256^0 \\ 0 & 1 & \cdots & 0 & 0 &0 & t \cdot 256^1\\ \vdots & \vdots & \ddots & \vdots & \vdots & \vdots&\vdots \\ 0 & 0 & \cdots & 0 & 1 &0 & t \cdot 256^{k-1} \\ 0 & 0 & \cdots & 0 & 0 &1& -t \cdot C' \\ 0 & 0 & \cdots & 0 & 0 &0& n\cdot t\end{pmatrix}=(x_0,x_1,\cdots,x_{l-1},1,0)

exp

后面也换了一下centerMark有点玄学的 建议是75~100之间多选点 师傅的88和我的79都能规约出来,这道题的tt参数配平倒是没那么重要

Theorem_Plus#

RSA问题 ee由函数decode_e给出,然后就是解一个相邻素数的RSA

先分析decode_e函数

首先计算e-1的阶乘mul

随后的判断式子e - mul % e - 1 == 0 用到了Wilson’s Theorem 本质是判断是否为素数

即式子

(p−1)!≡−1mod  p(p-1)!\equiv-1\mod p

当且仅当pp是素数时成立

如果ee是素数,那么就有

mulmod+e≡(e−1)!mod  emulmod+e\equiv(e-1)!\mod e

由Wilson’s Theorem 这里的mulmodmulmod是−1-1

如果ee是合数,假设存在分解

e=a⋅be=a\cdot b

那么在计算阶乘的时候,必有

mul=x⋅y⋅z⋯a⋅b⋯⋅(e−1)mul=x\cdot y\cdot z\cdots a\cdot b\cdots \cdot (e-1)

也就必定有

e∣mule|mul

此时的mulmodmulmod就是0

但是存在几个例外 如果ee为44

那么

mul=6mul=6 mulmod=2mulmod =2

综上对于式子decode_e(p)我们只需要计算小于等于pp的素数个数 对于所有的素数 mulmodmulmod自减1,对于除开44之外的合数 mulmodmulmod不变 尝试写个脚本跑一下?但是时间复杂度太高 有什么办法简化吗,考虑对这种大范围使用素数筛法即Sieve of Eratosthenes

exp

羊城杯2024
https://www.zt2misay2.cn/blog/%E7%BE%8A%E5%9F%8E%E6%9D%AF2024
Author Misay
Published at 2025年8月13日