文|赵威凯(花名:霄满 )
铜锁开源社区 Developer
负责国产化密码库 Tongsuo 的开发和维护
专注于密码学、国密算法等领域
本文 5264 字 阅读 12 分钟
背景
椭圆曲线公钥密码算法 (Elliptic Curve Cryptography,ECC) 是一种基于椭圆曲线离散对数难题的非对称加密算法,广泛运用于数字签名、密钥交换、加密通信、证书签发等场景。国家密码管理局于 2010 年 12 月 17 日发布了国产自主可控的椭圆曲线公钥密码算法——SM2 算法,有力保障了我国重要经济系统密码应用安全和行业信息系统安全。经过十几年的发展,SM2 算法的应用场景不断深入拓展,形成了良好的国密生态,OpenSSL、Linux 内核等业内知名开源项目已经接纳了 SM2 算法并运用于实际生产环境中。
随着信息技术的不断发展和区块链、Web 3.0 等新兴产业的崛起,业界对于 SM2 算法的性能要求日益提高,特别是与加密通信、证书签发验证、区块链区块构造等直接相关的 SM2 数字签名算法,其性能表现对应用的整体性能有很大影响。遗憾的是,以 OpenSSL 为代表的密码学工具对 SM2 算法的性能优化进展缓慢,不利于 SM2 算法应用场景的进一步拓展。以 OpenSSL 3.0.3 版本为例,在 Apple M2 pro 芯片上运行 SM2 算法,其签名和验签性能约为 6000 次/秒,在高负载场景下将成为系统的性能瓶颈。
作为全球首个通过商用密码产品认证的国产密码学开源项目,铜锁相应地开展了 SM2 算法性能优化的探索研究。受 OpenSSL 中针对部分常用曲线实现特化算法的启发,借鉴 NIST 曲线在 64 位平台上的抗侧信道攻击工作,铜锁基于 SM2 曲线和 GM/T 0003.5-2012 给定的推荐参数, 在保证抗侧信道攻击安全性的前提下,实现了兼容大部分 64 位架构和常见编译器的 64 位平台性能优化,辅以 SM2 曲线参数特化的快速模约减、模逆元算法进一步提高性能。测试结果表明,在不同的测试工具和测试场景下,开启了 64 位平台优化的 SM2 数字签名算法,其签名性能较基线版本提高约 241%-286%,验签性能提高约 74%-97%,峰值性能分别可达约 2.3 万次/秒、约 1.2 万次/秒。
优化技术路线分析与设计
作为椭圆曲线非对称加密算法的一类,SM2 算法在计算数字签名时所执行的操作与其他椭圆曲线类似,主要涉及有限域运算、椭圆曲线运算和数字签名运算三大类计算操作,三类操作之间自底向上形成层级调用关系。经过抽象算法结构和筛选主要运算后,我们绘制出如图 1 所示的核心运算层次图:
图 1:SM2 数字签名算法核心运算层次图
若要着手实现 SM2 性能优化,其关键在于如何提升图 1 所示的核心运算的计算效率。由于数字签名的具体步骤由国密标准定义,可优化的潜力不大,因此我们首先分析了铜锁中与 SM2 相关的椭圆曲线和有限域运算源码。在铜锁中,与上述运算相关的各类函数以函数指针的形式封装在 EC_method
结构体中,根据曲线和优化方式不同,函数指针指向的具体函数也有差异。SM2 与大多数曲线类似,采用通用的基于蒙哥马利模乘法优化素数域运算的方式,相关函数封装在结构体 mont_method
中。
蒙哥马利模乘法显著提升了各类曲线的性能,但由于现有代码中给出的是通用实现,故而仍有可挖掘的性能优化空间。事实上,OpenSSL 针对部分使用频率高、应用范围广的椭圆曲线 (nistp224、nistp256、nistp521 曲线) ,在 64 位平台上相应实现了优化功能,取得了很好的优化效果 (根据曲线不同,大约有 50%-200%的性能提升) 。推而广之,可以认为 SM2 曲线也存在类似的优化潜力。在充分阅读 NIST 曲线优化源码和 SM2 现有代码后,我们汇总了一些有较大潜力的性能优化点,自顶向下分别是:
1、采用预计算优化椭圆曲线多倍点运算。 多倍点运算可以分为两类:基于固定基点 G 的基点乘法运算和基于任意曲线点 P 的点乘运算,其本质都是一个 256 位大整数 k 与椭圆曲线点做标量乘法的过程。
-
针对点乘运算,可以预计算小整数 (例如 0、1、2……) 与点 P 做点乘的结果,然后将大整数 k 划分为等长的 n 段数,每一段数的值都落在预计算结果内,再通过移位和点加法运算组合得到最终运算结果。
-
针对基点乘运算,由于椭圆曲线点 G 是固定不变的,因此我们可以扩大预计算的规模,并将预计算结果以预计算表的形式写入到源代码中,在运算时查表即可获得预计算值,