Misay's blog

Back

赛题Repo ↗

初赛难度比较适中,质量也不错,来给进行一个复现

Bivariate copper#

那麼問題來了,什麼是copper? So the question is, what is copper?

chall.py

前半部分可以直接爆破pp得到messagemessage

然后分析第二部分 我们定义了

t1≡k×(m+r1)−1≡leak1×2244+xmod  pt_1\equiv k\times(m+r_1)^{-1}\equiv leak_1\times2^{244}+x\mod p t2≡k×(m+r2)−1≡leak2×2244+ymod  pt_2\equiv k\times(m+r_2)^{-1}\equiv leak_2\times2^{244}+y\mod p

我们已知leak1    leak2    r1    r2    pleak_1\;\;leak_2\;\;r_1\;\;r_2\;\;p,x    yx\;\;y是244bits内的小量 结合题干不难想到二元Copper 我们给mm消去 不难得到

m≡(leak1×2244+x)×k−1−r1≡(leak2×2244+y)×k−1−r2mod  pm\equiv(leak_1\times2^{244}+x)\times k^{-1} -r_1\equiv (leak_2\times2^{244}+y)\times k^{-1} -r_2\mod p

做差就可以得到一个含两个变元的小根方程

((leak1−leak2)×2244+x−y)×k−1−(r1−r2)≡0mod  p((leak_1-leak_2)\times2^{244}+x-y)\times k^{-1}-(r_1-r_2)\equiv 0\mod p

x    yx\;\;y都是244bits以内 而pp为1024bits的 ,存在244<10244244\lt\frac{1024}{4},可解

打一发二元Copper

ComCompleXX#

我最近開始迷上數學了,但這題看起來真的很複複複雜,你能幫我嗎? I’ve recently become obsessed with math, but this problem seems really comcomplexx. Can you help me?

task.py

四元数RSA问题

注意到给的dd的bits为500 而nn为1024bits ee的位数为3069 非常诡异的大 我们尝试打连分数 但是不去分解nn 能够神奇的解决

exp.sage

验证后这个dd的确是题目给我们的 但是kk并不能用来分解我们的nn

我们来从出题人的视角看看这些e    d    p    qe\;\;d\;\;p\;\;q是怎么生成的

首先随机生成两个512位的素数p    qp\;\;q

在四元数系统下一定有群的阶ϕ\phi满足 (p−1)(q−1)∣ϕ(p-1)(q-1)|\phi

生成一个数e0e_0 计算d0≡e0−1mod  ϕd_0\equiv e_0^{-1}\mod \phi

随后保证连分数的命中性质 要有

∣en−kd∣<<12d2|\frac{e}{n}-\frac{k}{d}|\lt\lt\frac{1}{2d^2}

整理得到

∣ed−nk∣<n2d|ed-nk|\lt\frac{n}{2d}

本题实际做到的是

∣ed−nk∣=1|ed-nk|=1

随后根据e=e0+kϕe=e_0+k\phi

生成这个大的诡异的ee

主要是确实验证了

assert abs(e*d-k*n) == 1
py

事已至此就先这样吧 还没看出这个题和四元数有什么关系( 或许是构造了一个整除阶的群?

cruel-rsa#

task.py

很明显的Common-prime-rsa 给出了dd的泄露

我们参考改进的pollard-rho算法 可以发现N具备比较好的光滑性 我们慢慢剥离 大概到1609668743算法就开始吃力了

同时可以确定这里的nn确实过于光滑

然后似乎n−1n-1也可以被查到分解 那还说啥呢

然后利用p  qp\;q的位数以及合数关系 可以筛选出我们的p  qp\;q加上gg已知 我们可以求出a  b  g  p  qa\;b\;g\;p\;q

求出LL再求出dd 结果因为这里的dd是在模LL下生成 但是

L=2gab    ;    ϕ(n)≠4g2abL=2gab\;\;;\;\;\phi(n) \not=4g^2ab

所以说你求出了dd也是没法解密的,,,

但是可以打CRT直接解方程me≡cmod  nm^e\equiv c\mod n,毕竟有nn的分解 那么我们求dd意义何在,,,

exp

EC-FUN#

密碼學很簡單!祝你玩得開心! Crypto is so EC! May you have fun!

ECC问题 给定了两个函数原型have 与fun 前者为曲线上的一种点加 后者为一种倍乘(LLM直接看出来了,或者根据这里的传参个数也能大致猜测)

这里调用函数have_fun相当于计算

y=g1+g2×keyy=g_1+g_2\times key

所以说我们接下来分析这个椭圆曲线群的性质,尝试由已知的点加 倍乘 3个曲线上的点来去恢复曲线方程

给出一种方法 也就是对于这种Twisted-Curved的通用处理手法

把曲线设成

c0y2+c1xy+c2y+c3x3+c4x2+c5x+c6≡0c_0y^2+c_1xy+c_2y+c_3x^3+c_4x^2+c_5x+c_6\equiv0

的广义形式(或者还可以更复杂) 然后利用have和fun以及基点做出一系列点来 进行插值求出系数c0∼c6c_0\sim c_6

然后去往我们的标准形式去做变换 进行简单的逆元乘法即可

y2+a1xy+a3y≡x3+a2x2+a4x+a6y^2+a_1xy+a_3y\equiv x^3+a_2x^2+a_4x+a_6

这里因为我们直接设的就是广义形式 所以说简单的代数变换就可以 当然也可以考虑2024羊城杯的手法,先

x→XZx\rightarrow\frac{X}{Z} y→YZy\rightarrow\frac{Y}{Z}

得到一个关于X  Y  ZX\;Y\;Z的多项式方程,再调用EllipticCurve_from_cubic方法也可以得到标准的曲线 然后就是正常的曲线DLP 当然这里涉及的都是常见的Twisted-Curve 所以说我们能成功求解

exp

LossN#

沒有那個n,我照樣可以解出flag。 Even without that n, I can still solve the flag.

loss.py

利用式子

ed≡1mod  ϕed\equiv1\mod \phi

展开

ed−1=k(p−1)×(p−1+r)ed-1=k(p-1)\times(p-1+r)

我们注意到

(p−1)(p−1+r)≈(p−1)2(p-1)(p-1+r)\approx(p-1)^2

而kk的大小不会超过ee 爆搜就行

exp

TryE#

e這麼大…何意味? E is so big… what does it mean?

dd太小 直接wiener,打连分数肯定可以 但是这个bound用boner-durfee是最稳的(

依旧板子

连分数也行 这里做了个小优化

LWECC#

Easy ECC…and LWE maybe

给定椭圆曲线EE 给随机向量s73×1s_{73\times1},二点分布e2×1e_{2\times1} 随机矩阵A137×73A_{137\times73}

去计算

b137×1=A137×73×s73×1+e137×1b_{137\times1}=A_{137\times73}\times s_{73\times1}+e_{137\times1}

这里给我们的椭圆曲线的阶满足

E.order()==p
py

所以说曲线上的阶乘可以非常轻松的通过Smart-Attack转换为点加来解决,我们重点关心这个sample-LWE问题

经过一番Osint HITCON2025BabyLWE和这个很像 贴一下repo ↗

从WMCTF2025做过来 我们的LWE经历了ee很小,ee不小但是已知抽样来源,ee不小而且不知道抽样来源

对于LWE问题

b=A×s+eb=A\times s+e

我们知道如果ee不是很小,可以通过格基归约 找到一组存在线性关系的小e0e_0,即

e0=e×m+ne_0=e\times m+n

通过格子不难找到m  nm\;n

此时对方程进行一个处理 得到

b×m+n=m⋅A×s+e0b\times m+n=m\cdot A\times s+e_0

也就是

B=(mA)×s+e0B=(mA)\times s+e_0

再考虑primal-attack的优化等等

那如果我们不知道ee就没法了吗

我们看优化后的式子 能得到

e0≡(b×m+n)−(mA)×se_0\equiv(b\times m+n)-(mA)\times s

方便起见 我们设

x≡−msx\equiv-ms

得到

e0≡m⋅b+n⋅1+A×xe_0\equiv m\cdot b+n\cdot 1+ A\times x

为了方便我们分析我们给矩阵转置

e0T=xTA+mbT+nI+pk\boldsymbol{e_0^T}=\boldsymbol{x^T}\boldsymbol{A}+m\boldsymbol{b^T}+n\boldsymbol{I}+p\boldsymbol{k}

可以构造算式

(xTmnk)1×212×(ATbT1pI)212×137=(e0T)1×137\begin{pmatrix}\boldsymbol{x^T}&m&n&\boldsymbol{k}\end{pmatrix}_{1\times212}\times\begin{pmatrix}\boldsymbol{A^T}\\\boldsymbol{b^T}\\\boldsymbol{1}\\p\boldsymbol{I}\end{pmatrix}_{212\times137}=\begin{pmatrix}\boldsymbol{e_0^T}\end{pmatrix}_{1\times137}

令

(ATbT1pI)212×137=M\begin{pmatrix}\boldsymbol{A^T}\\\boldsymbol{b^T}\\\boldsymbol{1}\\p\boldsymbol{I}\end{pmatrix}_{212\times137}=\boldsymbol{M}

你对M\boldsymbol{M}做规约 可以在前面几行找到小的向量分布 那不就找出了e0T\boldsymbol{e_0^T}吗

但是我们还要想一个办法来还原回去 这里有一个非常巧妙的手法 注意我们矩阵算法本质是线性组合 我们如果给M\boldsymbol{M}补充成增广矩阵 也就是

L=[c×I212×212    ∣    M212×137]212×349\boldsymbol{L}=[c\times\boldsymbol{I}_{212\times212}\;\;|\;\;\boldsymbol{M}_{212\times137}]_{212\times349}

我们对LL进行规约 可以得到

(cxTcmcncke0T)1×319\begin{pmatrix}c\boldsymbol{x^T}&cm&cn&c\boldsymbol{k}&\boldsymbol{e_0^T}\end{pmatrix}_{1\times319}

不就直接给m  nm\;n做出来了吗?随后还原我们的e≡m−1(e0−n)\boldsymbol{e}\equiv m^{-1}(\boldsymbol{e_0}-\boldsymbol{n})

求出ee 直接得到As=b−eAs=b-e 解方程得到我们的ss 拿下

呃呃,但是还缺一些优化 而且这个实际上也就是primal-attack的思路 先用 鸡块师傅的板子 ↗给求下

exp

至此 复现结束

HKCERT2025Quals
https://www.zt2misay2.cn/blog/hkcert2025quals
Author Misay
Published at 2026年1月7日