密钥生成
用户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便是它的一个逆元 因为 46 = 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)
1万+

被折叠的 条评论
为什么被折叠?



