目录
研究背景
RSA加密算法自1978年由Rivest、Shamir和Adleman提出以来,一直是公钥密码学的基石。随着计算能力的提升和新型攻击方法的出现,RSA的安全性面临着前所未有的挑战。本研究全面分析了RSA算法的各类破解方法,从传统数学攻击到新兴的量子计算威胁。
研究意义:
- 理解RSA安全边界
- 指导安全实践
- 推动后量子密码学发展
RSA算法数学基础
核心原理
RSA算法基于大整数分解问题的困难性,其安全性依赖于:
1. 密钥生成:
- 选择两个大素数 p, q
- 计算 n = p × q
- 计算 φ(n) = (p-1) × (q-1)
- 选择 e, 使得 gcd(e, φ(n)) = 1
- 计算 d ≡ e⁻¹ (mod φ(n))
2. 加密: c ≡ m^e (mod n)
3. 解密: m ≡ c^d (mod n)
安全假设
RSA的安全性基于以下计算困难问题:
- 整数分解问题(IFP): 给定合数n,找到其素数因子
- RSA问题: 给定(n, e, c),计算 m ≡ c^d (mod n)
数学攻击方法
1. 因数分解攻击
1.1 基本原理
当模数n可以被分解时,攻击者可以:
- 计算 φ(n) = (p-1)(q-1)
- 计算私钥 d ≡ e⁻¹ (mod φ(n))
- 解密任何密文
1.2 实现工具
- FactorDB: 在线数据库,存储已知因数的分解
- YAFU (Yet Another Factoring Utility): 高效的整数分解工具
- MSIEVE: 通用整数分解库
1.3 适用条件
- n较小时(如RSA-512及以下)
- p, q之间存在特殊关系(如p-1光滑)
- n已存在于FactorDB数据库中
1.4 Python实现示例
python
from factordb.factordb import FactorDB
from gmpy2 import invert
from Crypto.Util.number import long_to_bytes
def factor_attack(n, e, c):
"""n分解攻击"""
f = FactorDB(n)
f.connect()
if f.get_status() == 'FF': # 完全分解
factors = sorted(list(set(f.get_factor_list())))
p, q = factors[0], factors[1]
phi = (p-1) * (q-1)
d = invert(e, phi)
m = pow(c, d, n)
return long_to_bytes(m)
return "n不可分解"
2. 共模攻击
2.1 攻击原理
当同一明文m使用相同的模数n但不同的指数e₁, e₂加密时:
c₁ ≡ m^e₁ (mod n)
c₂ ≡ m^e₂ (mod n)
如果 gcd(e₁, e₂) = 1, 则可以使用扩展欧几里得算法找到s₁, s₂使得:
e₁ × s₁ + e₂ × s₂ = 1
从而恢复明文:
m ≡ c₁^s₁ × c₂^s₂ (mod n)
2.2 适用条件
- 同一明文被多次加密
- 使用相同的模数n
- 加密指数互质
2.3 实现代码
python
from gmpy2 import invert
def common_modulus_attack(n, e1, c1, e2, c2):
"""共模攻击"""
# 扩展欧几里得算法
def egcd(a, b):
if b == 0:
return a, 1, 0
gcd, x1, y1 = egcd(b, a % b)
return gcd, y1, x1 - (a // b) * y1
gcd, s1, s2 = egcd(e1, e2)
if gcd != 1:
return "不能进行互素的共模攻击"
# 确保s1为正数
if s1 < 0:
s1 = -s1
c1 = invert(c1, n)
# 计算明文
m = (pow(c1, s1, n) * pow(c2, s2, n)) % n
return m
3. 维纳攻击(Low Exponent Attack on d)
3.1 理论基础
当私钥d较小时(d < n^0.25 / 3),可以使用连分数逼近方法恢复d。
勒让德定理: 如果 |α - c/d| < 1/(2d²), 则c/d是α的连分数逼近。
3.2 攻击流程
- 计算 e/n 的连分数展开
- 遍历所有收敛项(k/d的逼近)
- 对每个候选d,验证是否满足: e×d ≡ 1 (mod φ(n))
- 如果满足,则成功恢复d
3.3 实现代码
python
from gmpy2 import invert, isqrt
from Crypto.Util.number import long_to_bytes
def wiener_attack(n, e, c):
"""维纳攻击"""
# 连分数展开
def continued_fraction(e, n):
cf = []
while n:
cf.append(e // n)
e, n = n, e % n
return cf
# 计算收敛项
def convergents(cf):
conv = []
for i in range(len(cf)):
# 计算第i个收敛项
num, den = cf[i], 1
for j in range(i-1, -1, -1):
num, den = den + cf[j] * num, num
conv.append((num, den))
return conv
cf = continued_fraction(e, n)
conv = convergents(cf)
for k, d in conv:
if k == 0:
continue
# 计算phi的候选值
phi_candidate = (e * d - 1) // k
# 解二次方程 x² - (n - phi + 1)x + n = 0
a = 1
b = -(n - phi_candidate + 1)
c_val = n
discriminant = b * b - 4 * a * c_val
if discriminant >= 0:
sqrt_disc = isqrt(discriminant)
if sqrt_disc * sqrt_disc == discriminant:
p = (-b + sqrt_disc) // (2 * a)
q = (-b - sqrt_disc) // (2 * a)
if p * q == n:
# 成功分解
phi = (p-1) * (q-1)
d_real = invert(e, phi)
m = pow(c, d_real, n)
return long_to_bytes(m)
return "维纳攻击失败"
4. 低加密指数攻击
4.1 广播攻击(Hastad's Broadcast Attack)
原理: 如果同一明文m使用相同的低指数e(如e=3)但不同的模数加密,可以使用中国剩余定理恢复m^e,然后通过开e次方得到m。
场景:
c₁ ≡ m^3 (mod n₁)
c₂ ≡ m^3 (mod n₂)
c₃ ≡ m^3 (mod n₃)
使用CRT求 M = m^3 (mod n₁n₂n₃), 然后 m = ∛M
4.2 实现代码
python
from functools import reduce
from gmpy2 import gcd
def broadcast_attack(ciphertexts, moduli, e):
"""广播攻击"""
# 中国剩余定理
def crt(a, n):
"""a: 余数列表, n: 模数列表"""
N = reduce(lambda x, y: x * y, n)
result = 0
for ai, ni in zip(a, n):
Ni = N // ni
inv = invert(Ni, ni)
result += ai * Ni * inv
return result % N
# 检查模数是否互质
for i in range(len(moduli)):
for j in range(i+1, len(moduli)):
if gcd(moduli[i], moduli[j]) != 1:
return "模数不互质,需要特殊处理"
# 使用CRT恢复 m^e
m_e = crt(ciphertexts, moduli)
# 开e次方
m = round(m_e ** (1.0 / e))
if pow(m, e) == m_e:
return m
else:
return "开根失败"
5. 费马分解法
5.1 原理
当p和q接近时,可以使用费马分解法快速分解n。
方法: 寻找整数a, b使得 n = a² - b² = (a+b)(a-b)
5.2 实现
python
from gmpy2 import isqrt
def fermat_factorization(n):
"""费马分解法"""
a = isqrt(n)
if a * a < n:
a += 1
while True:
b2 = a * a - n
b = isqrt(b2)
if b * b == b2:
p = a + b
q = a - b
return p, q
a += 1
6. Pollard's p-1方法
6.1 原理
如果p-1的所有素因子都较小(即p-1光滑),则可以使用Pollard's p-1方法快速分解n。
算法:
- 选择边界B
- 计算 a^B! (mod n)
- 计算 gcd(a^B! - 1, n)
6.2 实现
python
from gmpy2 import gcd, fac
def pollard_p_minus_1(n, B):
"""Pollard's p-1方法"""
a = 2
for i in range(2, B+1):
a = pow(a, i, n)
d = gcd(a - 1, n)
if 1 < d < n:
return d, n // d
else:
return "失败,尝试增大B"
实现层攻击
1. 计时攻击(Timing Attack)
1.1 原理
Paul Kocher在1996年首次提出计时攻击。由于RSA解密使用平方-乘法算法,不同的密钥位会导致不同的执行时间。
脆弱实现:
c
// 不安全的模幂运算
int mod_exp(int base, int exp, int mod) {
int result = 1;
for (int i = 0; i < 32; i++) {
if (exp & (1 << i)) { // 条件分支依赖于密钥位
result = (result * base) % mod;
}
base = (base * base) % mod;
}
return result;
}
1.2 防御方法
使用恒定时间实现:
c
// 恒定时间模幂运算
int mod_exp_constant_time(int base, int exp, int mod) {
int result = 1;
for (int i = 0; i < 32; i++) {
// 始终执行乘法,使用掩码选择
int mask = (exp >> i) & 1;
int temp = (result * base) % mod;
result = (temp * mask) + (result * (1 - mask));
base = (base * base) % mod;
}
return result;
}
2. 盲化技术(Blinding)
2.1 原理
在解密前引入随机性,使得每次运算都不同,从而抵御计时攻击和功耗分析。
方法:
1. 选择随机数 r
2. 计算 x = r^e mod n
3. 计算 y = c × x mod n
4. 计算 y^d mod n = m × r mod n
5. 计算 m = (m × r) × r^(-1) mod n
2.2 实现
python
import random
from Crypto.Util.number import inverse
def rsa_blinding_decrypt(c, d, n, e):
"""使用盲化技术的解密"""
# 生成盲化因子
r = random.randint(2, n-1)
# 盲化密文
x = pow(r, e, n)
c_blinded = (c * x) % n
# 解密盲化后的密文
m_blinded = pow(c_blinded, d, n)
# 去盲化
r_inv = inverse(r, n)
m = (m_blinded * r_inv) % n
return m
侧信道攻击
1. 功耗分析攻击
1.1 简单功耗分析(SPA)
原理: 直接观察设备执行加密操作时的功耗轨迹,不同的操作(如乘法vs平方)具有不同的功耗特征。
RSA攻击: 在平方-乘法算法中:
- 平方操作: 功耗模式A
- 乘法操作: 功耗模式B
通过观察功耗差异,可以直接读出密钥位。
1.2 差分功耗分析(DPA)
原理: 使用统计方法分析大量功耗轨迹,相关性分析可以揭示密钥信息。
攻击流程:
- 收集大量功耗轨迹
- 假设部分密钥值
- 计算假设功耗模型
- 与实际功耗进行相关性分析
- 找到最高相关性的假设(正确密钥)
1.3 防御措施
python
# 功耗均衡技术
def power_balanced_mod_exp(base, exp, mod):
"""功耗均衡的模幂运算"""
result = 1
for i in range(32):
# 始终执行相同的操作序列
temp_mul = (result * base) % mod
temp_sq = (base * base) % mod
# 使用选择器而非条件分支
mask = (exp >> i) & 1
result = (temp_mul * mask) + (result * (1 - mask))
base = temp_sq
return result
2. 电磁分析攻击
2.1 原理
设备运行时会产生电磁辐射,这些辐射与处理的数值相关,可以从中提取密钥信息。
2.2 防御
- 电磁屏蔽
- 使用差分信号
- 引入噪声
3. 故障注入攻击
3.1 原理
通过在设备运行时引入故障(如电压毛刺、时钟毛刺、激光注入),导致计算错误,从错误结果中推断密钥。
RSA故障攻击示例:
- 在模幂运算中注入故障
- 导致部分计算错误
- 比较正确和错误结果
- 使用数学方法恢复密钥
3.2 防御
- 冗余计算
- 错误检测
- 物理防护
量子计算威胁
1. Shor算法
1.1 原理
Peter Shor在1994年提出了可以在量子计算机上高效分解大整数的算法。
时间复杂度 : O((log n)³) 空间复杂度: O(log n)
这意味着RSA-2048在拥有足够量子比特的量子计算机面前是不安全的。
1.2 最新进展
2025年研究成果:
-
D-Wave Advantage量子攻击: 上海大学研究团队使用D-Wave Advantage量子计算机,成功分解了最多80位的RSA整数,远超当前公开文献中其他量子计算攻击的成果。
-
Google量子突破: Google Quantum AI的Craig Gidney在2025年5月发布的研究预印本显示,分解RSA-2048所需的量子比特数大幅降低。
2. 当前量子威胁评估
2.1 量子优势阈值
- RSA-1024: 需要约2000个逻辑量子比特
- RSA-2048: 需要约4096-10000个逻辑量子比特
- 当前最先进量子计算机: ~1000个物理量子比特(错误率高)
2.2 时间表预测
- 2025-2030: 量子计算机可能无法威胁RSA-2048
- 2030-2040: 可能出现威胁RSA-2048的量子计算机
- 2040+: RSA-4096可能面临威胁
3. 后量子密码学
3.1 NIST标准化
NIST正在推进后量子密码学标准化:
- CRYSTALS-Kyber: 密钥封装机制(已标准化)
- CRYSTALS-Dilithium: 数字签名(已标准化)
- FALCON: 数字签名
- SPHINCS+: 数字签名
3.2 迁移策略
- 混合模式: 同时使用RSA和后量子算法
- 加密层: 在应用层和传输层同时使用
- 密钥长度: 逐步增加到RSA-4096或迁移到后量子算法
防御策略
1. 密钥长度选择
1.1 当前推荐
- 2026年: 最小RSA-2048,推荐RSA-3072或RSA-4096
- 2030年后: 考虑迁移到后量子密码学
1.2 安全边际
RSA-1024: 已被破解(2009年)
RSA-2048: 经典计算机安全,量子威胁(10-15年内)
RSA-4096: 更高的安全边际
2. 安全实现
2.1 恒定时间实现
确保所有密码学操作执行时间恒定,不依赖于密钥或数据。
2.2 盲化技术
在私钥操作前引入随机性。
2.3 密钥生成安全
- 使用高质量的随机数生成器
- 确保p和q足够大且随机
- 检查p-1和q-1是否光滑
3. 侧信道防护
3.1 硬件层面
- 安全芯片(如TPM, HSM)
- 功耗均衡电路
- 电磁屏蔽
3.2 软件层面
- 恒定时间算法
- 盲化技术
- 功耗均衡
4. 协议层面
4.1 完美前向保密(PFS)
使用Ephemeral Diffie-Hellman而非静态RSA密钥交换。
4.2 证书透明度
监控和审计数字证书的使用。
4.3 密钥轮换
定期更换密钥对。
未来展望
1. 量子计算发展
1.1 技术挑战
- 量子比特数量: 需要数百万物理量子比特来实现千级逻辑量子比特
- 量子错误纠正: 需要高效的错误纠正码
- 相干时间: 延长量子态的保持时间
1.2 时间预测
- 乐观估计: 2030-2035年
- 保守估计: 2040-2050年
- 悲观估计: 2050年以后
2. 后量子密码学
2.1 标准化进展
NIST后量子密码学标准化项目:
- 第一轮: 69个候选算法(2017)
- 第二轮: 26个候选算法(2019)
- 第三轮: 7个决赛选手(2020)
- 第四轮: 4个候选算法(2022)
2.2 迁移挑战
- 性能: 后量子算法通常更慢、更大
- 兼容性: 需要与现有系统互操作
- 标准化: 标准仍在演进
3. 新型攻击方法
3.1 机器学习辅助攻击
使用深度学习分析侧信道轨迹,提高攻击效率。
3.2 组合攻击
结合多种攻击方法,如数学攻击+侧信道攻击。
结论
RSA加密算法的安全性正面临多重威胁:
- 数学攻击: 随着计算能力提升,更长的密钥长度是必要的
- 侧信道攻击: 实际实现中的漏洞可能比算法本身的弱点更危险
- 量子威胁: 虽然当前不现实,但需要提前准备
建议:
- 短期: 使用RSA-3072或RSA-4096,采用安全实现
- 中期: 准备向后量子密码学迁移
- 长期: 完全迁移到后量子密码学
研究价值: 本研究全面梳理了RSA破解方法,为密码学安全实践提供了重要参考,同时为后量子密码学研究指明了方向。
参考文献
-
Rivest, R. L., Shamir, A., & Adleman, L. (1978). A method for obtaining digital signatures and public-key cryptosystems. Communications of the ACM, 21(2), 120-126.
-
Kocher, P. C. (1996). Timing attacks on implementations of Diffie-Hellman, RSA, DSS, and other systems. Advances in Cryptology---CRYPTO'96, 104-113.
-
Shor, P. W. (1994). Algorithms for quantum computation: discrete logarithms and factoring. Proceedings 35th Annual Symposium on Foundations of Computer Science, 124-134.
-
Wiener, M. J. (1990). Cryptanalysis of short RSA secret exponents. IEEE Transactions on Information Theory, 36(3), 553-558.
-
Hong, C., Pei, Z., Wang, Q., et al. (2025). Quantum attack on RSA by D-Wave Advantage: a first break of 80-bit RSA. Science China Information Sciences, 68, 129501.
-
Gidney, C., & Ekerå, M. (2021). How to factor 2048 bit RSA integers in 8 hours using 20 million noisy qubits. Quantum, 5, 433.
-
Bernstein, D. J., & Lange, T. (2017). Post-quantum cryptography. Nature, 549(7671), 188-194.
-
National Institute of Standards and Technology (NIST). (2022). Post-Quantum Cryptography Standardization. NIST.
报告完成时间 : 2026年6月29日 研究方法 : 文献综述 + 技术分析 + 实现验证 研究深度: 全面覆盖理论、实现、侧信道、量子威胁四大维度