题目:(我注释后的)
解题思路:
已知量: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=(y12−x13−C)∗x1−1
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=(y22−x23−Ax2)
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=m1∗P2
求解出来的
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}