铜锁 SM2 算法性能优化实践(一)|综述

本文介绍了铜锁社区对SM2算法的性能优化实践,包括预计算优化椭圆曲线多倍点运算、快速模约减和模逆元算法的实现,以及64位平台优化的策略。测试结果显示,开启优化后的SM2数字签名算法签名性能提高了241%-286%,验签性能提高了74%-97%。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图片

文|赵威凯(花名:霄满 )

铜锁开源社区 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 是固定不变的,因此我们可以扩大预计算的规模,并将预计算结果以预计算表的形式写入到源代码中,在运算时查表即可获得预计算值,

<think>嗯,用户问的是如何在Ubuntu系统中安装和配置铜锁(Tongsuo)。首先,我需要回忆铜锁的相关信息。铜锁开源的密码库,之前可能叫做BabaSSL,后来改名了。记得在提供的引用里提到过安装命令,比如用ls查看/opt/tongsuo目录,还有版本更新的信息。 首先,安装步骤可能需要从源码编译,因为很多开源库都是这样安装的。用户可能已经安装了必要的依赖,比如gcc、make、openssl这些。不过可能需要先安装依赖项,比如build-essential、git、perl这些。然后,下载源码,可能通过git clone或者下载预发布版本。引用里提到8.4.0-pre2版本,所以用户可能需要从官方仓库获取代码。 接下来是配置和编译。通常的步骤是运行./config或者./Configure,然后make和make install。铜锁可能有些特定的配置选项,比如启用特定的算法或者硬件加速。引用中提到了半同态算法、零知识证明和硬件加速,所以在配置时可能需要启用这些功能。 安装完成后,验证是否成功,可能需要检查/opt/tongsuo目录是否存在,或者运行版本命令。另外,配置动态链接库路径,让系统找到铜锁的库文件,可能需要编辑ld.so.conf或者设置LD_LIBRARY_PATH环境变量。用户可能需要这些步骤,否则运行时找不到库。 测试部分,可能需要写个简单的C程序,链接铜锁的库,并运行。例如调用某个函数来确认安装正确。如果有问题,可能需要检查路径是否正确,权限是否足够,或者依赖是否满足。 用户的问题还可能涉及到配置,比如如何让应用程序使用铜锁而不是系统自带的OpenSSL。可能需要设置编译时的链接路径,或者在代码中包含铜锁的头文件。 另外,引用中提到铜锁删除了不常用的算法,用户需要注意是否他们的应用需要这些算法。还有漏洞修复,说明新版本可能更安全,但也要考虑兼容性。 可能用户会遇到的问题包括依赖项缺失、权限问题导致安装失败、动态链接库未正确配置等。需要提醒用户检查这些方面,或者提供常见问题解决方法。 最后,生成相关问题时要考虑用户可能进步想知道的内容,比如验证安装、使用示例、切换版本、卸载方法,或者特定功能的启用,比如半同态算法或硬件加速的支持。</think>### 如何在 Ubuntu 系统中安装和配置铜锁 #### 1. 安装依赖 首先安装编译和运行所需的依赖库: ```bash sudo apt update sudo apt install -y build-essential git perl gcc make ``` #### 2. 下载铜锁源码 从官方仓库克隆代码(若需特定版本如8.4.0-pre2,可通过标签切换): ```bash git clone https://github.com/Tongsuo-Project/Tongsuo cd Tongsuo git checkout 8.4.0-pre2 # 切换到指定版本 ``` #### 3. 配置和编译 启用常用功能(如半同态算法、硬件加速)并指定安装路径: ```bash ./config --prefix=/opt/tongsuo enable-ntt enable-ec_elgamal enable-ippcp make -j$(nproc) sudo make install ``` #### 4. 验证安装 检查安装目录和版本: ```bash ls -l /opt/tongsuo # 查看安装文件[^1] /opt/tongsuo/bin/openssl version # 显示版本信息(如Tongsuo 8.4.0-pre2) ``` #### 5. 配置动态链接库 更新系统库路径: ```bash echo "/opt/tongsuo/lib" | sudo tee /etc/ld.so.conf.d/tongsuo.conf sudo ldconfig ``` #### 6. 环境变量设置(可选) 在`~/.bashrc`中添加路径: ```bash export PATH="/opt/tongsuo/bin:$PATH" export LD_LIBRARY_PATH="/opt/tongsuo/lib:$LD_LIBRARY_PATH" ``` #### 7. 测试示例 编写测试程序`test_ntt.c`: ```c #include <tongsuo/ntt.h> int main() { // 调用NTT相关函数 return 0; } ``` 编译并运行: ```bash gcc -I/opt/tongsuo/include -L/opt/tongsuo/lib -lntt -o test_ntt test_ntt.c ./test_ntt ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值