OpenSSL密码库算法笔记——第5.4.9章 椭圆曲线点的加法

先来回忆下前面提到的仿射点的加法。

曲线上的两个放射点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)

功能:    点的加法

输入:    groupab

输出:    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)

功能:     二倍点运算

输入:     groupa

输出:     r 2a

返回:     1【正常】or 0【出错】

出处:     ec_lib.c

调用:        int ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a)

───────────────────────────────────────

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值