羊城杯2024-TH_curve

开朗的网友 2024-10-31 16:11:38 25 0


题目实现了Twisted Hessian Curve上的点加法与标量乘法

参考Crypto CTF 2023 WriteUps | 廢文集中區 (maple3142.net)博客,即可实现从TH curve到Weierstrass型曲线的转换(主要分为曲线方程求解与曲线点映射两步)

然后就是朴素的ecdlp求解,同样利用小子群阶实施 PH+BSGS得到flag


from Crypto.Util.number import *
from sage.all import *

p = 10297529403524403127640670200603184608844065065952536889
a = 2
G = (8879931045098533901543131944615620692971716807984752065, 4106024239449946134453673742202491320614591684229547464)

Q = (6784278627340957151283066249316785477882888190582875173, 6078603759966354224428976716568980670702790051879661797)
sk = 126879961154507942934597133279713552400602
d = ZZ((a*G[0]**3 + G[1]**3 + 1)*inverse(G[0]*G[1], p) % p)

F = GF(p)
x, y, z = QQ["x,y,z"].gens()
eq = a*x ** 3 + y ** 3 + z ** 3 - d * x * y * z
phi = EllipticCurve_from_cubic(eq)
E = phi.codomain().change_ring(F)

fx, fy, fz = map(lambda f: f.change_ring(F), phi.defining_polynomials())
phiP = lambda x, y, z=1: E(fx(x, y, z) / fz(x, y, z), fy(x, y, z) / fz(x, y, z))
EG = phiP(G[0], G[1], 1)
EQ = phiP(Q[0], Q[1], 1)

order = EG.order()
subs = list(factor(order))
sks = list()
mods = list()
print(order, factor(order))
for sub, i in subs[:-1]:
    sub = sub**i
    A = order//sub * EG
    B = order//sub * EQ
    sk = discrete_log_lambda(B, A, (0, sub), operation="+")
    sks.append(sk)
    mods.append(sub)
    print(sub, sk)
sk = crt(sks, mods)
print(sk.nbits(), sk)
print(long_to_bytes(int(sk)))

分类:Crypto
image
作者:开朗的网友

5

提交

2

收入

相关WriteUP

  • 羊城杯2024-babycurve

    观察曲线的阶,存在一些小因子可以利用,因此使用PH+BSGS求出子群上的DLP,并爆破一些子群阶,即可得到key然后AES-CBC解密得到flag但是由于题目给出了曲线上的两个点,因此可以在GFp上解方程得到曲线参数观察曲线的阶,存在一些小因子可以利用,因此使用PH+BSGS求出子群上的DLP,并爆破一些子群阶,即可得到key然后AES-CBC解密得到flagfrom sage.all&...

    • Crypto
    • 21天前
  • 羊城杯2024-RSAloss

    给定n,c,通常情况下在无e情景中,应对明文做特殊限制,本题无其他信息,尝试在可见字符范围进行格规约,可转化为SVP问题,使用LLL算法求解即可。又不明确字符串长度,尝试爆破,然后手工选择一个具有语义的,发现为flagfrom Crypto.Util.number import *p = 898278915648707936019913202333...

    • Crypto
    • 21天前
  • 羊城杯2024-TheoremPlus

    decode是在求 ,分两类讨论,为素数时,威尔逊定理等于-1,不为素数时是0例外的当n=4,等于2因此转变思路求素数的个数接着n开方找近似p的下一个q就行,老套路了from Crypto.Util.number import *from gmpy2 import *from sage import&nbsp...

    • Crypto
    • 21天前
问题反馈