题目描述:一道数学题
已知椭圆曲线加密Ep(a,b)参数为
p = 15424654874903
a = 16546484
b = 4548674875
G(6478678675,5636379357093)
私钥为
k = 546768
求公钥K(x,y)
1. 思路分析
这个没啥好说的,就是一道数学题,关键在于ECC算法的原理
想要了解更多关于ECC算法的情况,可以网上或者教科书上找更详细的资料(比如:椭圆曲线加密算法(ECC) - 知乎)
题目中 给出了私钥d和基点坐标G,因此这里求解公钥即可
2. 解题过程
OK,知道了ECC的原理,参考网上公式和代码([ECC]XCTF-easy_ECC(WP)_xctf easy_ecc__orangeP的博客-CSDN博客)
利用上面曲线点和点之间的加法公式,按照以下方法计算出公钥
- 将私钥k转换为二进制形式。
- 从低位到高位依次处理二进制位,若位为0,则将当前点加倍;若位为1,则将当前点加倍后再与基点相加。
- 最终得到的点即为公钥。
代码如下:
class point:
def __init__(self,x,y):
self.x=x
self.y=y
class ell:
def __init__(self,p,a,b):
self.p=p
self.a=a
self.b=b
def add(self,pA,pB):
if pA.x==pB.x and pA.y==pB.y:
k=mod((3*(pA.x*pA.x)+self.a),(2*pA.y),self.p)
else:
k=mod((pB.y-pA.y),(pB.x-pA.x),self.p)
rx=k*k-pA.x-pB.x
rx=rx%self.p
ry=k*(pA.x-rx)-pA.y
ry=ry%self.p
R = point(rx,ry)
return R
def ne(self,n,G):
s=str(bin(n)[::-1])
print(s)
sumG=None
addPoint = G
for i in range(len(s)):
if s[i]=='1':
if sumG is None:
sumG = addPoint
else:
sumG=self.add(sumG, addPoint)
addPoint = self.add(addPoint, addPoint)
return sumG
def mod(a,b,p):
#a/b mod p
if b<0:
b=-b
a=-a
return (a%p*pow(b,p-2,p))%p
p = 15424654874903
a = 16546484
b = 4548674875
ep = ell(p,a,b)
G = point(6478678675,5636379357093)
k = 546768
flag=ep.ne(k,G)
print(flag.x+flag.y)
最终算出flag为19477226185390
总结:这是一道数学题,计算出公钥只是顺便,更大的收获是了解了ECC的原理。