之前为了一个项目所以去学了下椭圆曲线加密算法,本来是想写篇笔记细写算法的,但写了半天也没写出来什么,所以不如把自己摸索的东西用代码写出来了。之前项目用的nodejs,所以这里就用js写了。所有代码几乎全部可以直接在F12的控制台中运行。
0x01 点的定义
ecc中最基础计算单位自然就是一个个点了,点的定义非常简单,只要new
一个对象然后赋予其点的xy坐标即可。
class Point{
constructor(x,y){
this.x = BigInt(x);
this.y = BigInt(y);
}
}
由于在实际进行计算的时候涉及的数据通常都很大,所以这里把点的坐标都转换成大整数以方便后续计算。
在ECC中,点只有两种运算:加法和数乘。所以这里我们先来实现这两个算法。
0x02 点的加法
因为点的加法的定义:
画一条线穿过P和Q,则此直线必和曲线相交第三个点R。取R关于x轴的对称点-R,就是P+Q的结果。
所以当我们有点 (x1, y1) (x2, y2) 的时候,就可以做出直线:
y − y 1 = k ( x − x 1 ) + b y-y_1=k\left(x-x_1\right)+b y−y1=k(x−x1)+b
其中:
k = x 2 − y 1 x 2 − x 1 k=\frac{x_2-y_1}{x_2-x_1} k=x2−x1x2−y1
有了这两个式子再和椭圆曲线:
y 2 = x 3 + a x + b y^2=x^3+ax+b y2=x3+ax+b
相联立,就可以得到一个关于x的一元三次方程组,解出x3再代入1式就可以得到结果的点了。
接下来是一个点和自己相加。
按照定义,一个点和自己相加时画这个点的切线,得到切线的斜率后再带入13式就可以得到结果了。
计算切线的斜率可以通过求导的方式计算得出:
F ( x ) = x 3 + a x + b − y 2 F\left(x\right)=x^3+ax+b-y^2 F(x)=x3+ax+b−y2
F x ′ = 3 x 2 + a F_x^{'}=3x^2+a Fx′=3x