前言
本文是学习自下述网站
https://zhuanlan.zhihu.com/p/400818185
Note
脚本
# sage
def wiener_attack(n, e):
n = Integer(n)
e = Integer(e)
cf = (e / n).continued_fraction().convergents()
for f in cf:
k = f.numer()
d = f.denom()
if k == 0:
continue
phin = ((e * d) - 1) / k
b = -(n - phin + 1)
dis = b ^ 2 - 4 * n
if dis.sign() == 1:
dis_sqrt = sqrt(dis)
p = (-b + dis_sqrt) / 2
q = (-b - dis_sqrt) / 2
if p.is_integer() and q.is_integer() and (p * q) % n == 0:
p = p % n
q = q % n
if p > q:
return (p, q)
else:
return (q, p)