曲线点加法性能优化求助:如何提升tinyec模块运算速度?
优化椭圆曲线点加法的方案
1. 替换循环加法为标量乘法
你的代码本质是计算s的100000倍点(即100000 * s),但当前用循环逐次加法的时间复杂度是O(n),而椭圆曲线标量乘法支持快速幂算法(二进制展开法),时间复杂度仅为O(log n),速度能提升几个数量级。
tinyec直接支持点的标量乘法,修改代码如下:
from tinyec.ec import SubGroup, Curve name = 'secp256k1' p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 a = 0x0000000000000000000000000000000000000000000000000000000000000000 b = 0x0000000000000000000000000000000000000000000000000000000000000007 g = (0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798, 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8) h = 1 curve = Curve(a, b, SubGroup(p, g, n, h), name) s = curve.g # 直接计算标量乘法,替代10万次循环加法 p1 = s * 100000
这种方式仅需约17次加法/加倍操作(log₂(100000)≈17),远优于10万次逐次加法。
2. 提升tinyec的运行效率
tinyec是纯Python实现,性能本身有局限,可通过以下方式优化:
- 换用C扩展实现的库:比如
cryptography库,它基于OpenSSL的C实现,椭圆曲线运算速度远快于纯Python的tinyec。示例代码:
from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.backends import default_backend # 使用secp256k1曲线 curve = ec.SECP256K1() generator = curve.generator() # 生成基点的公钥对象 s_point = ec.EllipticCurvePublicNumbers.from_encoded_point( curve, generator.public_bytes_raw() ).public_key(default_backend()) # 计算100000倍点 p1 = s_point.public_numbers() * 100000
- 依赖
gmpy2加速大数运算:安装gmpy2库后,tinyec会自动调用它优化模运算等底层操作,提升整体速度。
3. 缓存机制的适用场景
缓存对你当前的连续加同一点场景帮助不大,标量乘法已经是最优解。但如果是频繁计算不同点组合的加法场景,可以预先缓存常用点的运算结果,避免重复计算。比如预先存储多个倍数点,后续需要时直接取用。
内容的提问来源于stack exchange,提问作者Knm
相关产品推荐
相关产品推荐

