攻防世界-Crypto-easy_ECC

题目描述:一道数学题

已知椭圆曲线加密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博客

利用上面曲线点和点之间的加法公式,按照以下方法计算出公钥

  1. 将私钥k转换为二进制形式。
  2. 从低位到高位依次处理二进制位,若位为0,则将当前点加倍;若位为1,则将当前点加倍后再与基点相加。
  3. 最终得到的点即为公钥。

代码如下:


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的原理。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值