椭圆曲线
Weierstrass 定义
椭圆曲线的一种定义是,在 \(\mathbb{R}^2\) 上的曲线,曲线上每一点 \((x, y)\) 满足:
要求 \(4a^3 + 27b^2 \ne 0\),这种形式叫做 Weierstrass form。
运算
在椭圆曲线上,可以定义点之间的加法运算,满足:
- 单位元 \(O\) 为无穷远点
- 对于曲线上两点 \(P\) 和 \(Q\),取经过 \(P\) 和 \(Q\) 的直线,这条直线与椭圆曲线相交于最多三个点(因为方程是三次的),其中两个点是 \(P\) 和 \(Q\),如果第三个点存在且不和 \(P\)、\(Q\) 重合,记第三个点为 \(R\),那么满足 \(P + Q + R = O\),也就是 \(P + Q = -R\)
- 对一点 \(R=(x_P, y_P)\),其相反数 \(-R=(x_P, -y_P)\),也就是沿 X 轴对称的点
下面来推导一下 \(P\) \(Q\) \(R\) 三点间的坐标关系。设 \(P=(x_P, y_P), Q=(x_Q, y_Q), R=(x_R, y_R)\),首先假设 \(x_P \ne x_Q\),那么经过 \(P\) \(Q\) 的直线的方程为
带入椭圆曲线方程,得到
因为 \(P\) \(Q\) \(R\) 是曲线与直线相交的三点,上式等价于
两个方程的系数相同,则
即 \(R=((\frac{y_P - y_Q}{x_P - x_Q})^2 - x_P - x_Q, y_P + \frac{y_P - y_Q}{x_P - x_Q}((\frac{y_P - y_Q}{x_P - x_Q})^2 - x_P - x_Q - x_P))\)。由于 \(P + Q = -R\),所以椭圆曲线上点的加法在 \(x_P \ne x_Q\) 时运算结果为
如果 \(x_P = x_Q\),那么分情况讨论:
- 如果 \(y_P = y_Q\),也就是 \(P + Q\),此时 \(PQ\) 连的直线是椭圆曲线在 \(P\) 点的切线,切线上的斜率的计算方法是,对椭圆曲线方程两侧对 \(x\) 求导,得到 \(2y \frac{\mathrm{d}y}{\mathrm{d}x} = 3x^2+a\),因此斜率 \(k = \frac{3x_P^2+a}{2y_P}\),剩下的计算过程和上面一样。
- 如果 \(y_P \ne y_Q\),根据椭圆曲线的对称性,那么 \(y_P = - y_Q\),此时 \(P + Q = O\)。
这部分推导参考了 Wikipedia。
除了加法以外,还可以定义数乘:整数 \(n\) 乘以点 \(P\),实际上就是求 \(n\) 个 \(P\) 的和。
有限域上的椭圆曲线
从上面的观察可以发现,在计算两点间的加法运算的时候,对 X Y 坐标的计算只涉及到了加减乘除。因此,可以把椭圆曲线的坐标换到其他域上,而不局限于上面使用的 \(\mathbb{R}\)。例如在密码学中,通常会使用 \(F_p\) 素数域或者 \(GF(2^m)\)。例如取素数域 \(F_p\) 上的椭圆曲线,那么点的坐标满足
例如在椭圆曲线密码学中常用的 secp192r1 曲线,就是在素数域上定义的椭圆曲线:
此时除法运算定义为在素数域上乘以乘法逆元的运算。
Montgomery curve
在椭圆曲线密码学中,有时候会用 Montgomery curve 来描述椭圆曲线,而不是上面的 Weierstrass form。它的形式如下:
满足 \(B(A^2-4) \ne 0\)。
例如 Curve25519 就是一个在素数域上的 Montgomery curve:
使用 Montgomery curve 的好处是能够实现更快的运算。
Montgomery 曲线可以转换为 Weierstrass 曲线,下面给出转换过程:
考虑到 Montgomery 相比 Weierstrass 左侧多了一个 \(B\) 的因子,采用变量代换把它消除,
此时距离 Weierstrass form 就差等式右边的 \(u\) 的次数,目标是 \(x^3 + ax + b\),现在是 \(x^3 + ax^2 + x\),因此要把 \(x^2\) 项消掉,设 \(u = t - \frac{A}{3B}\),则
此时 \((v, t)\) 就是符合 Weierstrass form 椭圆曲线上的一点。
这部分推导参考了 Wikipedia。
Twisted Edwards curve
第三种椭圆曲线的描述方法是 Twisted Edwards curve,定义如下:
Twisted Edwards curve 的点的加法如下:
点可以用齐次坐标表示:\((X, Y, Z, T)\) 对应 \((x,y)\) 满足 \(x=X/Z, y=Y/Z, x*y=T/Z\)。
Twisted Edwards curve 可以用在 EdDSA 签名算法中。