[资料名称]: 椭圆曲线加密算法-Python实现
[资料作者]: CCkuyota
[资料日期]: 2021/04/11
[资料格式]: txt
ECC.txt
[资料简介]:
基于椭圆曲线的ElGamal公钥体制实现
步骤如下:1. 椭圆曲线生成:设E: y2=x3+ax+b(mod p)是GF(p)上的一个椭圆曲线(p>3),首先需要构造一个群Ep(a, b)。实现方法如下:
对x在GF(p)上的每一个取值,计算对应的x3+ax+b(mod p),如果对应的结果有一个模p的平方根y,则对应有点(x,y)和(x,p-y)均在Ep(a,b)上;否则,对应的x没有相应的点在Ep(a,b)上。找全所有的点x即可生成椭圆曲线Ep(a,b)的所有点,形成散列图。
2. 挑选生成元:挑选的生成元G = (x0, y0)满足nG = O成立时,最小的n是一个大素数。
3. 选择公私钥:选择整数key<n作为私钥,然后产生公钥KEY = key*G,发送方公钥为(E, n, G, KEY),私钥为key。
4. 发送方将明文m嵌入到椭圆曲线E上的KEY。发送方选择一个数r(0<r<p), r保密rG 公开,欲向B发送明文m可送去下面一对数(rG, KEY+r(key*G)),key是A的私钥,r是随机产生的整数。B可以从rG求key*rG,通过KEY+r(key*G)-key(rG)恢复KEY,然后再恢复明文m。
算法编程实现中,椭圆曲线生成函数为get_param(x0, a, b, p),对于每一个x,判断i**2%p == (x0**3 + a*x0 + b)%p是否成立,如果成立,则说明这个x没有对应的椭圆曲线点。反之获得(x, y)(x, -y)。具体实现中会列出椭圆曲线三列图,供选点使用。
get_ng(x1, y1, x2, y2, a, p)和get_np(x0, y0, n, a, p)用于椭圆坐标加减法,前者用于计算(x1, y1)+(x2, y2),后者用于计算n(x0, y0)。加密解密操作主要基于这两个函数。