Appearance
RSA 的分析
使用连分数展开进行攻击
连分数
对于一个数
可以简记为:
如何计算:
n-th convergent: (n次渐进分数)
对于
计算如下:
e.g.
α = 45/89
因此连分数表示为:
计算收敛分数:
Lemma
如果
Wiener’s attack on RSA
如果满足:
则存在:
- 考虑:
Code
Sage
python
from sage.all import *
n = 9449868410449
e = 6792605526025
test_message = 123456
enc_test_message = pow(test_message, e, n)
def weiner_atk(e,n):
continued_fraction_expansion = continued_fraction(e/n)
convergents = continued_fraction_expansion.convergents()
print(convergents)
for iter in convergents:
k,d = iter.as_integer_ratio()
if k == 0:
continue
if (e*d - 1) % k != 0:
continue
phi_n = (e*d - 1) // k
s = n - phi_n + 1
discriminant = s*s - 4*n
if discriminant >= 0:
t = isqrt(discriminant)
if t*t == discriminant:
dec_test_message = pow(enc_test_message, d, n)
# print(dec_test_message)
if dec_test_message == test_message:
return d
return None
d = weiner_atk(e, n)
print(f"Found d: {d}")bash
[0, 1, 2/3, 3/4, 5/7, 18/25, 23/32, 409/569, 1659/2308, 2068/2877, 3727/5185, 76608/106577, 156943/218339, 1175209/1634950, 8383406/11662989, 34708833/48286906, 77801072/108236801]
123456
Found d: 569Coppersmith
直觉
假设:
故而,当
同时,对于持有私钥,既拥有
但是我们可以通过一些转换,使得:
既然
e.g.
- 令
,并令 - 寻找满足
的解。 是一个解,但在整数域 上有 。 - 定义
- 若
。 的系数较小且满足 ,其根可在实数域 上用牛顿法求出。
通过 格 找出多项式 gx
Coppersmith's method 的核心思想是通过构造一组多项式,并利用 LLL 算法 找出一个新的多项式
构造方法略
e.g.
令
可以验证
对此矩阵运行 LLL 算法得到一个约化基,其第一行为
该向量对应的多项式为
在