CTF入门RSA维纳攻击

RSA维纳攻击

一.题目描述

适用于e过大或国过小情况下的RSA加密

题干如下:

#coding:utf-8
import gmpy2
import libnum
e = 548564175098067125961375319851171259385596271876637657761522885808657855394647972481844447376596437557651275057610120865395646169671221375251081541213042646978655686531005856899936162320404991331623237305862913250487293880446994470841390688087392282045130633013139311548859962245908782253213294049851175315059
n = 639662333905190724963174274393118134850652056724765488685973275138948202602626008285649108873241886836533441901790252560580886492518792249844707754890068885294414947775869189660933854702732140888525369256213185908742658834741758334492843871934294115437721034834635565406377520933839418094457376057043593848401

m="flag{you_need_to_solve}"
m=libnum.s2n(m)
c1=pow(m,e,n)
print(c1)

c1 = 266367266471585923035346980467315672043839080179258966276144775106482166900911004389808367589961536843898187180012055918063504477273067284037318171833017082239907978935274619109926579983150571298634653886980563681026116724117473808890951091279814434050754571460308728024448607359710055618866766919226511213734

根据以上信息解出明文

二.解题方法

1.解题原理

Wiener 表示如果满足:

d<1/3n1/4

那么一种基于连分数的特殊攻击类型就可以危害 RSA 的安全。此时需要满足:

q<p<2q

如果满足上述条件,通过 Wiener Attack 可以在多项式时间中分解 n,思路如下:

N = pq

φ(n)=(p−1)(q−1)=pq−(p+q)+1=N−(p+q)+1

∵p, q 非常大 ,
∴pq≫p+q,
∴φ(n)≈N

∵ed≡1modφ(n),
∴ed−1=kφ(n),
这个式子两边同除 dφ(n)

可得:

eφ(n)−kd=1dφ(n)

∵φ(n)≈N,
∴eN−kd=1dφ(n),同样 dφ(n) 是一个很大的数,所以 eN 略大于 kd, e 和 N 是我们是知道的,公钥中给我们的,所以我们计算出 eN后,比它略小的 kd 用计算 eN 的连分数展开,依次算出这个分数每一个渐进分数,由于 eN 略大于 kd,wiener 证明了,该攻击能精确的覆盖 kd。

2.解题步骤

利用python脚本,输入n。e。c变量的值即可解出明文

脚本如下:

i

mport gmpy2
import libnum

def continuedFra(x, y):
    """计算连分数
    :param x: 分子
    :param y: 分母
    :return: 连分数列表
    """
    cf = []
    while y:
        cf.append(x // y)
        x, y = y, x % y
    return cf
def gradualFra(cf):
    """计算传入列表最后的渐进分数
    :param cf: 连分数列表
    :return: 该列表最后的渐近分数
    """
    numerator = 0
    denominator = 1
    for x in cf[::-1]:
        # 这里的渐进分数分子分母要分开
        numerator, denominator = denominator, x * denominator + numerator
    return numerator, denominator
def solve_pq(a, b, c):
    """使用韦达定理解出pq,x^2−(p+q)∗x+pq=0
    :param a:x^2的系数
    :param b:x的系数
    :param c:pq
    :return:p,q
    """
    par = gmpy2.isqrt(b * b - 4 * a * c)
    return (-b + par) // (2 * a), (-b - par) // (2 * a)
def getGradualFra(cf):
    """计算列表所有的渐近分数
    :param cf: 连分数列表
    :return: 该列表所有的渐近分数
    """
    gf = []
    for i in range(1, len(cf) + 1):
        gf.append(gradualFra(cf[:i]))
    return gf


def wienerAttack(e, n):
    """
    :param e:
    :param n:
    :return: 私钥d
    """
    cf = continuedFra(e, n)
    gf = getGradualFra(cf)
    for d, k in gf:
        if k == 0: continue
        if (e * d - 1) % k != 0:
            continue
        phi = (e * d - 1) // k
        p, q = solve_pq(1, n - phi + 1, n)
        if p * q == n:
            return d

n = 639662333905190724963174274393118134850652056724765488685973275138948202602626008285649108873241886836533441901790252560580886492518792249844707754890068885294414947775869189660933854702732140888525369256213185908742658834741758334492843871934294115437721034834635565406377520933839418094457376057043593848401
e = 548564175098067125961375319851171259385596271876637657761522885808657855394647972481844447376596437557651275057610120865395646169671221375251081541213042646978655686531005856899936162320404991331623237305862913250487293880446994470841390688087392282045130633013139311548859962245908782253213294049851175315059
c = 266367266471585923035346980467315672043839080179258966276144775106482166900911004389808367589961536843898187180012055918063504477273067284037318171833017082239907978935274619109926579983150571298634653886980563681026116724117473808890951091279814434050754571460308728024448607359710055618866766919226511213734
d=wienerAttack(e, n)
m=pow(c, d, n)
print(libnum.n2s(m).decode())

运行结果如图:
在这里插入图片描述

输入flag即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值