椭圆曲线密码学性能提升与形式化验证

密码算法对于在线安全至关重要。在某中心的开放源码密码库中,基于来自另一机构的BoringSSL项目的代码,实现了密码算法。该库为客户提供了针对其硬件进行了安全优化实现的密码算法。

两种日益流行的密码算法是x25519和Ed25519,它们都基于一种称为curve25519的椭圆曲线。为了改善客户使用这些算法的体验,近期对其在该库中的实现进行了深入研究。下文使用“x/Ed25519”作为“x25519和Ed25519”的简写。

在2023年,该中心在该库中发布了多个x/Ed25519的汇编级实现。通过结合自动化推理和最先进的优化技术,这些实现相较于该库中原有的实现提升了性能,并增加了对其实施正确性的保证。

具体而言,使用自动化推理证明了功能正确性,并针对x86_64和Arm64指令集架构的特定CPU微架构进行了优化。同时,尽最大努力确保算法在恒定时间内执行,以抵御通过计算时长推断秘密信息的侧信道攻击。

本文探讨了这项工作的不同方面,包括通过自动化推理证明正确性的过程、微架构优化技术、对恒定时间代码的特殊考虑,以及性能增益的量化。

椭圆曲线密码学

椭圆曲线密码学是一种进行公钥密码学的方法,它使用一对密钥,一个公开,一个私有。最著名的公钥密码方案之一是RSA,其中公钥是一个非常大的整数,相应的私钥是该整数的质因数。RSA方案既可用于加密/解密数据,也可用于签名/验证数据。

椭圆曲线提供了另一种在数学上关联公钥和私钥的方式;有时,这意味着可以更高效地实现方案。虽然椭圆曲线的数学理论既广博又深奥,但密码学中使用的椭圆曲线通常由形式为y² = x³ + ax² + bx + c的方程定义,其中a、b和c是常数。可以在二维图上绘制满足方程的点。

椭圆曲线具有这样的性质:一条与它相交于两点的直线最多与它相交于另一个点。这一性质用于定义曲线上的运算。例如,曲线上两个点的加法可以定义为与该两点共线的第三个点的反射,而不是该第三点本身。

现在,如果曲线上的点坐标对某个整数取模,则该曲线就变成了平面上的散点,但这个散点仍然表现出对称性,因此加法运算仍然有明确的定义。Curve25519以一个大的素数整数命名,具体是2²⁵⁵ – 19。模curve25519素数的一组数字,连同基本的算术运算(如模同一素数的两个数字的乘法),定义了进行椭圆曲线运算的域。

椭圆曲线加法的连续执行称为标量乘法,其中标量是加法的次数。对于密码学中使用的椭圆曲线,如果只知道标量乘法的结果,那么要恢复标量是难解的(前提是标量足够大)。标量乘法的结果成为公钥的基础,原始标量成为私钥的基础。

x25519和Ed25519密码算法

x/Ed25519算法具有不同的用途。x25519算法是一种密钥协商算法,用于在两个对等方之间安全地建立共享秘密;Ed25519是一种数字签名算法,用于签名和验证数据。

x/Ed25519算法已被TLS和SSH等传输层协议采用。在2023年,某国家标准与技术研究院宣布了其FIPS185-6数字签名标准的更新,其中包括增加了Ed25519。x25519算法在后量子安全密码解决方案中也发挥着作用,已被纳入TLS 1.3和SSH混合方案规范中,用于后量子密钥协商。

微架构优化

当为特定CPU架构编写汇编代码时,我们使用其指令集架构。ISA定义了诸如可用的汇编指令、其语义以及程序员可访问的CPU寄存器等资源。重要的是,ISA以抽象术语定义CPU;它没有指定CPU应如何在硬件中实现。

CPU的详细实现称为微架构,每个微架构都有其独特的特征。例如,虽然某中心的两代CPU都基于Arm64 ISA,但它们的微架构实现是不同的。我们假设,如果能够利用微架构的差异,就可以创建出比该库中现有实现更快的x/Ed25519实现。事实证明,这种直觉是正确的。

让我们更深入地看看如何利用微架构的差异。可以在curve25519上定义不同的算术运算,并且这些运算的不同组合被用来构建x/Ed25519算法。从逻辑上讲,必要的算术运算可以考虑为三个层次:

  1. 域运算:在由curve25519素数2²⁵⁵ – 19定义的域内的运算。
  2. 椭圆曲线群运算:应用于曲线元素本身的运算,例如两个点P1和P2的加法。
  3. 顶层运算:通过椭圆曲线群运算的迭代应用实现的运算,例如标量乘法。

每个层次都有自己的优化途径。我们将依赖于微架构的优化重点放在一级运算上,而对于第二和第三级,我们的实现采用了已知的最先进技术,并且在不同的微架构中大体相同。下面,我们总结了在x/Ed25519实现中针对不同微架构所做的不同选择。

对于现代的x86_64微架构,我们使用MULX、ADCX和ADOX指令,这些是标准汇编指令MUL(乘法)和ADC(带进位加法)的变体,通常称为BMI和ADX的指令集扩展中包含这些指令。这些指令的特殊之处在于,当组合使用时,它们可以并行维护两个进位链,据观察这可以将性能提升高达30%。对于不支持这些指令集扩展的较旧的x86_64微架构,我们使用更传统的单进位链。

对于具有改进的整数乘法器的Arm64微架构,我们使用相对简单的教科书式乘法,事实证明这能提供良好的性能。另一代CPU具有较小的乘法器。对于这个Arm64微架构,我们使用减法的Karatsuba乘法形式,它递归地分解乘法。原因是,在这些微架构上,产生128位结果的64x64位乘法相对于其他操作的吞吐量要低得多,这使得Karatsuba优化变得有价值的数字大小要小得多。

我们还优化了所有微架构相同的一级运算。一个例子涉及使用二进制最大公约数算法来计算模逆。我们使用二进制GCD的“divstep”形式,这有助于高效实现,但也使我们面临的第二个目标复杂化:形式化地证明正确性。

二进制GCD是一种迭代算法,有两个参数,其初始值是我们要寻找最大公约数的数字。这些参数以定义良好的方式连续减少,直到其中一个的值达到零。对于两个n位数字,算法的标准实现每次迭代至少总共移除一位,因此2n次迭代就足够了。

然而,对于divstep,确定达到基本情况所需的迭代次数似乎在分析上很困难。最易处理的边界证明使用了基于复杂的“稳定壳”的精心归纳论证,该“稳定壳”可证明地过度逼近二维空间中包含对应于参数值的点的区域。x25519和Ed25519的发明者之一Daniel Bernstein,使用由作者之一创建的证明辅助工具HOL Light,证明了边界的正式正确性。

性能结果

本节将重点介绍性能改进。为简单起见,我们仅关注三个微架构:某中心的两代CPU和某机构的Ice Lake。为了收集性能数据,我们使用了具有匹配CPU微架构的云服务器实例;为了测量每个算法,我们使用了该库的速度工具。

在下图中,所有单位都是每秒操作次数。“之前”柱状图代表该库中现有x/Ed25519实现的性能。“之后”柱状图代表新实现的性能。

  • 对于Ed25519签名操作,在三个微架构上,新实现平均每秒操作数提高了108%。
  • 对于Ed25519验证操作,我们在三个微架构上平均每秒操作数增加了37%。

我们观察到x25519算法的改进最大。请注意,下图中的x25519操作包括x25519密钥交换协议所需的两项主要操作:基点乘法和可变点乘法。

  • 对于x25519,新实现在三个微架构上平均每秒操作数增加了113%。

平均而言,在这三个微架构上,我们看到了86%的性能提升。

证明正确性

我们在一个专门为密码应用设计的整数算术例程库中开发了该库中x/Ed25519实现的核心部分。该库也是我们使用HOL Light证明实现功能正确性的地方。HOL Light是一个用于高阶逻辑的交互式定理证明器,它被设计为具有特别简单的“构造正确性”证明方法。这种简单性保证了任何被“证明”的东西都确实是经过严格证明的,而不是证明器错误的产物。

当我们用汇编语言编写实现时,我们遵循同样的简单性原则。用汇编语言编写更具挑战性,但在证明正确性时提供了一个明显的优势:我们的证明独立于任何编译器。

下图显示了我们用于证明x/Ed25519正确的过程。该过程需要两组不同的输入:首先是我们正在评估的算法实现;其次是证明脚本,它对算法的正确数学行为和CPU的行为进行建模。证明是一系列特定于HOL Light的函数,它们代表证明策略及其应用的顺序。编写证明不是自动化的,需要开发人员的智慧。

根据算法实现和证明脚本,HOL Light要么确定实现是正确的,要么如果无法确定,则失败。HOL Light将算法实现视为一系列机器代码字节。利用提供的CPU指令规范和证明脚本中开发人员编写的策略,HOL Light对执行的正确性进行推理。

持续集成提供了保证,确保在对算法实现代码进行任何更改时,都必须成功通过形式化正确性证明才能提交到该整数算术库的代码仓库。

正确性证明的这一部分是自动化的,我们甚至在该整数算术库的持续集成工作流中实现了它。CI涵盖的工作流在下图中用红色虚线突出显示。CI集成提供了保证,确保没有对算法实现代码的更改可以在不成功通过形式化正确性证明的情况下提交到该整数算术库的代码仓库。

CPU指令规范是我们正确性证明中最关键的成分之一。为了使证明在实践中成立,规范必须捕获每条指令在现实世界中的语义。为了提高这一点上的保证,我们在真实硬件上对指令规范进行随机化测试,“模糊化”不准确之处。

恒定时间

我们将实现和优化设计为将安全作为首要任务。密码代码必须努力避免可能允许未经授权的用户提取私有信息的侧信道。例如,如果密码代码的执行时间依赖于秘密值,那么就有可能从执行时间推断出这些值。同样,如果CPU缓存行为依赖于秘密值,共享缓存的未经授权用户就可能推断出这些值。

我们的x/Ed25519实现以恒定时间为设计目标。无论输入值如何,它们都执行完全相同的基本CPU指令序列,并且避免使用任何可能具有数据依赖定时的CPU指令。

在应用中使用x/Ed25519优化

某中心广泛使用其密码库来支持各种服务子系统中的密码操作。您可以通过在您的应用程序中使用该密码库来利用本文介绍的x/Ed25519优化。访问该密码库的代码仓库,了解更多关于如何将其集成到您的应用程序中的信息。

为了便于开发人员集成,该中心已创建了从该密码库到多种编程语言的绑定。这些绑定通过定义良好的API公开该密码库的密码功能,无需在高级编程语言中重新实现密码算法。目前,该中心已经开源了Java和Rust的绑定——适用于Java的加密提供程序,以及适用于Rust的密码库绑定。此外,我们还贡献了补丁,允许CPython针对该密码库进行构建,并将其用于Python标准库中的所有密码学功能。下面我们重点介绍一些已经使用该密码库来满足其密码需求的开源项目。

我们尚未完成。我们将继续努力提高x/Ed25519的性能,并追求对该整数算术库和该密码库支持的其他密码算法的优化。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值