概述
先来回忆下前面提到的仿射点的加法。
曲线上的两个放射点P1=(x1,y1)和P2=(x2,y2)做加法P3=P1+P2=(x3,y3),当P1=P2时,称此时的加法运算为二倍点运算。如果P1≠-P2,则P3=P1+P2=(x3,y3),可以由如下公式计算出来:
对不同的射影坐标系而言,只需要把射影点转化成对应的放射点再代入以上两个式子即可得到在对应射影坐标系下的射影点加法公式。
下面给出在各个不同的射影坐标系下做点的加法所需的运算量,其中A表示放射坐标,P表示标准射影坐标,J表示Jacobi射影坐标,C表示Chudnovsky射影坐标,M表示乘法,S表示平方,I表示逆运算。
二倍点 | 普通加法 | 混合系数 | |||
2A→A 2P→P 2J→J 2C→C | 1I+2M+2S 7M+3S 4M+4S 5M+4S | A+A→A P+P→P J+J→J C+C→C | 1I+2M+1S 12M+2S 12M+4S 11M+3S | J+A→J J+C→J C+A→C | 8M+3S 11M+3S 8M+3S |
表5.5 不同的射影坐标系下做点的加法所需的运算量
从上表可以看出,二倍点运算使用Jacobi射影坐标系最快,而加法则采用Jacobi-仿射混合系数最快。
如此就只需要1S+1M,减少了二倍点的运算量。这就解释了在§5.1.1提出的问题:为什么在椭圆曲线点群的定义要加入一个参数int a_is_minus3。
下面来解释点的加法函数。
───────────────────────────────────────
int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b)
功能: 点的加法
输入: group,a,b
输出: r ← a + b
返回: 1【正常】or 0【出错】
出处: ec_lib.c
调用: ▼ int ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b)
───────────────────────────────────────
接着来看看二倍点运算函数。
───────────────────────────────────────
int EC_POINT_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a)
功能: 二倍点运算
输入: group,a
输出: r ← 2a
返回: 1【正常】or 0【出错】
出处: ec_lib.c
调用: ▼ int ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a)
───────────────────────────────────────
最后
以上就是积极狗为你收集整理的OpenSSL密码库算法笔记——第5.4.9章 椭圆曲线点的加法的全部内容,希望文章能够帮你解决OpenSSL密码库算法笔记——第5.4.9章 椭圆曲线点的加法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复