椭圆曲线上的相同点相加与相异点相加的推导计算
1. 背景
1.1 起因
椭圆曲线密码学(ECC)上要求计算两点 P , Q P, Q P,Q相加时得到的第三点 R R R的坐标。
翻阅了《深入浅出密码学》和《密码编码学与网络安全》(第7,8版),这两本书中都直接给出结论,没有给出推导。
- 《深入浅出密码学》, 第230页
- 《密码编码学与网络安全》,第7版,第222页
下面推导实数域上椭圆曲线上的两点相加得到第三点坐标。
1.2 背景
实数域上的椭圆曲线:
y
2
=
x
3
+
a
x
+
b
(1)
\tag{1} y^2 = x^3 + ax + b
y2=x3+ax+b(1)
与通过椭圆曲线上 P P P点的直线 L ( x ) L(x) L(x),相交于另外两点 Q , R Q,\ R Q, R,如下图所示:
假设 P, Q, R 三点的坐标分别为: P ( x 1 , y 1 ) , Q ( x 2 , y 2 ) , R ( x 3 , − y 3 ) P(x_1, y_1),\ Q(x_2, y_2),\ R(x_3, -y_3) P(x1,y1), Q(x2,y2), R(x3,−y3)。
这里是为了计算 P + Q P+Q P+Q,即 R R R的镜像点,因此点 R R R的坐标为 ( x 3 , − y 3 ) (x_3, -y_3) (x3,−y3)。
因此通过 P ( x 1 , y 1 ) P(x_1, y_1) P(x1,y1)点的直线方程 L ( x ) L(x) L(x)可以表述为:
y = k ( x − x 1 ) + y 1 (2) \tag{2} y = k(x-x_1) + y_1 y=k(x−x1)+y1(2)
其中, k k k 为直线 L ( x ) L(x) L(x)的斜率。
2. 直线的斜率 k k k
对于 P , Q P,\ Q P, Q是相同点或不同点,斜率 k k k的计算方式不一样。
先从简单的方式说起, P , Q P,\ Q P, Q 为不同点。
2.1 P , Q P,\ Q P, Q为不同点的斜率
P
,
Q
P,\ Q
P, Q不同的情况下,斜率
k
k
k可以通过
P
(
x
1
,
y
1
)
,
Q
(
x
2
,
y
2
)
P(x_1, y_1),\ Q(x_2, y_2)
P(x1,y1), Q(x2,y2)两点的坐标直接得出:
k
=
y
2
−
y
1
x
2
−
x
1
(3)
\tag{3} k=\cfrac{y_2-y_1}{x_2-x_1}
k=x2−x1y2−y1(3)
2.2 P , Q P,\ Q P, Q为相同点的斜率
当 P , Q P,\ Q P, Q是同一点时,直线 L ( x ) L(x) L(x)实际上就是经过 P ( x 1 , y 1 ) P(x_1,\ y_1) P(x1, y1)点的切线。
根据导数的定义,在可导的前提下,某一点的导数就是经过该点切线的斜率。
因此,对式(1)两边求导,有:
2
y
y
′
=
3
x
2
+
a
2yy' = 3x^2 + a
2yy′=3x2+a
将上式的左边
2
y
2y
2y移到右边有:
y
′
=
3
x
2
+
a
2
y
y' = \cfrac{3x^2+a}{2y}
y′=2y3x2+a
因此,
y
′
y'
y′就是曲线上任意一点切线的斜率,对于
P
(
x
1
,
y
1
)
P(x_1, y_1)
P(x1,y1),经过该点切线的斜率:
k
=
3
x
1
2
+
a
2
y
1
(5)
\tag{5} k =\cfrac{3x^2_1+a}{2y_1}
k=2y13x12+a(5)
总结一下:
k
=
{
y
2
−
y
1
x
2
−
x
1
,
(
P
≠
Q
)
3
x
1
2
+
a
x
2
y
1
,
(
P
=
Q
)
(6)
\tag{6} k = \begin{cases} \cfrac{y_2-y_1}{x_2-x_1}, & (P \neq Q) \\ \\ \cfrac{3x^2_1+ax}{2y_1}, & (P = Q) \end{cases}
k=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x2−x1y2−y1,2y13x12+ax,(P=Q)(P=Q)(6)
3. 第三点 R ( x 3 , y 3 ) R(x_3, y_3) R(x3,y3)的坐标
3.1 横坐标 x 3 x_3 x3的计算
将(2)式带入(1)中可以消去
y
y
y,得到只包含
x
x
x的等式,然后将等式逐步展开:
(
k
(
x
−
x
1
)
+
y
1
)
2
=
x
3
+
a
x
+
b
k
2
(
x
−
x
1
)
2
+
2
k
(
x
−
x
1
)
y
1
+
y
1
2
=
x
3
+
a
x
+
b
k
2
(
x
2
−
2
x
1
x
+
x
1
2
)
+
2
k
x
y
−
2
k
x
1
y
1
+
y
1
2
=
x
3
+
a
x
+
b
k
2
x
2
−
2
k
x
1
x
+
k
2
x
1
2
+
2
k
x
y
−
2
k
x
1
y
1
+
y
1
2
=
x
3
+
a
x
+
b
\begin{aligned} (k(x-x_1)+y_1)^2 & = x^3 + ax + b\\ k^2(x-x_1)^2 + 2k(x-x_1)y_1 + {y_1}^2 & = x^3 + ax + b\\ k^2(x^2-2x_1x+{x_1}^2) + 2kxy - 2kx_1y_1 + {y_1}^2 & = x^3 + ax + b\\ k^2x^2-2kx_1x+k^2{x_1}^2 + 2kxy - 2kx_1y_1 + {y_1}^2 & = x^3 + ax + b\\ \end{aligned}
(k(x−x1)+y1)2k2(x−x1)2+2k(x−x1)y1+y12k2(x2−2x1x+x12)+2kxy−2kx1y1+y12k2x2−2kx1x+k2x12+2kxy−2kx1y1+y12=x3+ax+b=x3+ax+b=x3+ax+b=x3+ax+b
将上面最后一个等式左边移项到右边,并合并同类项得到:
x
3
−
k
2
x
2
+
(
a
+
2
k
x
1
−
2
k
y
)
x
+
b
−
(
k
2
x
1
2
+
2
k
x
1
y
1
−
y
1
2
)
=
0
x^3 - k^2x^2 + (a+2kx_1-2ky)x + b - (k^2x_1^2+2kx_1y_1-y_1^2) = 0
x3−k2x2+(a+2kx1−2ky)x+b−(k2x12+2kx1y1−y12)=0
整理一下,有:
x
3
−
k
2
x
2
+
(
a
+
2
k
x
1
−
2
k
y
)
x
+
b
−
(
k
x
1
−
y
1
)
2
=
0
(7)
\tag{7} x^3 - k^2x^2 + (a+2kx_1-2ky)x + b - (kx_1-y_1)^2 = 0
x3−k2x2+(a+2kx1−2ky)x+b−(kx1−y1)2=0(7)
式(7)是一个3次方程,其解对应于直线和椭圆曲线三个交点的横坐标 x 1 , x 2 , x 3 x_1,\ x_2,\ x_3 x1, x2, x3。
根据韦达定理(Vieta’s Formulas),三次方程
a
x
3
+
b
x
2
+
c
x
+
d
=
0
ax^3 + bx^2 + cx + d = 0
ax3+bx2+cx+d=0的三个根
x
1
,
x
2
,
x
3
x_1,\ x_2,\ x_3
x1, x2, x3有以下关系:
x
1
+
x
2
+
x
3
=
−
b
a
x
1
x
2
+
x
1
x
3
+
x
2
x
3
=
−
c
a
x
1
x
2
x
3
=
−
d
a
\begin{aligned} x_1 + x_2 + x_3 & = -\cfrac{b}{a}\\ x_1x_2 + x_1x_3 + x_2x_3 & = -\cfrac{c}{a}\\ x_1x_2x_3 & = -\cfrac{d}{a} \end{aligned}
x1+x2+x3x1x2+x1x3+x2x3x1x2x3=−ab=−ac=−ad
对应于式(7)就有:
x
1
+
x
2
+
x
3
=
−
b
a
=
−
−
k
2
1
=
k
2
,
(
这
里
a
=
1
,
b
=
k
2
)
x_1 + x_2 + x_3 = -\cfrac{b}{a} = -\cfrac{-k^2}{1} = k^2, \ (这里\ a=1,\ b=k^2)
x1+x2+x3=−ab=−1−k2=k2, (这里 a=1, b=k2)
即:
x
3
=
k
2
−
x
1
−
x
2
(8)
\tag{8} x_3 = k^2 - x_1 - x_2
x3=k2−x1−x2(8)
关于韦达定理(Vieta’s Formulas)的证明,参考维基百科: Vieta’s Formulas
韦达定理在二次方程和三次方程简单情形中的展开参考本文第四节。
3.2 纵坐标 y 3 y_3 y3的计算
相比于横坐标,纵坐标的计算比较简单,直接通过两点 P ( x 1 , y 1 ) , Q ( x 3 , − y 3 ) P(x_1, y_1),\ Q(x_3, -y_3) P(x1,y1), Q(x3,−y3)计算斜率就可以得到:
k = y 1 − ( − y 3 ) x 1 − x 3 k = \cfrac{y_1 - (-y_3)}{x_1 - x_3} k=x1−x3y1−(−y3)
将上式右边的
x
1
−
x
3
x_1 - x_3
x1−x3移到左边有:
k
(
x
1
−
x
3
)
=
y
1
+
y
3
k(x_1 - x_3) = y_1 + y_3
k(x1−x3)=y1+y3
因此:
y
3
=
k
(
x
1
−
x
3
)
−
y
1
(9)
\tag{9} y_3 = k(x_1 - x_3) - y_1
y3=k(x1−x3)−y1(9)
3.3 总结一下
实数域中,椭圆曲线上相同点与相异点相加的坐标:
P + Q 的 坐 标 ( x 3 , y 3 ) , { x 3 = k 2 − x 1 − x 2 y 3 = k ( x 1 − x 3 ) − y 1 (10) \tag{10} P+Q\ 的坐标\ (x_3, y_3), \begin{cases} x_3 = k^2 - x_1 - x_2\\ \\ y_3 = k(x_1 - x_3) - y_1 \end{cases} P+Q 的坐标 (x3,y3),⎩⎪⎨⎪⎧x3=k2−x1−x2y3=k(x1−x3)−y1(10)
其中:
k
=
{
y
2
−
y
1
x
2
−
x
1
,
(
P
≠
Q
)
3
x
1
2
+
a
x
2
y
1
,
(
P
=
Q
)
(6)
\tag{6} k = \begin{cases} \cfrac{y_2-y_1}{x_2-x_1}, & (P \neq Q) \\ \\ \cfrac{3x^2_1+ax}{2y_1}, & (P = Q) \end{cases}
k=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x2−x1y2−y1,2y13x12+ax,(P=Q)(P=Q)(6)
4. 韦达定理(Vieta’s Fomulars)及其证明
4.1 韦达定理
韦达定理(Vieta’s Formulas) 指出了多项式的根与系数之间的关系。
对于一个度(degree)为
n
n
n 的多项式
P
(
x
)
=
a
n
x
n
+
a
n
−
1
x
n
−
1
+
.
.
.
+
a
1
x
+
a
0
P(x) = a_nx^n + a_{n-1}x^{n-1} + ... + a_1x + a_0
P(x)=anxn+an−1xn−1+...+a1x+a0
其各个根
r
1
,
r
2
,
.
.
.
,
r
n
r_1, r_2, ..., r_n
r1,r2,...,rn之间的关系有:
{
r
1
+
r
2
+
.
.
.
+
r
n
−
1
+
r
n
=
−
a
n
−
1
a
n
(
r
1
r
2
+
r
1
r
3
+
.
.
.
+
r
1
r
n
)
+
(
r
2
r
3
+
r
2
r
4
+
.
.
.
+
r
2
r
n
)
+
.
.
.
+
r
n
−
1
r
n
=
a
n
−
2
a
n
⋮
r
1
r
2
.
.
.
r
n
=
(
−
1
)
n
a
0
a
n
\begin{cases} r_1 + r_2 + ... + r_{n-1} + r_n = - \cfrac{a_{n-1}}{a_n} \\ (r_1r_2 + r_1r_3 + ... + r_1r_n) + (r_2r_3 + r_2r_4 + ... + r_2r_n) + ... + r_{n-1}r_n = \cfrac{a_{n-2}}{a_n}\\ \ \vdots\\ r_1r_2...r_n = (-1)^n \cfrac{a_0}{a_n} \end{cases}
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧r1+r2+...+rn−1+rn=−anan−1(r1r2+r1r3+...+r1rn)+(r2r3+r2r4+...+r2rn)+...+rn−1rn=anan−2 ⋮r1r2...rn=(−1)nana0
这个公式太复杂,还是拿二次多项式和三次多项式举例说明比较简单。
4.2 二次方程和三次方程的例子
假设
r
1
,
r
2
r_1, r_2
r1,r2是二次方程
a
x
2
+
b
x
+
c
=
0
ax^2 + bx + c = 0
ax2+bx+c=0的两个根,则有:
r
1
+
r
2
=
−
b
a
,
r
1
r
2
=
c
a
r_1 + r_2 = - \cfrac{b}{a}, \ r_1r_2 = \cfrac{c}{a}
r1+r2=−ab, r1r2=ac
假设
r
1
,
r
2
,
r
3
r_1, r_2, r_3
r1,r2,r3是三次方程
a
x
3
+
b
x
2
+
c
x
+
d
=
0
ax^3 + bx^2 + cx + d = 0
ax3+bx2+cx+d=0的三个根,则有:
r
1
+
r
2
+
r
3
=
−
b
a
,
r
1
r
2
+
r
1
r
3
+
r
2
r
3
=
c
a
,
r
1
r
2
r
3
=
−
d
a
r_1 + r_2 + r_3 = - \cfrac{b}{a}, \ r_1r_2 + r_1r_3 + r_2r_3 = \cfrac{c}{a}, \ r_1r_2r_3 = - \cfrac{d}{a}
r1+r2+r3=−ab, r1r2+r1r3+r2r3=ac, r1r2r3=−ad
4.4 维达定理的简单证明
假定 n 次方程 a n x n + a n − 1 x n − 1 + . . . + a 1 x + a 0 = 0 a_nx^n + a_{n-1}x^{n-1} + ... + a_1x + a_0 = 0 anxn+an−1xn−1+...+a1x+a0=0的根分别为 r 1 , r 2 , . . . , r n r_1, r_2, ..., r_n r1,r2,...,rn。
则方程可以写成下面的样式:
a
n
x
n
+
a
n
−
1
x
n
−
1
+
.
.
.
+
a
1
x
+
a
0
=
a
n
(
x
−
r
1
)
(
x
−
r
2
)
.
.
.
(
x
−
r
n
)
=
0
a_nx^n + a_{n-1}x^{n-1} + ... + a_1x + a_0 = a_n(x-r_1)(x-r_2)...(x-r_n) = 0
anxn+an−1xn−1+...+a1x+a0=an(x−r1)(x−r2)...(x−rn)=0
4.4.1 二次方程
最简单的二次方程:
f ( x ) = a 2 x 2 + a 1 x + a 0 = a 2 ( x − r 1 ) ( x − r 2 ) = a 2 ( x 2 − x ( r 1 + r 2 ) + r 1 r 2 ) f(x) = a_2x^2 + a_1x + a_0 = a_2(x-r_1)(x-r_2) = a_2(x^2 - x(r_1 + r_2) + r_1r_2) f(x)=a2x2+a1x+a0=a2(x−r1)(x−r2)=a2(x2−x(r1+r2)+r1r2)
对比 x 的同类项系数,有:
a
2
=
a
2
,
a
1
=
−
a
2
(
r
1
+
r
2
)
,
a
0
=
a
2
(
r
1
r
2
)
a_2 = a_2, a_1 = -a_2(r_1 + r_2), a_0 = a_2(r_1r_2)
a2=a2,a1=−a2(r1+r2),a0=a2(r1r2)
因此:
r
1
+
r
2
=
−
a
1
a
2
,
r
1
r
2
=
a
0
a
2
r_1 + r_2 = - \cfrac{a_1}{a_2}, \ r_1r_2 = \cfrac{a_0}{a_2}
r1+r2=−a2a1, r1r2=a2a0
4.4.4 三次方程
三次方程:
f ( x ) = a 3 x 3 + a 2 x 2 + a 1 x + a 0 = a 3 ( x − r 1 ) ( x − r 2 ) ( x − r 3 ) = a 3 ( x 2 − ( r 1 + r 2 ) x + r 1 r 2 ) ( x − r 3 ) = a 3 ( x 3 − r 3 x 2 + ( r 1 + r 2 ) x 2 + ( r 1 + r 2 ) r 3 x + r 1 r 2 x − r 1 r 2 r 3 ) = a 3 ( x 3 − ( r 1 + r 2 + r 3 ) x 2 + ( r 1 r 2 + r 1 r 3 + r 2 r 3 ) x − r 1 r 2 r 3 ) \begin{aligned} f(x) = a_3x^3 + a_2x^2 + a_1x + a_0 & = a_3(x-r_1)(x-r_2)(x-r_3)\\ & = a_3(x^2 -(r_1 + r_2)x + r_1r_2)(x-r_3)\\ & = a_3(x^3 - r_3x^2 + (r_1 + r_2)x^2 + (r_1 + r_2)r_3x + r_1r_2x - r_1r_2r_3)\\ & = a_3(x^3 - (r_1 + r_2 + r_3)x^2 + (r_1r_2 + r_1r_3 + r_2r_3)x - r_1r_2r_3)\\ \end{aligned} f(x)=a3x3+a2x2+a1x+a0=a3(x−r1)(x−r2)(x−r3)=a3(x2−(r1+r2)x+r1r2)(x−r3)=a3(x3−r3x2+(r1+r2)x2+(r1+r2)r3x+r1r2x−r1r2r3)=a3(x3−(r1+r2+r3)x2+(r1r2+r1r3+r2r3)x−r1r2r3)
对比 x 的同类项系数,有:
a
3
=
a
3
,
a
2
=
−
a
3
(
r
1
+
r
2
+
r
3
)
,
a
1
=
a
3
(
r
1
r
2
+
r
1
r
3
+
r
2
r
3
)
,
a
0
=
−
a
3
r
1
r
2
r
3
a_3 = a_3, \ a_2 = -a_3(r_1 + r_2 + r_3), \ a_1 = a_3(r_1r_2 + r_1r_3 + r_2r_3), \ a_0 = -a_3r_1r_2r_3
a3=a3, a2=−a3(r1+r2+r3), a1=a3(r1r2+r1r3+r2r3), a0=−a3r1r2r3
因此:
r
1
+
r
2
+
r
3
=
−
a
2
a
3
,
r
1
r
2
+
r
1
r
3
+
r
2
r
3
=
a
1
a
3
,
r
1
r
2
r
3
=
−
a
0
a
3
r_1 + r_2 + r_3 = - \cfrac{a_2}{a_3}, \ r_1r_2 + r_1r_3 + r_2r_3 = \cfrac{a_1}{a_3}, \ r_1r_2r_3 = -\cfrac{a_0}{a_3}
r1+r2+r3=−a3a2, r1r2+r1r3+r2r3=a3a1, r1r2r3=−a3a0
这里和第 3.1 节引用的结果是一样的。
5. 其它
洛奇工作中常常会遇到自己不熟悉的问题,这些问题可能并不难,但因为不了解,找不到人帮忙而瞎折腾,往往导致浪费几天甚至更久的时间。
所以我组建了几个微信讨论群(记得微信我说加哪个群,如何加微信见后面),欢迎一起讨论:
- 一个密码编码学讨论组,主要讨论各种加解密,签名校验等算法,请说明加密码学讨论群。
- 一个Android OTA的讨论组,请说明加Android OTA群。
- 一个git和repo的讨论组,请说明加git和repo群。
在工作之余,洛奇尽量写一些对大家有用的东西,如果洛奇的这篇文章让您有所收获,解决了您一直以来未能解决的问题,不妨赞赏一下洛奇,这也是对洛奇付出的最大鼓励。扫下面的二维码赞赏洛奇,金额随意:
洛奇自己维护了一个公众号“洛奇看世界”,一个很佛系的公众号,不定期瞎逼逼。公号也提供个人联系方式,一些资源,说不定会有意外的收获,详细内容见公号提示。扫下方二维码关注公众号: