[指挥官一个小题] ECC

题目给了点P和2P,求参数a

from Crypto.Util.number import *
from gmpy2 import *
from random import *
from secrets import flag

assert len(flag)==42
p=getPrime(600)
a=bytes_to_long(flag)
b=randrange(2,p-1)
E=EllipticCurve(GF(p),[a,b]) #定义在a,b上模p的椭圆曲线
G=E.random_element()

x1,y1,_=G
G=2*G 
x2,y2,_=G

print(f"p = {p}")
print(f"b = {b}")
print(f"x1 = {x1}")
print(f"x2 = {x2}")
'''
p = 3660057339895840489386133099442699911046732928957592389841707990239494988668972633881890332850396642253648817739844121432749159024098337289268574006090698602263783482687565322890623
b = 1515231655397326550194746635613443276271228200149130229724363232017068662367771757907474495021697632810542820366098372870766155947779533427141016826904160784021630942035315049381147

x1 = 2157670468952062330453195482606118809236127827872293893648601570707609637499023981195730090033076249237356704253400517059411180554022652893726903447990650895219926989469443306189740
x2 = 1991876990606943816638852425122739062927245775025232944491452039354255349384430261036766896859410449488871048192397922549895939187691682643754284061389348874990018070631239671589727
'''

先是椭圆方程  y^{2} = x^{3} + a*x + b

2P也就是P Q相同的情况 k = (3*x^{2} + a)/(2*y) (mod p)

2P点的x坐标 x2 = k^{2} - x1 - x2 (mod p)

根据第3个公式可以先把k^2求出来,然后公式2两边平方代入k^2得到一个只有参数a的1元二次方程,然后解方程

#y**2 = x**3 + a*x + b 
#k = (3*x1**2+a) / (2*y1) = (3*x1**2+a) * inv((2*y1), p) (mod p)
#x3 = k**2 - x1 - x2 (mod p)

kk = (x2 + x1*2) %p   #求出k的平方,代入2式

R.<a> = PolynomialRing(GF(p))

poly = 4 * kk * (x1**3 + a* x1 +b) - (3*x1**2 + a)**2
poly.roots()
'''
sage: poly.roots()
[(918875439627055594259552478508551728381826199399685938622511660790511287097297184191298481453657480331998130281110691444641445094194011219176724349745237973925436007792522611119050,
  1),
 (56006392793430010663016642098239513811260175999551893260401436587175373756825079518464264729364083325,
  1)]


sage: bytes.fromhex(hex(56006392793430010663016642098239513811260175999551893260401436587175373756825079518464264729364083325)[2:])
b'flag{fa76cfb1-0052-4416-914d-91517bcebd52}'
'''

这题其实只用到公式运算与椭圆加密无关。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值