铜锁SM2算法性能优化实践:(三)快速模逆元算法实现
模逆元的概念
在数学上,乘法逆元有一个更加广为人知的别名,“倒数”。也就是说,对于实数,其倒数满足。由于1是实数域的乘法单位元,故而倒数为实数的乘法逆元。 而在有限域模运算中,乘法逆元的定义要更复杂一些:如果和都是正整数且满足,那么在模意义下,存在一个整数,使得,此时就是在模运算下的逆元,常表示为**,简称为模逆元。**由于引入了模运算,在实数域上简单求倒数获得逆元的方法并不能直接求得有限域上的模逆元,需要改用更为复杂的方式求解运算结果。 在SM2数字签名算法中,存在两个必须计算模逆元的步骤:一是将椭圆曲线公钥点由仿射坐标转化为雅可比坐标时,需要计算轴坐标对素数域参数的模逆元,二是在签名计算过程中,需要求解私钥对椭圆曲线阶数的模逆元。由于模逆元的计算非常复杂,是椭圆曲线中开销最大的单体运算(无任何优化时计算耗时是模乘法的数千倍),且运算处于数字签名算法流程的关键链路上, 因此是制约SM2数字签名性能的瓶颈之一。目前,铜锁项目为SM2数字签名算法提供了通用的模逆元优化实现,尚未针对SM2曲线实现特定优化,存在可以进一步优化提升的空间。
优化方案比较选型
在数学上,有两种算法可以快速地计算模逆元,它们分别是拓展欧几里得算法和基于费马小定理的求解算法。下面我们简要介绍这两类算法,讨论各算法的优缺点以及在铜锁的工程实现中选择基于费马小定理的求解算法的原因。
拓展欧几里得算法求解模逆元
用于求解最大公约数的欧几里得算法最早在欧几里得的《几何原本》中被提出,拓展欧几里得算法是对这一古老算法的扩展。在求解最大公约数的基础上,拓展欧几里得算法通过收集辗转相除过程中的余式,求得线性方程的整数解。由于阶数是一个质数,因此,那 么该线性方程即转化为,恰巧是同余线性方程 的一般表示形式,所求的即为的模