羊城杯2024-babycurve

开朗的网友 2024-10-31 16:10:46 19 0


观察曲线的阶,存在一些小因子可以利用,因此使用PH+BSGS求出子群上的DLP,并爆破一些子群阶,即可得到key

然后AES-CBC解密得到flag

但是由于题目给出了曲线上的两个点,因此可以在GFp上解方程得到曲线参数

观察曲线的阶,存在一些小因子可以利用,因此使用PH+BSGS求出子群上的DLP,并爆破一些子群阶,即可得到key

然后AES-CBC解密得到flag


from sage.all import *
from Crypto.Util.number import *
from Crypto.Cipher import AES
import hashlib

G = (584273268656071313022845392380, 105970580903682721429154563816)
P = (401055814681171318348566474726, 293186309252428491012795616690)
data = {'iv': 'bae1b42f174443d009c8d3a1576f07d6', 'cipher': 'ff34da7a65854ed75342fd4ad178bf577bd622df9850a24fd63e1da557b4b8a4'}
p = 770311352827455849356512448287

R = PolynomialRing(GF(p), 'x,y')
x, y = R.gens()
B = Ideal([
    G[1]**2 - G[0]**3 - x*G[0] - y,
    P[1]**2 - P[0]**3 - x*P[0] - y
]).groebner_basis()
a = ZZ(-B[0].univariate_polynomial()(0))
b = ZZ(-B[1].univariate_polynomial()(0))
E = EllipticCurve(GF(p), [a, b])
G, P = E(G), E(P)

order = G.order()
subs = [2**5, 7, 1135963, 1249861]
sks = list()
for sub in subs:
    sk = discrete_log_lambda(order//sub * P, order//sub * G, (0, sub), operation='+')
    sks.append(sk)
    print(sub, sk)
sk = crt(sks, subs)
while True:
    if sk*G == P:
        print(sk)
        iv, ct = [bytes.fromhex(_) for _ in [data["iv"], data["cipher"]]]
        key = hashlib.sha256(str(sk).encode()).digest()[:16]
        cipher = AES.new(key, AES.MODE_CBC, iv)
        flag = cipher.decrypt(ct)
        print(flag)
        break
    sk += prod(subs)


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

5

提交

2

收入

相关WriteUP

  • 羊城杯2024-TH_curve

    题目实现了TwistedHessianCurve上的点加法与标量乘法参考CryptoCTF2023WriteUps|廢文集中區(maple3142.net)博客,即可实现从THcurve到Weierstrass型曲线的转换(主要分为曲线方程求解与曲线点映射两步)然后就是朴素的ecdlp求解,同样利用小子群阶实施PH+BSGS得到flagfrom Crypto.Util.number&nb...

    • 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天前
问题反馈