想象你面前有一把巨大的节拍锁:它由两个数字相乘而成,锁上的机关只认这两把“钥匙”。经典计算机想开门,只好从 1 开始一把一把试钥匙,数位一长,试到宇宙终结也试不完。Shor 算法则像一位听觉敏锐的节奏猎人:他不去试钥匙,而是让锁发出叮叮咚咚的模指数回响,再用量子傅里叶变换这支“频谱听诊器”捕捉回响的周期。找到周期,两把钥匙就会自己从最大公约数中浮现。整个过程在多项式时间内完成,让原本坚不可摧的 RSA 加密变成一串可以被解开的密码节拍。本文就用这把节拍锁贯穿始终:先讲锁为什么难开,再讲猎人如何找到周期,最后讲如何换一把新锁。
理解 Shor 算法的周期查找思路,是踏入量子算法与量子安全设计的第一步;它能让你在量子时代真正发生时,看懂哪些密码会倒塌、哪些能继续存活。
可视化演示
展示Shor算法核心:周期查找f(x)=a^x mod N转化为因数分解、量子傅里叶变换QFT提取周期、RSA公钥密码体系的量子威胁与多项式级加速。
本节配有交互动效(进入视口后自动加载,约 3KB)。
周期查找与因数分解 选择a与N互质,计算f(x)=a^x mod N的周期r 若r为偶数且a^(r/2)≠-1 mod N,则gcd(a^(r/2)±1,N)给出因子 f(x) = a^x mod N, period r → gcd(a^(r/2)±1, N) = p or q 周期查找将因数分解归约为多项式可解问题
分解难题
节拍锁的锁芯是一道乘法题:取两个很大的质数 p、q,相乘得到 N。乘是秒秒钟的事——3×5=15,小学生都会。可如果只给你 15,要你找回 3 和 5,你就必须从 1、2、3 一路试除。数位从两位数变成几百位,试除的次数就像星际尘埃一样多。
这个“容易乘、难拆开”的性质,正是 RSA 公钥密码体系赖以生存的地基。经典数论算法中,普通试除法是指数级复杂度;最快的通用数域筛法虽然比试除好得多,但仍然是亚指数时间。当 N 是 2048 位二进制整数时,经典算法需要的运算量远超现实宇宙能完成的次数。
Shor 算法把“分解 N”这个硬任务转换成了一个更巧妙的节奏任务:只要找到某个模指数序列的周期,分解便唾手可得。这正是量子计算机最擅长的地方。
所以,分解难题的本质不是数学上不可能,而是经典地图太大。节奏猎人的第一课就是:不去一条路一条路找钥匙,去寻找藏在乘法背后的节拍。
- 公开锁体 NN 是我们要分解的大合数,等于两个质数的乘积。
- 第一把钥匙 pN 的一个质因数,私密且无法从表面看出。
- 乘法连接连接 p 和 q 的数学运算,正向计算极其容易,逆向寻找非常困难。
- 第二把钥匙 q另一个质因数,与 p 一起决定锁的结构。
周期查找
节奏猎人不会站在锁前发呆,他先随机选一个小于 N 且与 N 互质的数字 a,把它当作节拍种子。接下来反复做模运算:a^1, a^2, a^3, … 每次结果都落在 0 到 N-1 之间。对一个合数 N 来说,这条序列迟早会回到起点,从此开始循环。循环的长度就是周期 r。
举个例子:N=15,选 a=2,序列是 1,2,4,8,1,2,4,8……每 4 步回到 1,于是周期 r=4。如果我能测出 r=4,就能用经典后处理中的最大公约数技巧把 15 拆成 3×5。这里的关键是:直接分解 N 很难,但计算模指数序列的周期反而有快速的量子办法。
为什么周期值得找?因为数论里有一条定理:当 r 为偶数且 a^{r/2} 在模 N 下不等于 -1(即不等于 N-1)时,a^{r/2}±1 与 N 的最大公约数就会暴露两个非平凡因子。量子部分的任务因此被简化为:在超大 N 上,只输出一个周期 r。
有了周期,猎人等于找到了乐谱中的反复记号。下一步,需要一架能听见超大序列节奏的仪器——量子傅里叶变换。
- 随机种子 a选择与 N 互质的整数,作为序列起点与底数。
- 模指数函数 f(x)x 每加一,就把当前结果再乘一次 a 并取余数 N,形成周期序列。
- 回到 1 的时刻当 x=r 时序列重新出现 1,这就是重复节拍的标记。
量子傅里叶变换
普通傅里叶变换从一段旋律中分解出频率;量子傅里叶变换则在一群量子态的“合奏”里,把隐藏的周期变成明显的尖峰。想象舞台上几千个舞者同时按各自的相位旋转,QFT 就像一次整齐的定格:与周期合拍的舞者恰好同相,越叠越高;不合拍的则互相抵消、归于沉寂。
具体来说,QFT 把基态 |x⟩ 变成所有基态 |y⟩ 的带相位叠加。叠加系数的模长处处都一样,但相对相位以 2πxy/N 旋转。当输入的是一个具有周期 r 的态叠加时,各相位在 y 接近 N/r 的整数倍处同相叠加,振幅出现高峰。测量后,我们得到的就是“频率尖峰”的位置。
这个干涉过程是 Shor 算法的量子优势核心:经典计算机需要逐个观察序列,量子计算机只用多项式量级的量子门,就能让所有可能输入同时在干涉仪中走一遍。
尖峰一旦出现,节奏猎人就知道乐谱的反复记号在哪里。但 QFT 只在量子舞台上工作,下一步是用量子门把它搭出来。
- 基态 |x⟩输入的量子态,编码了序列里的某一拍位置。
- 归一化系数 1/√N保证所有叠加态的总概率为 1,像合唱团人数归一。
- 对所有 y 求和输出态是所有可能频率的叠加,每个频率对应频谱上的一根柱子。
- 旋转相位 e^{2πixy/N}频率 y 的相位取决于输入位置 x,不同 x 互相干涉后形成尖峰。
- 输出态 |y⟩测量后最容易读到的 y 与周期 r 有关,通常落在 N/r 的倍数附近。
量子电路实现
要让节奏猎人的耳朵变成电路,我们需要为量子舞者编舞:先把所有舞者送进叠加态;再用一排受控-U 门让她们按 a 的幂轮流旋转;最后用逆 QFT 把旋转的相位汇聚成尖峰。整支舞蹈只需要多项式量级的基本动作。
电路中最重要的积木是受控模乘门 U,它实现 x → ax mod N。为了完成 a^x mod N,Shor 电路不是直接把 a 乘 x 次,而是用快速幂技巧:预先准备 a, a², a⁴, …, a^{2^{L-1}} 的模值,再根据 x 的二进制位决定是否让对应旋转器启动。这就像把舞步拆成二进制的“如果位是 1 就转半圈”。
电路结束后,对量子寄存器做测量,得到的是一个与 N/r 有关的数。因为叠加态在测量时坍缩,我们只能得到一次采样;但少量重复几次就足以用经典连分数还原周期 r。整个流程由经典控制器协调,量子部分只负责产生“频率尖峰”。
跳完这支舞,舞者已经悄悄把节奏信息写进了相位里。接下来,经典后处理要把最后这一串舞步翻译成钥匙。
- 模乘门 U把 |x⟩ 变成 |ax mod N⟩,一个基本的舞步变换。
- 幂次 2^j用重复平方技巧计算 a 的 2 的幂次方模 N,而不是乘 x 次。
- 受控执行当控制寄存器某一位为 1 时,就执行 U^{2^j};这一位对应 x 的二进制位。
经典后处理
量子部分输出的不是 p、q,也不是周期 r,而是一个“频率样本”y。经典后处理接过这个样本,用连分数展开把 y/N 约成最接近的分数,分母就能给出 r 的估计。这一步就像猎人听出鼓点后,用节拍器反推出每小节有几拍。
拿到 r 后还要做一次“钥匙配对”:如果 r 是偶数,计算 a^{r/2} mod N;若结果不是 N-1(即模 N 下不是 -1),则计算 gcd(a^{r/2}-1,N) 和 gcd(a^{r/2}+1,N)。数论保证这两个数的乘积就是 N,于是分解完成。若条件不满足,就换一个随机 a 重来,成功的概率通常超过 1/2,因此重复几次即可。
经典后处理是整条流水线的“翻译官”:量子部分提供概率性的频谱尖峰,经典部分用确定性算法补完分解。没有它,即便有了尖峰也无法变成 p 和 q。
至此,节拍锁被彻底拆开。这个方法不仅威胁 RSA,也是理解“量子优势究竟赢在哪”的最好窗口:不是更快地蛮力,而是把数学结构转换成可测量的节奏。
- 半周期 a^{r/2}周期 r 的中点是关键跳板,它的左右邻居分别暴露两个因数。
- 减一求 gcd计算 a^{r/2}-1 与 N 的最大公约数,得到其中一个因数。
- 加一求 gcd计算 a^{r/2}+1 与 N 的最大公约数,得到另一个因数。
- 乘积回到 N两个最大公约数相乘,把锁还原成最初的模样。
RSA威胁
现在回到我们的节拍锁。RSA 正是用因数分解的难度铸造的:N 公开,任何人都可以把消息 m 加密成密文 c;但解密需要私钥 d,而 d 只能由知道 p、q 的人算出。在 Shor 算法出现之前,这几乎等于“知道锁体,找不到钥匙”;Shor 出现后,只要能运行足够大的容错量子计算机,锁就可以被节奏猎人打开。
具体来说,RSA 中公钥是 (e,N),私钥满足 d=e^{-1} mod φ(N),其中 φ(N)=(p-1)(q-1)。一旦 Shor 分解出 p、q,攻击者就能算出 φ(N),进而算出 d,于是所有密文都可被解密、签名可被伪造。攻击成本随 N 的位数增长是多项式,而不是指数。
但要注意“足够大的容错量子计算机”这个前提:破解 2048 位 RSA 需要数千个逻辑量子比特,算上纠错开销约数百万物理量子比特。今天的量子计算机还差得很远。Shor 的威胁是战略性的,不是今晚就会发生。
所以,RSA 不是被暴力破解,而是被“重新认识”:Shor 让锁的数学结构变成可闻的节奏,锁芯的秘密便无处可藏。这正是量子优势最锋利的一刀。
- 加密 c=m^e mod N任何人用公钥 e 把消息 m 锁进密文 c。
- 解密 m=c^d mod N私钥 d 把密文 c 还原成消息 m。
- 私钥依赖因数d 只有通过 φ(N) 才能求出,而 φ(N) 来自 p、q。
后量子密码
既然老式节拍锁不安全,那就换一种不受周期启发的锁。后量子密码并不依赖“乘法容易、分解难”,而是依赖格、编码、多变量、哈希等数学难题。即使攻击者能运行大型量子计算机,也找不到把“锁体”翻译成“节奏”的捷径。
NIST 在 2024 年正式发布了第一批后量子标准:ML-KEM(原 Kyber)用于密钥封装,ML-DSA(原 Dilithium)用于数字签名,它们都建立在格上的 Module-LWE 问题。一个典型问题是:已知矩阵 A 和向量 b=A s+e,要恢复秘密 s,其中 e 是极小的随机噪声。经典和量子算法都很难在多项式时间内解决。
迁移不是“把锁换掉”那么简单:企业需要盘点所有使用 RSA 和椭圆曲线的地方,引入混合模式(经典+后量子并行),并在性能、兼容性和抗量子安全性之间取舍。对 AI 从业者来说,这意味着未来数据管道中的身份认证、模型加密和联邦学习都需要 PQC 加持。
从节拍锁到格点迷宫,密码学完成了一次“反量子进化”。对普通用户来说,过渡期内新旧锁会同时挂着:先是双锁并行,最终全部换成格锁。理解了 Shor,你也就理解了为什么要进行这场迁移。
- 公开矩阵 A一个公开的整数矩阵,像锁面上整齐排列的格点。
- 秘密向量 s真正要保护的钥匙,藏在高维空间中。
- 小误差 e让方程变成“近似问题”的小扰动,是后量子困难的关键。
- 公开结果 b带误差的乘积被公开发布,观察者无法反推出 s。
AI 应用场景
场景一:量子风险扫描与密码资产盘点
阶段:安全评估与威胁建模
解决的问题:传统方式用静态规则扫描证书库,无法识别哪些算法在 Shor 面前高危;AI 辅助平台自动提取证书、公钥和签名算法,按密钥长度与算法家族打分,并推荐迁移优先级。
具体案例:某大型银行对全行 TLS 证书和代码签名证书做普查,用规则加机器学习聚类识别出 3000 张 2048 位 RSA 证书,并把对外服务列入第一批 Kyber 混合改造范围。
场景二:后量子混合加密的密钥生命周期管理
阶段:密钥生成、轮换与自动化运维
解决的问题:手动切换加密库容易遗漏内部服务,传统密钥轮换也不考虑量子风险;AI 编排系统自动识别公钥算法,在 TLS 握手中优先选择 ML-KEM 与 RSA 混合套件,若密钥强度不足则触发无感轮换。
具体案例:某云服务商在 VPN 网关上启用 X25519Kyber768 混合套件,用脚本加 AI 巡检每周扫描握手失败率,两周内完成 90% 内部服务迁移。
Python 演示
import mathimport random class ShorClassicalSimulation: """Classical emulation of Shor's period-finding step for small N.""" def __init__(self, n): self.n = n def _find_period(self, a): x = 1 step_count = 0 seen = {} while x not in seen: seen[x] = step_count x = (x * a) % self.n step_count += 1 return step_count - seen[x] def _try_factor(self, a): if math.gcd(a, self.n) != 1: return math.gcd(a, self.n), self.n // math.gcd(a, self.n) r = self._find_period(a) if r % 2 != 0: return None half = pow(a, r // 2, self.n) if half == self.n - 1: return None p = math.gcd(half - 1, self.n) q = math.gcd(half + 1, self.n) if p * q == self.n: return p, q return None def factor(self, max_trials=30): for _ in range(max_trials): a = random.randint(2, self.n - 2) result = self._try_factor(a) if result: return result raise RuntimeError("failed to factor") if __name__ == "__main__": simulator = ShorClassicalSimulation(15) p, q = simulator.factor() print("p = {}, q = {}, p * q = {}".format(p, q, p * q))
r = self._find_period(a)用经典暴力代替量子部分,模拟量子测量给出的周期。half = pow(a, r // 2, self.n)把半周期算出来,模幂运算避免超大数膨胀。p = math.gcd(half - 1, self.n)半周期减 1 与 N 取最大公约数,分离出第一个因数。q = math.gcd(half + 1, self.n)加 1 与 N 取最大公约数,分离出第二个因数。if p * q == self.n:校验两把钥匙乘积确实是锁体,才接受分解结果。a = random.randint(2, self.n - 2)随机选择底数,提高找到有效周期的概率。
常见误区
误区我经常看到新闻说“量子计算机破解 RSA”,以为现在任何一台量子计算机跑一下 Shor 算法就能把 2048 位密钥拆开。
正解Shor 算法确实是多项式时间,但“能跑”和“跑得动”是两回事。当前量子硬件只有几百个物理量子比特,且噪声很大;破解 2048 位 RSA 需要数千个逻辑量子比特,算上纠错要数百万物理量子比特。算法是对的,但工程还远未到位。
为何常见:媒体常把“算法突破”和“工程实现”混为一谈,读者很容易忽略容错量子计算的前提。
误区我以为只要量子傅里叶变换输出一个数字,这个数字就是周期,然后拿它去乘除就能得到 p、q。
正解QFT 测量得到的是频率样本 y,不是周期 r 本身。经典后处理需要先用连分数把 y/N 还原成近似分数,得到 r;然后还要检查 r 是否为偶数、a^{r/2} 是否是 -1,最后用最大公约数提取因数。任何一步不满足都要换 a 重试。
为何常见:简化讲解时常常跳过经典后处理,让人误以为量子部分直接输出了答案。
误区既然 Shor 能分解大整数,那把 RSA 密钥从 2048 位加到 4096 位、8192 位,不就能对抗量子计算机了吗?
正解不能。Shor 算法是多项式时间,密钥长度增加只会让攻击时间多项式增长,而不是指数增长。后量子密码换成格、编码、哈希、多变量等完全不同的困难问题,目的就是让量子计算机没有类似“周期查找”的捷径可走。
为何常见:人们习惯用“加长密钥”对抗经典算力增长,但这个直觉不适用于结构性的量子算法突破。
误区我以为 QFT 像经典傅里叶变换一样,输入一个确定性信号,输出就是确定的频谱图,直接读出周期。
正解QFT 操作的是量子叠加态,输出仍然是一个叠加态。测量会以一定概率坍缩到某个频率样本,所以需要重复采样,再用经典统计和连分数还原周期。概率性不是 bug,而是量子算法与经典后处理配合的特性。
为何常见:经典信号处理课程中的傅里叶变换是确定性的,切换到量子语境后,人们容易忘掉测量坍缩这一关键差异。
面试题
Q1. Shor 算法主要解决下列哪个经典难题?
- A.大整数的因数分解← 正确答案
- B.矩阵特征值计算
- C.图的最短路径搜索
- D.大规模数据排序
答案:A。Shor 算法的核心是把大整数分解转化为周期查找,选项 A 正确。B、C、D 虽然也有量子算法研究,但不是 Shor 算法的标志性目标。
Q2. 周期查找中,f(x)=a^x mod N 的周期 r 满足哪条关系?
- A.a^r 与 1 模 N 同余← 正确答案
- B.a^r 等于 a 的 N 倍
- C.f(r) 等于 r 的因数
- D.r 等于 N 的位数
答案:A。周期 r 的定义是序列重复,等价于 a^r ≡ 1 (mod N)。B、C、D 都不符合模指数循环的性质。
Q3. 量子傅里叶变换在 Shor 算法中的角色是?
- A.把周期信号变成频谱尖峰← 正确答案
- B.直接计算最大公约数
- C.把量子比特数减少一半
- D.对密文做对称加密
答案:A。QFT 通过相位干涉让周期相关的频率同相叠加,形成尖峰。最大公约数是经典后处理里做的,B 错误;QFT 不负责减少比特数或加密,C、D 错误。
Q4. 下列哪些条件满足时,经典后处理能成功分解 N?
- A.周期 r 为偶数← 正确答案
- B.a^{r/2} 在模 N 下不为 -1← 正确答案
- C.周期 r 为奇数
- D.随机底数 a 与 N 互质← 正确答案
答案:ABD。Shor 要求 a 与 N 互质,r 为偶数且 a^{r/2} 不是 -1,这样 gcd(a^{r/2}-1,N) 和 gcd(a^{r/2}+1,N) 才能给出非平凡因数。r 为奇数是失败条件,C 错误。
Q5. 在 Shor 算法中,测量 QFT 输出后通常需要哪一步来还原周期?
- A.连分数展开← 正确答案
- B.快速排序
- C.梯度下降
- D.交叉验证
答案:A。测量得到频率样本 y,连分数展开可以把 y/N 约成最接近的分数,分母就是周期 r 的估计。B、C、D 不是数论后处理步骤。
Q6. RSA 私钥 d 与公钥指数 e 的关系是?
- A.d 是 e 在模 φ(N) 下的逆元← 正确答案
- B.d 是 e 与 N 的乘积
- C.d 是 e 除以 N 的余数
- D.d 是 e 的平方根
答案:A。RSA 中 d=e^{-1} mod φ(N),这样才能满足 m^{ed} ≡ m (mod N)。B、C、D 都没有保证加密解密互逆。
Q7. 后量子密码通常依赖哪些数学困难问题?
- A.格上的带误差学习问题← 正确答案
- B.纠错码的解码问题← 正确答案
- C.大整数的因数分解
- D.哈希函数的原像问题← 正确答案
答案:ABD。LWE、编码解码和哈希原像都未被发现量子捷径,因此可用于 PQC。大整数分解正是 Shor 能高效解决的,C 不属于抗量子基础。
Q8. N=15,a=2 时,模指数序列 1,2,4,8,1,… 的周期 r 是?
- A.4← 正确答案
- B.2
- C.8
- D.15
答案:A。序列每 4 步回到 1,所以 r=4。有了 r=4,后处理就能把 15 分解成 3 和 5。
Q9. Shor 算法对 RSA 构成威胁的原因包括?
- A.能多项式时间分解大整数← 正确答案
- B.能直接破解所有对称加密
- C.能由 N 算出私钥 d← 正确答案
- D.只需要一个量子比特
答案:AC。Shor 分解 N 后,攻击者可计算 φ(N) 并推出 d,从而解密或伪造签名。对称加密通常靠 Grover 算法威胁,不是 Shor;Shor 也不可能单比特实现,B、D 错误。
Q10. 当前 Shor 算法难以实际破解 2048 位 RSA 的最主要原因是?
- A.缺少足够容错逻辑量子比特← 正确答案
- B.量子傅里叶变换未被证明
- C.RSA 密钥长度可以无限增加
- D.经典计算机已经更快
答案:A。算法已经被证明可行,瓶颈在硬件:需要数千逻辑量子比特和大量纠错开销。C 是缓解措施而非根本原因,B、D 不符合事实。