OpenSSL密码库算法笔记——第5.4.2章 椭圆曲线上点的射影坐标表示

射影坐标又分成好几种——标准射影坐标、Jacobi射影坐标、Chudnovsky射影坐标。

在标准射影坐标中,射影点(x, y, z),z≠0,对应仿射点(x/z, y/z),椭圆曲线的射影方程为y2z=x3+axz+bz2。在Jacobi射影坐标中,射影点(x, y, z),z≠0,对应仿射点(x/z2, y/z3),椭圆曲线的射影方程为y2=x3+axz4+bz6。在Chudnovsky射影坐标中,射影点(x, y, z),z≠0,对应仿射点(x, y, z, z2, z3)。

在射影坐标系下做点的加法不需要做逆运算,只需要先将仿射点转化成射影点,在做完点的所有运算之后再转化为仿射点。

一般情况下都会选择使用Jacobi射影坐标系,因为在该坐标系下做点的加法和二倍点时效率都比较高(参见§5.4.2),而且也为人们所熟悉。在实现代码中选择的就是Jacobi射影坐标系,对点的定义包括了X、Y、Z坐标。如果要想将这个Jacobi射影点(X, Y, Z)化成仿射点,只需要将Z化为1即可得到对应仿射点X ← X/Z2,Y ← Y/Z3,Z ← 1。

现在回过头再来看看代码中对点的定义就更加清楚了。

typedef struct ec_point_st EC_POINT;

struct ec_point_st {

        const EC_METHOD *meth;

        BIGNUM X;

        BIGNUM Y;

        BIGNUM Z;

        int Z_is_one;

} /* EC_POINT */;

你可能感兴趣的:(openssl)