密码算法之ECC初探

密钥生成

用户A先选择一条椭圆曲线Eq(a,b),然后选择其上的一个生成元G,假设其阶为n,之后再选择一个正整数Na作为密钥,计算Pa=Na*G。其中Eq(a,b),q,G都会被公开。公钥为Pa。私钥为Na。

加密

用户B在向用户A发送消息m,这里假设消息m已经被编码为椭圆曲线上的点,其加密步骤如下:
1,查询用户A的公钥Eq(a,b),q,Pa,G。
2,在(1,q-1) 的区间内选择随机数k 。
3,根据A的公钥计算点(x1,y1)=kG。
4,计算点(x2,y2)=kPa。
5,如果为O,则从第二步重新开始。计算C=m+(x2,y2)
6,将((x1,y1),C)((x1,y1),C) 发送给A。

解密

解密步骤如下:
1,利用私钥计算点na(x1,y1)=nakG=kPa=(x2,y2)na(x1,y1)。
2,计算消息m=C−(x2,y2)。

注:

1,椭圆曲线中计算G = P + Q
P(x1,y1)
Q(x2,y2)
对于 (y2)= {(x3) + a*x + b}(mod q)

G(x3,y3)
其中 x3 ={(m2)-x1-x2}(mod q)
y3 ={m(x1-x3)-y1}(mod q)
其中 m = (y2-y1)[(x2-x1)(-1)]mod q #P != Q
m = (3*(x12)+a)[(2y1)(-1)]mod q # P=Q
其中 x-1 为x模q的逆元
例如 q = 23, x = 4 那么 6便是它的一个逆元 因为 4
6 = 24 =1mod2。

以下为xctf上一道例题:

已知椭圆曲线加密Ep(a,b)参数为:
p = 15424654874903
a = 16546484
b = 4548674875
G(6478678675,5636379357093)
私钥为k = 546768
求公钥K(x,y)
这里知道原理后编写脚本求取公钥:

Gx = 6478678675 
Gy = 5636379357093 
a = 16546484 
b = 4548674875 
p = 15424654874903 
k = 546768 
x = Gx 
y = Gy
def power(x,y,mod): 
    r = 1 
    while( y ): 
        if y & 1: 
            r = (r * x) % mod 
        x = (x * x) % mod 
        y >>= 1 
    return r 
for i in range(k-1):
    if (x==Gx) and (y == Gy):
        m = (((3*Gx*Gx)+a)*power(2*Gy,p-2,p))%p
    else:
        m = ((y-Gy)*power(x-Gx,p-2,p))%p
    xr = (m*m-Gx-x)%p 
    yr = (m*(x-xr)-y)%p
    x = xr
    y = yr
print(xr,yr,x+y)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值