1、通用模板
PR 多项式环的引用
定义多项式变量为x
Zmod(N) 模N的整数环
PolynomialRing() 多项式环,系数来自Zmod(N)
X 根的上界
beta 因子的相对大小
epsilon 精度控制
Shift 移动位数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| from sage.all import *
def coppersmith_general(n, known_part, unknown_bits, shift=0, beta=0.5, epsilon=0.05): """ 通用Coppersmith模板 n: 模数 known_part: 已知的部分 unknown_bits: 未知的位数 shift: 未知部分在数中的位置(左移位数) beta: 根的大小比例 epsilon: 精度参数 """ PR.<x> = PolynomialRing(Zmod(n)) f = known_part * (2^shift) + x X = 2^unknown_bits roots = f.small_roots(X=X, beta=beta, epsilon=epsilon) return roots
def solve_rsa_partial_p(n, partial_p, missing_bits): """已知p的高位,求完整p""" roots = coppersmith_general(n, partial_p, missing_bits, shift=missing_bits) if roots: p = partial_p * (2^missing_bits) + roots[0] return p return None
def solve_rsa_partial_d(n, e, partial_d, unknown_bits): """已知d的低位,求完整d""" pass
|
2、常见问题下的模板
(1)已知p的高位
1 2 3 4 5 6
| def known_p_high_bits(n, p_high, unknown_bits): """已知p的高位""" PR.<x> = PolynomialRing(Zmod(n)) f = p_high * (2^unknown_bits) + x roots = f.small_roots(X=2^unknown_bits, beta=0.5) return roots[0] if roots else None
|
(2)已知p的低位
1 2 3 4 5 6
| def known_p_low_bits(n, p_low, unknown_bits): """已知p的低位""" PR.<x> = PolynomialRing(Zmod(n)) f = x * (2^(p_low.bit_length())) + p_low roots = f.small_roots(X=2^unknown_bits, beta=0.5) return roots[0] if roots else None
|
(3)已知m的高位
1 2 3 4 5 6 7
| def franklin_reiter(n, e, c1, c2, delta_m, known_m): """Franklin-Reiter相关消息攻击""" PR.<x> = PolynomialRing(Zmod(n)) f1 = (known_m + x)^e - c1 f2 = (known_m + delta_m + x)^e - c2 g = gcd(f1, f2) return -g.monic().coefficients()[0]
|
3.beta
(1)beta含义
Ⅰ.模p为0
$$若n有一个未知因子p,满足p \geq n^ \beta(0<\beta \leq 1)$$
在Coppersmith攻击中,beta参数表示我们期望找到的因子(p)的大小相对于模数N的大小。
· beta = 0.5:期望找到的因子p ≈ N^0.5(对于RSA来说,p和q通常都是N^0.5量级)
· beta < 0.5:期望找到的因子比N^0.5小
· beta > 0.5:期望找到的因子比N^0.5大
Ⅱ.模n为0
$$x<n^{beta/k},其中k为多项式的最大次数$$
(2)为什么要调整beta
- 安全边际:理论边界是beta=0.5,但实际计算中由于数值精度和算法实现的限制,通常需要设置一个安全边际
- 算法稳定性:较小的beta值使Coppersmith方法更稳定,更容易收敛
4.epsilon
(1)epsilon的基本作用
epsilon控制着Coppersmith方法中格的维度和搜索范围:
- 较小的epsilon → 更大的格维度 → 更强的攻击能力但更慢
- 较大的epsilon → 更小的格维度 → 更快的计算但攻击能力较弱
(2)一般来说
· 未知位数 < 64位:epsilon=0.05-0.1
· 未知位数 64-128位:epsilon=0.03-0.07
· 未知位数 > 128位:epsilon=0.01-0.05
(以512bit的p为例)
当beta=0.4时,在未知位数少于等于227bit时,可以恢复p
当beta=0.4,epsilon=0.01时,在未知位数少于等于248bit时,可以恢复p