【RWCTF体验赛Writeup】babyCurve解题思路
题目分析

这段代码定义了一个使用有限域GF(p)上的椭圆曲线,其特征为p = 193387944202565886198256260591909756041。 还定义了在该椭圆曲线上的两点相加和标量乘法的运算,并使用这些运算执行AES加密并将密文写入文件。判断可以通过计算结果、密文和椭圆曲线求出x进而求出密文。
解题思路
根据题目可知的椭圆曲线y²=x*(x+1)²和flag.enc中的坐标点求出两点之间的距离和x的值,接着根据加密方法和密文解密
涉及知识点
奇异椭圆曲线密码学
解题方法
根据奇异椭圆曲线和给出的脚本、结果可以写出一个sage代码因式分解计算距离

然后根据给出的代码提示和上述计算写一个python脚本求出x的值并解密得到flag

sage代码:
p = 193387944202565886198256260591909756041
P.
f = x^3 + 2*x^2 +x
P = (4,10)
Q = (65639504587209705872811542111125696405, 125330437930804525313353306745824609665)
f_ = f.subs(x=x-1) # 将多项式 f 中的 x 替换为 x-1
print(f_.factor()) # f_因式分解,193387944202565886198256260591909756040
P_ = (P[0] +1, P[1]) # (5,10)
Q_ = (Q[0] +1, Q[1]) # (65639504587209705872811542111125696406, 125330437930804525313353306745824609665)
t = GF(p)(193387944202565886198256260591909756040).square_root() #计算GF(p)的平方根t
u = (P_[1] + tP_[0])/(P_[1] - tP_[0]) % p
v = (Q_[1] + tQ_[0])/(Q_[1] - tQ_[0]) % p
print(v.log(u)) # 计算 v 的对 u 取对数,这样就可以得到奇异椭圆曲线两点之间的距离了
python代码:
from random import randrange
from Crypto.Cipher import AES
c = 4470735776084208177429085432176719338
p = 193387944202565886198256260591909756041
x = p*3//4+c
print(x)
cipher_hex = 'b3669dc657cef9dc17db4de5287cd1a1e8a48184ed9746f4c52d3b9f8186ec046d6fb1b8ed1b45111c35b546204b68e0'
aes = AES.new(x.to_bytes(16, 'big'), AES.MODE_CBC, bytes(16))
flag = aes.decrypt(bytes.fromhex(cipher_hex)).decode().strip()
print(flag)