Appearance
ECC
数学基础
椭圆曲线
形如
常见曲线参数:
secp256k1:
P-256(FIST):
BLS128_381:
二次扩域: SM2:
BN128(zk-snark):
一些特殊曲线
Baby Jubjub Elliptic Curve(扭曲爱德华曲线方程):
- 对于运算
,运算如下:
- 对于运算
点加法
对于椭圆曲线上的两个不同点
斜率计算:
新点坐标:
数学推导
直线方程:通过
和 的直线: 其中
求交点:将直线方程代入椭圆曲线
: 展开得:
整理为三次方程:
根的关系:设三个根为
,由韦达定理: 因此:
y坐标计算:将
代入直线方程得到交点,然后取其关于x轴的对称点:
倍乘运算
当
斜率计算:
新点坐标:
数学推导同上
标量乘法
标量乘法
输入:点 P,标量 k
输出:k·P
1. 初始化 Q = O (无穷远点)
2. 将 k 表示为二进制
3. 从最低位开始:
- 如果当前位为1,则 Q = Q + P
- P = 2P (点倍乘)
- 移到下一位
4. 返回 Q进阶:椭圆曲线计算加速
Jacobian坐标
由于椭圆曲线是
在椭圆曲线上,我们定义单位元为无穷远点 py_ecc.secp256k1里看的)
- 仿射
射影: - 射影
仿射:
而对于实际应用中常使用Jacobian坐标,其转换如下:
- 仿射
Jacobian: - Jacobian
仿射:
注意这里所有的运算都是在mod p下的
加法
注意这里所有的运算都是在mod p下的
对于
如果
倍乘
注意这里所有的运算都是在mod p下的
(里面的
注意倍乘时可以用类似平方快速幂的方式加速
python
if a[1] == 0 or n == 0:
return cast("PlainPoint3D", (0, 0, 1))
if n == 1:
return a
if n < 0 or n >= N:
return jacobian_multiply(a, n % N)
if (n % 2) == 0:
return jacobian_double(jacobian_multiply(a, n // 2))
if (n % 2) == 1:
return jacobian_add(jacobian_double(jacobian_multiply(a, n // 2)), a)
raise ValueError("Unexpected case in jacobian_multiply: This should never happen.")扩展域
// TODO