铜锁SM2算法性能优化实践:(三)快速模逆元算法实现
模逆元的概念
在数学上,乘法逆元有一个更加广为人知的别名,“倒数”。也就是说,对于实数,其倒数满足。由于1是实数域的乘法单位元,故而倒数为实数的乘法逆元。 而在有限域模运算中,乘法逆元的定义要更复杂一些:如果和都是正整数且满足,那么在模意义下,存在一个整数,使得,此时就是在模运算下的逆元,常表示为**,简称为模逆元。**由于引入了模运算,在实数域上简单求倒数获得逆元的方法并不能直接求得有限域上的模逆元,需要改用更为复杂的方式求解运算结果。 在SM2数字签名算法中,存在两个必须计算模逆元的步骤:一是将椭圆曲线公钥点由仿射坐标转化为雅可比坐标时,需要计算轴坐标对素数域参数的模逆元,二是在签名计算过程中,需要求解私钥对椭圆曲线阶数的模逆元。由于模逆元的计算非常复杂,是椭圆曲线中开销最大的单体运算(无任何优化时计算耗时是模乘法的数千倍),且运算处于数字签名算法流程的关键链路上, 因此是制约SM2数字签名性能的瓶颈之一。目前,铜锁项目为SM2数字签名算法提供了通用的模逆元优化实现,尚未针对SM2曲线实现特定优化,存在可以进一步优化提升的空间。
优化方案比较选型
在数学上,有两种算法可以快速地计算模逆元,它们分别是拓展欧几里得算法和基于费马小定理的求解算法。下面我们简要介绍这两类算法,讨论各算法的优缺点以及在铜锁的工程实现中选择基于费马小定理的求解算法的原因。
拓展欧几里得算法求解模逆元
用于求解最大公约数的欧几里得算法最早在欧几里得的《几何原本》中被提出,拓展欧几里得算法是对这一古老算法的扩展。在求解最大公约数的基础上,拓展欧几里得算法通过收集辗转相除过程中的余式,求得线性方程的整数解。由于阶数是一个质数,因此,那 么该线性方程即转化为,恰巧是同余线性方程 的一般表示形式,所求的即为的模逆元。 对于现代计算机而言,拓展欧几里得算法的一个缺点是在计算过程中存在大量除法运算,而CPU 在处理除法运算时的效率通常比其他基本运算(如加、减、乘)要低得多。针对这一缺陷,约瑟夫 · 斯提芬于1967年提出了二进制拓展欧几里得算法, 该算法用简单的移位操作和减法代替了复杂的除法运算。 下面是利用二进制拓展欧几里得算法求模逆元的伪代码:
拓展欧几里得算法求解模逆元的优点是:可以求解任意模数下的逆元,不受模数是否为素数的限制;算法效率高,相较于费马小定理求模逆元有一定的性能优势。但是,拓展欧几里得算法相应的也存在一些缺点:实现代码较为复杂,容易出错;代码中有大量的分支和判断语句,难以实现恒定时间(Constant time)算法,对于侧信道攻击的抵抗较弱,在密码学算法中可能会导致关于私钥或明文的信息发生泄漏。
费马小定理求解模逆元
费马小定理(Fermat's little theorem)是数论中的一个重要定理 ,最早由数学家费马于1636年提出。定理的内容是:假如是一个整数,是一个质数,那么有: 在SM2曲线中,数和参数满足,,且和均为素数,因此数三者两两互质。此时,费马小定理有如下形式: 数互质,那么有 ,联立可得: 也就是说,若要计算数对素数的模逆元,只需要求解 即可。借助费马小定理的转换,模逆元求解的过程即转化为使用模乘与模平方运算构造的过程,大大简化了计算。 运用费马小定理求解模逆元的优点是:算法简单,运算过程只需要模乘与模平方运算参与,没有进位和分支操作,很容易实现恒定时间算法,在抵抗侧信道攻击方面相较于拓展欧几里得算法有较大优势;相应地,运用费马小定理求解模逆元的缺点有:适用范围较窄,只适用于模数为素数的情况;模数较大时,需要计算的幂次比较大,相较于使用拓展欧几里得算法求解模逆元的性能稍劣。
方案选型
在铜锁中,SM2数字签名算法的快速模逆元优化实现最终选择了基于费马小定理求解模逆元的算法,主要原因有以下两点:
- 作为铜锁国密通信协议、国密证书签发等关键应用的基础,SM2数字签名算法在实现时应尤其注意安全性,特别是在抗侧信道攻击方面,应精心设计以避免私钥泄露;基于费马小定理求解模逆元的算法在设计恒定时间算法、抵抗侧信道攻击方面有较大 优势。
- 费马小定理求模逆元的一些缺点在SM2算法的优化实现中能够有效规避。例如,SM2曲线的参数均为素数,满足费马小定理只适用于模数为素数的条件;对于性能问题,在具体实现时,可以通过加法链构造减少计算模逆元所需的模乘与模平方运算次数,弥补费马小定理求逆的些许性能劣势。