Misay's blog

Back

期末周看了看题 把签到的分辨器和ntt给梭出来 本文主要基于rec师傅的博客 ↗ 来进行对zkpuzzle的一个复现

zkpuzzle1#

分为两个部分 首先需要选择两个256bits的素数p1  p2p_1\;p_2 构建一个曲线系统 随后给出两个128bits的随机素数r    kr\;\;k 需要我们找到四个小于200bits的数wiw_i,能够

∑i=14wi3=r×k3mod  p1⋅p2\sum_{i=1}^{4}w_i^{3}=r\times k^3 \mod p_1 \cdot p_2

我们首先看这里构造系统的过程中 存在

def myrand(self, E1, E2):
    F = Zmod(E1.order())    
    r = F.random_element()	# r 属于标量域 (Scalar Field),大小为 E1 的阶
    P = r * E2.gens()[0]    # P 是 E2 上的点
    x = P.x()               # x 属于基域 (Base Field),大小为 p2
    return int(r * x) & (2**128 - 1)  # 类型错误
py

rr是E1E_1环上的元素 但是xx是GF(p2)GF(p_2)上的域内元素 运行不报错的唯一方法是找出p1    p2p_1\;\;p_2 满足

E1.p=E2.order()E_1.p=E_2.order() E2.p=E1.order()E_2.p=E_1.order()

当然我们也可以令p1==p2p_1==p_2那么只需要满足

E.p==E.order()E.p==E.order()

所以我们第一步的操作是

寻找一个素数pp 使得曲线E:y2≡x3+137mod  pE:y^2\equiv x^3+137\mod p满足E.order()==pE.order()==p

rec师傅使用了一个 Complex Multiplication的方法

随机选取一个大奇数yy 在本题的曲线结构中 可以通过寻找验证特殊的代数结构来找出pp 代码如下

在找到这个pp之后 我们进入到下一步

此时我们的验证

proofsystem.verify(proofsystem.E1, r, k, w) and proofsystem.verify(proofsystem.E2, r, k, w)
py

本质等于一个对EE的验证 而EE又是奇异的 转移到阶的算法上 那么得到

∑i=14wi3=r×k3mod  p\sum_{i=1}^{4}w_i^{3}=r\times k^3 \mod p

而我们有一个恒等式

(u+w)3+(u−v)3+(−u+w)3+(−u−w)3=6u(v−w)(v+w)(u+w)^3+(u-v)^3+(-u+w)^3+(-u-w)^3=6u(v-w)(v+w)

那么我们要找到

∑i=14wi3=r×k3+t×p\sum_{i=1}^{4}w_i^{3}=r\times k^3 + t\times p

tt是我们随便取的 r  k  pr\;k\;p也已知 我们接下来尝试把等式右边联系起来 用上恒等式去解题 我们这里的核心思路是去寻找特定的tt 使得我们的

S=r×k3+t×pS = r\times k^3 + t\times p

能形如

6u(v−w)(v+w)6u(v-w)(v+w)

我们算一下r×k3r\times k^3是512bits 而pp是256bits左右 那么在我们穷举的过程中 我们的SS最好满足以下特征

  • 6  ∣  S6 \;|\; S

  • 在此之上 我们有s=S6=u(v2−w2)s=\frac{S}{6}=u(v^2-w^2)

    • 我们人为再令v−w=1v-w=1,问题进一步简化成s=u(2×w+1)s=u(2\times w+1),也就是s=u×xs=u\times x ;xx视为某个奇数
      • 故而 我们对ss去用22试除 肯定能除掉 那么能除掉的部分我们给uu 我们的期望是
        • u∈(1,260)u\in(1,2^{60});x∈(1,261)x\in(1,2^{61}) 一旦能进入这个范围的分解 我们就直接得到u  v  wu\;v\;w 完成分解 发送通过此轮

然后就是分解的思路了 还是从rec师傅的分解手法这里学到很多 特别是factor的一种高效好用的写法

思路就很简单 每次都找我们的target 直接分解 取光滑的情况 然后找到一组合适的解就行

zkpuzzle2#

等式没变 但是做出了如下限制

  • p1≠p2p_1\ne p_2
  • ROUND = ROUND - bin(p1).count("1") - bin(p2).count("1")

同时要考虑p和order之间的限制关系 依旧需要构造类似的2-cycle的椭圆曲线

对于j=0j=0的CM曲线 它的阶满足

#E=p+1−t\#E=p+1-t

trace满足

4p=t2+3y24p=t^2+3y^2

我们有如下方程

{p1+1−t1=p2p2+1−t2=p1\begin{cases}p_1+1-t_1 = p_2\\p_2+1- t_2 = p_1\end{cases}

低汉明权重和2-Cycle曲线处理中的对数据的要求 让我们联想到NTT友好的素数 形如

p=c×2k+1p=c\times 2^k + 1

当cc足够小 汉明重量就会比较小 这里找到是一组

p   = 0b1100000000110000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000110000000000010000100000010000000000000000000000100000100000000000000000001000001000010000000000001100000000001000000000000000000000000001
q   = 0b1100000000110000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000110000000110010000101100010000000000000000000000100000100000000000000000000100000100010000000000001100000000000100000110000000000000000001
py

接下来我们要求解zkp

{∑i=14wi3=r×k3mod  p∑i=14wi3=r×k3mod  q\begin{cases}\sum_{i=1}^{4}w_i^{3}=r\times k^3 \mod p\\\sum_{i=1}^{4}w_i^{3}=r\times k^3 \mod q\end{cases}

考虑等式

{(u+tp)3+(−u)3≡0mod  p(u+tp)3+(−u)3≡tp⋅(3u2+3up+(tp)2)mod  q\begin{cases}(u+tp)^3+(-u)^3\equiv0\mod p\\(u+tp)^3+(-u)^3\equiv tp\cdot(3u^2+3up+(tp)^2)\mod q\end{cases} {(v+tq)3+(−v)3≡0mod  q(v+tq)3+(−v)3≡tq⋅(3v2+3vq+(tq)2)mod  p\begin{cases}(v+tq)^3+(-v)^3\equiv0\mod q\\(v+tq)^3+(-v)^3\equiv tq\cdot(3v^2+3vq+(tq)^2)\mod p\end{cases}

取t=1t=1

因为我们的检查是分别在mod  p\mod p mod  q\mod q下进行的 而我们期望的四个数就是

(u+p)    (−u)    (v+q)    (−v)(u+p)\;\;(-u)\;\;(v+q)\;\;(-v)

这样只用解二次同余方程组求出v  uv\;u 实现zkp 非常快

zkpuzzle3#

限制和zkpuzzle2一样 关键在于

  • 90s限时 基本0.1s不到就需跑完一轮
  • 我们的zkp改为∑i=14wi3=r\sum_{i=1}^{4}w^3_i=r,因为明显r<p    r<qr<p\;\;r<q而且rr是不变量

我们借用zkp2的思路

[(u+x)3+(−x)3]+[(v+y)3+(−y)3]=r[(u+x)^3+(-x)^3]+[(v+y)^3+(-y)^3]=r (3ux2+3u2x+x3)+(3vy2+3v2y+y3)=r(3ux^2+3u^2x+x^3)+(3vy^2+3v^2y+y^3)=r 3u(x2+ux)+3v(y2+vy)=r−u3−u33u(x^2+ux)+3v(y^2+vy)=r-u^3-u^3

往完全平方转化

3u(4x2+4ux)+3v(4y2+4vy)=4(r−u3−v3)3u(4x^2+4ux)+3v(4y^2+4vy)=4(r-u^3-v^3)

那么

3u((2x+u)2−u2)+3v((2y+v)2−v2)=4(r−u3−v3)3u((2x+u)^2-u^2)+3v((2y+v)^2-v^2)=4(r-u^3-v^3)

移项

3u(2x+u)2+3v(2y+v)2=4r−u3−v33u(2x+u)^2+3v(2y+v)^2=4r-u^3-v^3

我们可以取u    vu\;\;v是很简单的小数 取尝试求解x    yx\;\;y 本质是求

uA2+vB2=S3uA^2+vB^2=\frac{S}{3}

可以使用sagemath的BinaryQF(u, 0, v).solve_integer(t) 方法

0CTF2025
https://www.zt2misay2.cn/blog/0ctf2025
Author Misay
Published at 2026年1月19日