铜锁 SM2 算法性能优化实践(三)|快速模逆元算法实现

本文介绍了在铜锁项目中,针对SM2算法的模逆元计算进行性能优化的实践。通过对比拓展欧几里得算法和基于费马小定理的算法,最终选择了费马小定理,因为它在实现恒定时间算法和抵抗侧信道攻击方面具有优势。通过加法链优化,实现了快速模逆元求解,提升了SM2数字签名的性能。
摘要由CSDN通过智能技术生成

模逆元的概念

在数学上,乘法逆元有一个更加广为人知的别名“倒数”。也就是说,对于实数 a,其倒数 a-1 满足 a*a-1=1。由于 1 是实数域的乘法单位元,故而倒数 a-1 为实数 a 的乘法逆元。

而在有限域模运算中,乘法逆元的定义要更复杂一些:如果 a 和 m 都是正整数且满足 gcd(a,m)=1,那么在模 m 意义下,存在一个整数 b,使得 ab1(mod m),此时 b 就是 a 在模 m 运算下的逆元,常表示为 a-1,简称为模逆元。 由于引入了模运算,在实数域上简单求倒数获得逆元的方法并不能直接求得有限域上的模逆元,需要改用更为复杂的方式求解运算结果。

在 SM2 数字签名算法中,存在两个必须计算模逆元的步骤:一是将椭圆曲线公钥点 PK 由仿射坐标转化为雅可比坐标时,需要计算 z 轴坐标 z1 对素数域参数 p 的模逆元;二是在签名计算过程中,需要求解私钥 dA+1 对椭圆曲线阶数 n 的模逆元。由于模逆元的计算非常复杂,是椭圆曲线中开销最大的单体运算 (无任何优化时计算耗时是模乘法的数千倍) ,且运算处于数字签名算法流程的关键链路上, 因此是制约 SM2 数字签名性能的瓶颈之一。目前,铜锁项目为 SM2 数字签名算法提供了通用的模逆元优化实现,尚未针对 SM2 曲线实现特定优化,存在可以进一步优化提升的空间。

优化方案比较选型

在数学上,有两种算法可以快速地计算模逆元,它们分别是拓展欧几里得算法基于费马小定理的求解算法。下面我们简要介绍这两类算法,讨论各算法的优缺点以及在铜锁的工程实现中选择基于费马小定理的求解算法的原因。

1 拓展欧几里得算法求解模逆元

用于求解最大公约数的欧几里得算法最早在欧几里得的《几何原本》中被提出,拓展欧几里得算法是对这一古老算法的扩展。在求解最大公约数的基础上,拓展欧几里得算法通过收集辗转相除过程中的余式,求得线性方程 ax+by=gcd(a,b) 的整数解。由于阶数 n 是一个质数,因此 gcd(a,n)=1,那么该线性方程即转化为 ax+ny=1,恰巧是同余线性方程 ax≡1(mod n) 的一般表示形式,所求的 x 即为 a 的模 n 逆元。

对于现代计算机而言,拓展欧几里得算法的一个缺点是在计算过程中存在大量除法运算,而 CPU 在处理除法运算时的效率通常比其他基本运算 (如加、减、乘) 要低得多。针对这一缺陷,约瑟夫 · 斯提芬于 1967 年提出了二进制拓展欧几里得算法[1], 该算法用简单的移位操作和减法代替了复杂的除法运算。下面是利用二进制拓展欧几里得算法求模 n 逆元的伪代码:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值