Faster Point Multiplication with Endomorphisms Optimization
Table of Contents
1. Endomorphism 简介
2001 年,Robert P. Gallant 等人在论文 Faster Point Multiplication on Elliptic Curves with Efficient Endomorphisms 中提出了一种加快椭圆曲线上 Point Multiplication 运算的方法。书籍 Guide to Elliptic Curve Cryptography 第 3.5 节 Curves with efficiently computable endomorphisms 也对这个方法进行了描述。
1.1. Endomorphism 定义
设
如果
值得注意的是,自同态映射
1.2. Endomorphism 例子
在 Guide to Elliptic Curve Cryptography 的 Example 3.71 中给出了几个自同态(Endomorphism)映射的例子,图 1 是其中有一个例子。
Figure 1: Endomorphism on
也就是说:如果椭圆曲线
这里不介绍如何具体求解 Secp256k1 中的
lambda = 0x5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72 beta = 0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee
1.3. 验证 Secp256k1 上的 Endomorphism
在椭圆曲线 Secp256k1 上任意找两个点,如:
Px = 0x79f823642ddb09f87acae2126775613542af3fe156d1b936a813cc368ff626bd Py = 0x316b223447295841d0d025b5c76b87b42c6ddf879ec812bcf9eaeb538565a6b2 Px = 0x8effca731d7b8c9a8b3c2c8a00b69912afb4a417387ad1b25d17831aded7d202 Py = 0x22439f0e43813d54eb833d794408d6f436ae5d2237960da81f54536ba15b32fc
我们来验证一下这两个点是否都满足
import ecdsa from ecdsa.ellipticcurve import PointJacobi p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F # secp256k1 def satisfy_endomorphism(x, y): """ Verify any curve point P = (x,y) satisfy: lambda * P = (beta * x mod p, y) """ lamb = 0x5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72 beta = 0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee q: PointJacobi = PointJacobi(ecdsa.curves.SECP256k1.curve, x, y, 1, ecdsa.curves.SECP256k1.order) left: PointJacobi = lamb * q left_x = left.x() left_y = left.y() right_x = beta * x % p right_y = y print('left_x', left_x.to_bytes(32, byteorder='big').hex()) print('left_y', left_y.to_bytes(32, byteorder='big').hex()) print('right_x', right_x.to_bytes(32, byteorder='big').hex()) print('right_y', right_y.to_bytes(32, byteorder='big').hex()) return left_x == right_x and left_y == right_y def is_on_curve_secp256k1(x, y): return y**2 % p - (x**3 + 7) % p == 0 Px = 0x79f823642ddb09f87acae2126775613542af3fe156d1b936a813cc368ff626bd Py = 0x316b223447295841d0d025b5c76b87b42c6ddf879ec812bcf9eaeb538565a6b2 assert is_on_curve_secp256k1(Px, Py) assert satisfy_endomorphism(Px, Py) Px = 0x8effca731d7b8c9a8b3c2c8a00b69912afb4a417387ad1b25d17831aded7d202 Py = 0x22439f0e43813d54eb833d794408d6f436ae5d2237960da81f54536ba15b32fc assert is_on_curve_secp256k1(Px, Py) assert satisfy_endomorphism(Px, Py)
2. 利用 Endomorphisms 加速点的倍乘
式子
设
由于
至于如何把
3. 参考
- Faster Point Multiplication on Elliptic Curves with Efficient Endomorphisms
- Guide to Elliptic Curve Cryptography, 3.5 Curves with efficiently computable endomorphisms
- Speeding up signature verification: https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565