巅峰极客tryecc

题目:(我注释后的)

在这里插入图片描述
在这里插入图片描述

解题思路:

在这里插入图片描述

已知量:N,C, P1 , P2 , P3 , P4
未知量:A,B

通过有限域上的椭圆曲线方程: P 1 ( x 1 , y 1 ) P1(x_1,y_1) P1(x1,y1), P 2 ( x 2 , y 2 ) P2(x_2,y_2) P2(x2,y2)
E1: y 1 2 = x 1 3 + A x 1 + C y_1^2=x_1^3+Ax_1+C y12=x13+Ax1+C m o d mod mod N N N
E2: y 2 2 = x 2 3 + A x 2 + B y_2^2=x_2^3+Ax_2+B y22=x23+Ax2+B m o d mod mod N N N

可以解出:未知量(A和B)
A = ( y 1 2 − x 1 3 − C ) ∗ x 1 − 1 A=(y_1^2-x_1^3-C)*x_1^{-1} A=(y12x13C)x11 m o d mod mod N N N
B = ( y 2 2 − x 2 3 − A x 2 ) B=(y_2^2-x_2^3-Ax_2) B=(y22x23Ax2) m o d mod mod N N N

#sagemath

N=598756982846857855564861803797067906933452532971372536192231
p= 773793889124783574343562335367
q=773793889124783574343613279393
C= 4480960863875584511148612202888184984874434295853921
p1=(40868726519566019162794925971370501749760105301423309229554,54687980868371628310908123178978977864897123871328723)
p2=(235149117685317066108245267690004572936544028030457002179126,1289371238921298371232163781261298731812137628190)
p3=(230807308713660443214609900462802224133677339138938919914236,15979270783196203822523802015845150885928738960540101206481)
p4=(48539794908526618490272854315619275063139157075919926757183,253317587580758121061061480314672531383057603048054780326781)

def cal_AB(N,C,p1,p2):
    x1,y1=p1
    x2,y2=p2
    A=Mod(inverse_mod(x1,N)*(power_mod(y1,2,N)-power_mod(x1,3,N)-C),N)
    B=Mod(power_mod(y2,2,N)-power_mod(x2,3,N)-A*x2,N)
    return A,B

A,B=cal_AB(N,C,p1,p2)
print(A)
print(B)

在这里插入图片描述

得到椭圆曲线方程 E 2 E2 E2 后,我们就能解离散对数了。

在这里插入图片描述

SageMath求离散对数的函数

求解以base为底,a的对数;ord为base的阶,可以缺省,operation可以是’+‘与’’,默认为’’;

x=discrete_log(a,base,ord,operation)

这里直接解离散对数是解不出来的,因为模N不是素数,N可以分解为p,q。

所以椭圆曲线 E2:方程可以写为:
y 2 2 = x 2 3 + A x 2 + B y_2^2=x_2^3+Ax_2+B y22=x23+Ax2+B m o d mod mod p p p
y 2 2 = x 2 3 + A x 2 + B y_2^2=x_2^3+Ax_2+B y22=x23+Ax2+B m o d mod mod q q q

在椭圆曲线 E p ( P 2 ) Ep(P2) Ep(P2) E q ( P 2 ) Eq(P2) Eq(P2) 上解离散对数 P 3 = m 1 ∗ P 2 P3 = m1 * P2 P3=m1P2

求解出来的 m 1 m1 m1 并不是真正的 m 1 m1 m1 ,因为分解后的椭圆曲线E2的阶已经改变了。所以这里求出的结果应该是 m1 mod order(Ep(P2)) 后的值。
即: S 1 = m 1 S_1=m_1 S1=m1 m o d mod mod o r d e r ( E p ( P 2 ) ) order(E_p(P_2)) order(Ep(P2))
S 2 = m 1 S_2=m_1 S2=m1 m o d mod mod o r d e r ( E q ( P 2 ) ) order(E_q(P_2)) order(Eq(P2))

通过 中国剩余定理 CRT,即可求出 m 1 m_1 m1的值。

N=598756982846857855564861803797067906933452532971372536192231
p=773793889124783574343562335367
q=773793889124783574343613279393
C= 4480960863875584511148612202888184984874434295853921
p1=(40868726519566019162794925971370501749760105301423309229554,54687980868371628310908123178978977864897123871328723)
p2=(235149117685317066108245267690004572936544028030457002179126,1289371238921298371232163781261298731812137628190)
p3=(230807308713660443214609900462802224133677339138938919914236,15979270783196203822523802015845150885928738960540101206481)
p4=(48539794908526618490272854315619275063139157075919926757183,253317587580758121061061480314672531383057603048054780326781)

def cal_AB(N,C,p1,p2):
    x1,y1=p1
    x2,y2=p2
    A=Mod(inverse_mod(x1,N)*(power_mod(y1,2,N)-power_mod(x1,3,N)-C),N)
    B=Mod(power_mod(y2,2,N)-power_mod(x2,3,N)-A*x2,N)
    return A,B

def dis_log(point,base):
    xp=discrete_log(Ep(point),Ep(base),operation='+')
    xq=discrete_log(Eq(point),Eq(base),operation='+')
    return crt([ZZ(xp),ZZ(xq)],[ZZ(Ep(base).order()),ZZ(Eq(base).order())])

A,B=cal_AB(N,C,p1,p2)

Ep=EllipticCurve(GF(p),[A,B])
Eq=EllipticCurve(GF(q),[A,B])

m1=dis_log(p3,p2)
m2=dis_log(p4,p2)
print(m1)
print(m2)

计算结果:

2284117282071517337695539263116473400231933029
2279138200969492446729933799621044844636616829

flag{de7a89ab1d074ef3930fb3054c0e3ac8}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值