为了学习一下ECC加密,练习了unctf2019的一道题目,不算难但是可以很好的学习一下ECC加密的流程,题目主要是AES+ECC,但是重点还是ECC的加密。
下载文件后我们得到一个ecc.sage
E=EllipticCurve(GF(15424654874903),[16546484,4548674875])
G=E(6478678675, 5636379357093)
k=???????
K=k*G
#K=(2854873820564,9226233541419)
aes_key=???????
x=aes_key
M=E.lift_x(x)
r=?????????
C1=M+r*K
x1,y1=C1.xy()
C2=r*G
x2,y2=C2.xy()
print 'C1(%d,%d),C2(%d,%d)'%(x1,y1,x2,y2)
#output:
C1(6860981508506,1381088636252),C2(1935961385155,8353060610242)
这里可以参考ctfwiki上面的ecc代码进行爆破,但是注意一个点:
我们要求解出M,由C1-(C2k)=M+rK-rGk=M(G*k=K)
参考代码如下
E=EllipticCurve(GF(15424654874903),[16546484,4548674875])
G=E(6478678675, 5636379357093)
c1 = E([6860981508506,1381088636252])
c2 = E([1935961385155,8353060610242])
X = G
for i in range(1, 40000000):
if X == pub:
secret = i
print "[+] secret:", i
break
else:
X = X + G
print i
m = c1 - (c2 * secret)
print "[+] x:", m[0]
print "[+] y:", m[1]
print "[+] x+y:", m[0] + m[1]
结果
这里的secret就是k,x也就是aes_key,将其带入aes的程序代码就可以求出答案。