OpenSSL中add()函数定义位置查询及射影坐标点加法实现问询
OpenSSL中EC_POINT_add关联的add()函数定义与射影坐标系点加法实现
一、add()函数的定义位置
EC_POINT_add里调用的add()是椭圆曲线方法结构体EC_METHOD中的函数指针,具体实现依赖曲线类型和使用的坐标系:
- 通用射影坐标系下的加法实现核心代码在
crypto/ec/ecp_add.c中,ecp_add_proj是最基础的射影点加法实现函数,多数曲线的add指针会指向这个函数或其优化版本。 - 针对特定曲线(如NIST P-256、secp256k1)的优化实现,会放在
crypto/ec/ecp_nistp256.c、crypto/ec/ecp_secp256k1.c这类曲线专属文件中,这些文件里的加法函数会利用曲线特性做性能优化。 - 函数指针的绑定逻辑在曲线方法初始化函数中完成,比如
ec_GFp_simple_method()会将add字段指向通用射影加法实现,而特定曲线的方法初始化函数会替换为优化后的版本。
二、射影坐标系下点加法的实现逻辑
OpenSSL主要采用雅各比射影坐标系(比常规射影坐标系更少除法操作)来实现点加法,核心流程如下:
- 特殊点判断:先检查输入点是否为无穷远点,若其中一个是无穷远点,直接返回另一个点作为结果。
- 中间值预计算:
- 计算
U1 = X1 * Z2²,U2 = X2 * Z1² - 计算
S1 = Y1 * Z2³,S2 = Y2 * Z1³
- 计算
- 分支处理同点/异点:
- 同点(倍点)场景:若
U1 == U2且S1 == S2,执行倍点运算:- 计算
M = 3*X1² + a*Z1⁴(a为椭圆曲线的参数) - 推导新坐标:
X3 = M² - 8*X1*Y1²,Y3 = M*(4*X1² - X3) - 8*Y1⁴,Z3 = 2*Y1*Z1
- 计算
- 异点场景:若两点不同,计算
H = U2 - U1,R = S2 - S1:- 推导新坐标:
X3 = R² - H³ - 2*U1*H²,Y3 = R*(U1*H² - X3) - S1*H³,Z3 = H*Z1*Z2
- 推导新坐标:
- 同点(倍点)场景:若
- 有限域模运算:所有计算步骤都在曲线对应的有限域内完成,OpenSSL会针对不同CPU架构实现硬件加速的模运算,大幅提升计算速度。
- 坐标保留策略:射影坐标系下运算完成后,默认保留射影坐标以避免昂贵的模逆运算,只有当需要转换为仿射坐标时,才会执行归一化操作。
内容的提问来源于stack exchange,提问作者Nikhil Srinivas
相关产品推荐
相关产品推荐

