之前写过一篇分析RSA量子算法的文章,但关于离散对数问题的部分一直没填上。今天正好借这个机会把这个坑补上。实际上,系统而详细地讲解如何用Shor算法破解椭圆曲线密码学(ECC)的资料非常少,本文可以算得上是独一份了。
我们都知道,RSA算法的安全性基于大数质因数分解这一难题。而椭圆曲线密码学的安全,则主要依赖于椭圆曲线离散对数问题(ECDLP)的难解性。
不过,用Shor算法的思想来破解ECC会相对更复杂一些:算法设计本身更繁琐,量子电路的复杂度更高,并且需要更多的量子比特。因此,这篇文章理解起来可能会比RSA那篇稍难一点,但我会在保证严谨的基础上,尽量让它通俗易懂。
在之前的文章里,我们详细讨论了如何利用Shor量子算法攻破RSA加密体系,也点破了RSA脆弱性的本质:周期性。Shor算法正是这种“周期性漏洞”的量子攻击武器。今天,我们就将这把“量子武器”对准椭圆曲线加密算法,并对其攻击过程进行深入分析。本文首发于云栈社区,旨在探讨前沿技术对现有安全体系的挑战。
一、ECC加密算法简介
椭圆曲线密码学(Elliptic Curve Cryptography, ECC)是一种基于椭圆曲线数学结构的公钥加密技术。与传统的RSA相比,ECC能在更短的密钥长度下提供同等甚至更高的安全性。例如,一个256位的ECC密钥,其安全强度大致相当于一个3072位的RSA密钥。因此,ECC特别适合在计算能力、存储空间和带宽受限的环境中使用,如移动设备、物联网芯片和区块链系统,目前被广泛应用于数字签名(ECDSA)、密钥交换(ECDH)和加密传输等关键领域。
在分析量子破解方法前,有必要先简单介绍一下椭圆曲线及其加密的基本原理。所谓椭圆曲线,是满足以下方程的一系列曲线:

其中,参数a和b是定义曲线的常数,并且必须满足4a³ + 27b² ≠ 0以确保曲线没有奇点(即曲线是光滑的)。
对于比较简单的椭圆曲线 y² = x³ - x + 1,大概长这样:

为了利用椭圆曲线的特性来构造非对称加密,我们首先需要在椭圆曲线上定义点的加法和标量乘法运算。

注意,我们定义椭圆曲线上的点加运算和标量乘法运算,是为了构建一个代数结构(群),从而使得椭圆曲线可以用于密码学。具体来说,椭圆曲线上的点加上一个特殊的“无穷远点”构成一个阿贝尔群(交换群)。
例如,点加运算定义了椭圆曲线上两个点相加的几何和代数规则,结果仍然是曲线上的点。这个运算满足群的所有性质:
- 封闭性:两个点相加的结果还是曲线上的点。
- 结合律:(P + Q) + R = P + (Q + R)。
- 单位元:存在无穷远点 O,使得 P + O = P。
- 逆元:每个点 P 都有逆元 -P。
- 交换律:P + Q = Q + P。
而标量乘法,就是通过重复点加运算,定义整数k与点P的乘法,即k个P相加。这是椭圆曲线密码学中的核心运算,因为从公钥(点Q)和基点G恢复私钥k(整数)的困难性(即椭圆曲线离散对数问题)保证了算法的安全性。

基于以上运算法则,我们就可以实现ECC的加解密,过程如下:

椭圆曲线密码学的安全性建立在椭圆曲线离散对数问题(ECDLP)的难解性上,其核心是标量乘法计算上的严重不对称性:正向计算容易,逆向求解极难。具体来说,在当前的ECC加密算法中,已知公开的基点G和通过标量乘法得到的公钥 Q = k·G,想要逆向推导出私有密钥k所需要的计算量,远远超出了经典计算机的能力极限。
目前,已知最有效的用于求解ECDLP的经典算法(如Pollard Rho算法)所需要的时间复杂度也是指数级或亚指数级的。

二、周期性分析
在之前的文章中,我们通过构建Shor量子算法来寻找RSA代数结构中的周期,从而实现大数的因式分解。构造Shor算法的本质就是寻找周期。理论上,任何一个核心代数结构中存在周期性的加密算法,Shor算法都可以在多项式时间复杂度下完成攻击。
既然定义了点加运算和标量乘法的椭圆曲线本质上构成了一个阿贝尔群,那么基于有限域的椭圆曲线加密算法自然也存在一个周期。但在RSA中,周期性是比较直接可见的(模幂运算),而在ECC中,这个周期性相对隐蔽,需要我们通过特定的方式“找”出来。这个方法就是引入一个二元函数,通过简单的变换就能观察到这个函数在二维平面上的周期。
我们定义函数:f(a, b) = a·G + b·Q。将 Q = k·G 代入可得:f(a, b) = (a + b·k)·G。

也就是说,函数在整数平移 (a, b) → (a - ks, b + s) 下保持不变。因此,我们通过制备一套量子叠加态系统,利用量子纠缠、量子测量以及量子傅里叶变换(QFT),就可以把f(a, b)的空间周期性转换为动量空间的尖峰,从而可以迅速地找到私钥k。
三、构造量子算法
接下来,我们将一步一步地设计并实现这样的量子算法。下图为解决ECC的Shor算法量子电路图(简化示意图)。

1. 初始化量子寄存器
首先我们需要两个量子寄存器用于存储编码的信息(实际还需要临时存储点加法中间结果,所以需要更多的辅助寄存器,此处简化不考虑)。

2. 实现函数f的量子黑盒(Oracle)
对于我们定义的函数:f(a, b) = aG + bQ,由于椭圆曲线点群是阿贝尔群,所以aG + bQ也是椭圆曲线上的一个点。我们需要通过设计一个特殊量子电路来计算该函数的结果。

通过量子电路可以在量子叠加态上计算函数f(a, b) = aG + bQ的结果,然后将结果存储到寄存器Reg1中。
3. 测量寄存器1(函数值寄存器)
现在,测量寄存器Reg1,Reg1会随机坍塌到某个m值的状态,然后可以计算得到曲线点Q‘ = m · G。

由于两个寄存器处于纠缠态,因此测量Reg1时,寄存器Reg2(存储(a, b)的寄存器)会坍缩到所有满足f(a, b) = Q‘ 的(a, b)对的叠加态上。这个叠加态中包含了我们需要的周期信息。
4. 量子傅里叶变换分析
现在需要对reg2(大小为2t个量子比特)应用量子傅里叶变换以提取出周期信息。

5. 寄存器2测量与概率分布


当 r = 1 时,每个波峰刚好位于 γ 处即 d - kc = 2^t · l (l为整数)。由于 c, d ∈ [0, 2^t - 1],因此我们得到同余方程为:kc ≡ d (mod 2^t)。这是产生相长干涉的峰值条件。注意,在这种情况下,我们对Reg2测量后得到的c, d值是刚好满足同余方程的,通过经典处理就可以很容易地得到 k 的值。
四、概率分析
1、概率下限
下面为了计算非理想情况(测量存在误差)下成功找到k的概率下限,我们在方程中加入微调参数δ进行分析。

通常由于n(基点阶)较大,因此这个下限概率非常小,但这保证了我们至少有一定的成功几率,并且可以通过多次运行算法来提高总体成功概率。
2、概率上限:

理论分析表明,即使在最坏情况下,单次运行算法得到有用结果的概率也有一个可观的下限(例如计算得到约20%),这使得Shor算法在多项式时间内破解ECC成为可能。
五、实例分析
这里通过一个具体的极小参数例子,来演示如何使用Shor算法破解椭圆曲线密码。请注意,所有参数都非常小,仅用于演示原理。
1. 选择一条椭圆曲线和参数

2. 应用 Shor 算法

然后我们开始实验:

3、经典后处理得到私钥
假设我们进行了多次实验,测量得到了一些数据对:

根据同余方程 kc ≈ d (mod 2^t) 得到方程组。由于私钥范围是 0 ≤ k < 7,可以验证 k = 3 满足所有方程。
但现实中量子计算机存在显著的噪声和误差,这会导致非整数情况,那我们该如何处理?比如我们测量得到: (c, d) = (29, 88),此时 d − kc = 1,无法整除。此时我们需要通过连分数展开等经典后处理方法来逼近真实的私钥k。

本例子是一个简单的演示,以便帮助大家理解Shor算法利用量子特性破解椭圆曲线密码的过程。
六、总结

总算完结了。通过上面的分析可以看出,整个算法过程连分数展开是多项式时间的,而量子部分需要 O(t) 个量子比特 t = O(log n),而量子黑盒(计算椭圆曲线点加和标量乘)的电路深度是 O(m²) 或 O(m³)(其中 m = O(log p)是域元素的比特长度,p 是定义域的素数,n 是阶,通常 log p ≈ log n)。因此,总量子门复杂度为多项式级别 O((log n)³)。
在量子算法层面,椭圆曲线的量子电路远比RSA复杂,因为我们必须实现椭圆曲线点加法和标量乘法的量子电路,还需要实现有限域上的算术运算(模加、模乘、模逆),这需要大量辅助量子比特和量子门。目前量子计算机所制备的量子比特数还不足以运行实际参数的算法,例如,破解256位ECC需要数千个逻辑量子比特,而为了实现量子纠错,至少需要上百万个物理量子比特才有可能实现真正效果。
参考文章:
- Shor, P.W. (1994). “Algorithms for quantum computation: discrete logarithms and factoring“. Proceedings 35th Annual Symposium on Foundations of Computer Science. IEEE Comput. Soc. Press: 124–134.
- https://eprint.iacr.org/2017/598.pdf
- https://arxiv.org/abs/quant-ph/0301141