Misay's blog

Back

写在前面#

在从bw回汉的高铁上尝试了一下,题目知识点都比较熟悉,难度也很适中,成功AK了,不过还有很多值得细细琢磨的点,本文来尝试复现分析一下

math_problem#

自己的解法感觉应该是非预期了,有点难绷,先讲一下

nn由三个因子构成n=p  ⋅  q  ⋅  rn=p\;\cdot\;q\;\cdot\;r

它给了你

h1=r  ⋅  Rh_1=r\;\cdot\;R

当然这里的RR是把rr转字符串之后进行一个long_to_bytes的一个乘算,注意到这个函数是rr转大端序之后拼接每一位的十六进制得到的,也就是说h1h_1是随着rr递增的,那么本意可能是让我们去做一个二分来求出rr?的确可行 但是这里也给了nn,直接做一个gcd就可以了…总之都贴一下吧

OK,我们求出来了rr,这里当时尝试直接转化到模rr下的RSA,因为

r  ∣  nr\;|\;n

所以

c≡  me  mod  rc\equiv\;m^e\;mod\;r

我们已知对于素数rr,有

ϕr=r−1\phi_r=r-1

那么可以去计算

dr≡  e−1  mod  ϕrd_r\equiv\;e^{-1}\;mod\;\phi_r

可以计算出

m≡  cdr  mod  rm\equiv\;c^{d_r}\;mod\;r

恰好这里mm就小于rr,直接就解出来了,我们来试试如何按照出题人的预期用上这个h2h_2,为了叙述方便 我们用ss代替p  mod  2400p\;mod\;2^{400},我们有

h2≡  (3n+1)s  mod  n3h_2\equiv\;(3n+1)^s\;mod\;n^3

这里显然s>>3s>>3,我们考虑二项式定理展开,对3n3n超过3的项都会被模出0,整理不难得到

h2≡  1  +  s  ⋅  3n  +  s(s−1)2  ⋅  9n2  mod  n3h_2\equiv\;1\;+\;s\;\cdot\;3n\;+\;\frac{s(s-1)}{2}\;\cdot\;9n^2\;mod\;n^3

注意到这个方程我们只有ss不知道 而且ss最多400位,大概是n3n^3的112\frac{1}{12},我们可以考虑尝试解这个方程,直接来求ss

稍微整理一下就是

9n22s2+(3n−9n22)s+1−h2≡0  mod  n3\frac{9n^2}{2}s^2+(3n-\frac{9n^2}{2})s+1-h_2\equiv0\;mod\;n^3

但貌似这个的时间复杂度不好把握哈,但是呢我们发现还能往下来化

h2−1≡  s  ⋅  3n  +  s(s−1)2  ⋅  9n2    mod  n3h_2-1\equiv\;s\;\cdot\;3n\;+\;\frac{s(s-1)}{2}\;\cdot\;9n^2\;\;mod\;n^3

我们转化到模nn下进行

h2−1≡  0  mod  nh_2-1\equiv\;0\;mod\;n

得到这个之后,我们不妨设h2−1=knh_2-1=kn,在上述方程中对nn取除数,很容易就得到

h2−1n≡3s  mod  n\frac{h_2-1}{n}\equiv3s\;mod\;n

这样我们就解出来了ss,现在我们已知

s≡  p  mod  2400s\equiv\;p\;mod\;2^{400}

也就是pp的低400位,来发Copper,注意要换到模p∗qp*q的环下进行

exp

想法是好的 大火也更容易做出来 双赢()

EzECDSA#

kk相关的ECDSA签名问题,搜索神秘关键词related nonce可以找到一篇paper,贴一下

https://eprint.iacr.org/2023/305.pdf ↗

这里kk之间是一个二次非线性相关,定位到paper的关键部分,即

这里我们能把每个kik_i写成含未知数dd的一个线性方程,即

ki=hisi+risi  dk_i=\frac{h_i}{s_i}+\frac{r_i}{s_i}\;d kj=hjsj+rjsj  dk_j=\frac{h_j}{s_j}+\frac{r_j}{s_j}\;d

我们能消去dd,即有

kj=rjsirisjki+hjri−hirjrisjk_j=\frac{r_js_i}{r_is_j}k_i+\frac{h_jr_i-h_ir_j}{r_is_j}

paper利用了这里系数 aia_i 相对不变 好消去的关键

我们来尝试消去aia_i

即整理出关于若干组kijk_{ij}的方程

而kijk_{ij}又和dd直接相关,也就是整理出了关于dd的四次方程 直接解就OK,exp如下

RRRSSSAAA#

主要划分为两个部分

  • 参数准备

    我们生成512位的素数p      qp\;\;\;q 随后构建ϕ  =  (p4−1)(q4−1)\phi\;=\;(p^4-1)(q^4-1) ,接着是生成私钥dd的过程,满足

    d=ϕ−dsd=\phi-d_s

    而我们已知dsd_s的位数为1021位

  • 加密

    • 构建取模环RR

    • 构建多项式环PP

      P = PolynomialRing(R, 't')
      t = P.gen()
      python

      构建了一个系数定义在模NN环下,以tt为不定元的多项式环,即

      P=R[t]={a0+a1t+a2t2+⋯+aktk∣ai∈R}P = R[t] = \{a_0 + a_1 t + a_2 t^2 + \dots + a_k t^k \mid a_i \in R\}
    • 对多项式环PP取商Q=Ptn−rQ=\frac{P}{t^n-r}

      Q = P.quotient(t**n - r)
      python

      相当于在多项式环PP的域上,再有

      tn≡  r  mod  tn−rt^n\equiv\;r\;mod\;t^n-r

      把多项式环压缩到nn次幂之下

    • 把mm作为系数嵌入

      m_poly = Q([m, 0, 0, 0])
      python

      即

      m↦m+0t+0t2+0t3m \mapsto m + 0t + 0t^{2} + 0t^{3}
    • 指数运算

      c_poly = m_poly ** e
      
      py

      在商环QQ中把多项式mpolym_{poly}提升到ee次幂

      (m+0 t+0 t2+0 t3)e=∑k0+k1+k2+k3=e(ek0,k1,k2,k3)  mk0(0)k1(0)k2(0)k3  tk1+2k2+3k3.(m + 0\,t + 0\,t^2 + 0\,t^3)^e=\sum_{k_0+k_1+k_2+k_3=e}\binom{e}{k_0,k_1,k_2,k_3}\;m^{k_0}(0)^{k_1}(0)^{k_2}(0)^{k_3}\;t^{k_1+2k_2+3k_3}.
    • 运算结果

      最终lift出来的多项式就是mem^e

谔这里给了dsd_s的位数就直接连分数手法来解就ok,值得注意的是这里的乘法群的阶你可以考虑从NN提升到N4N^4来卡好这个边界关系即

d∼13N14d\sim\frac{1}{3}N^{\frac{1}{4}}

直接考虑连分数攻击eN4\frac{e}{N^4}来找dsd_s即可,随后直接用私钥解密,exp

类似的思路可以见DASCTF的EzMatrix

L3HCTF2025
https://www.zt2misay2.cn/blog/l3hctf2025
Author Misay
Published at 2025年7月14日