boxmoe_header_banner_img

⋅無⋅限⋅進⋅步⋅

加载中

文章导读

BUUCTF-Crypto:RSA


avatar
yuhui 2025年11月7日 79

RSA

在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flga提交

求解过程:

首先计算n和ϕ(n)

n=p*q ϕ(n)=(p-1)(q-1)

d是e关于模ϕ(n)的乘法逆元,即d⋅e≡1 (mod ϕ(n))

根据扩展欧几里得算法求解d

# 扩展欧几里得算法:用来计算 a 和 b 的最大公约数,同时返回贝祖系数 x 和 y
# 使得 a * x + b * y = gcd(a, b)
def extended_gcd(a, b):
    # 基本情况,如果 b == 0,则 gcd(a, b) = a, x = 1, y = 0
    if b == 0:
        return a, 1, 0
    # 递归调用扩展欧几里得算法,获取 gcd(a, b) 和贝祖系数 x, y
    gcd, x1, y1 = extended_gcd(b, a % b)
    # 更新贝祖系数 x 和 y,返回新的系数
    x = y1
    y = x1 - (a // b) * y1
    return gcd, x, y

# 求解模逆元:即求解 x 使得 a * x ≡ 1 (mod m)
def mod_inverse(a, m):
    # 调用扩展欧几里得算法,获取 gcd(a, m), x, y
    gcd, x, y = extended_gcd(a, m)

    # 如果 a 和 m 不是互质的,说明没有模逆元
    if gcd != 1:
        raise ValueError(f"{a} 和 {m} 没有互质,无法求模逆元")
    else:
        # 返回 x 的模 m 结果,即为 a 关于模 m 的逆元
        return x % m

# 主函数:根据给定的 p, q 和 e 计算 RSA 私钥 d
def rsa_private_key(p, q, e):
    # 计算 RSA 的 n 和 φ(n)
    n = p * q  # 公钥的模数 n = p * q
    phi_n = (p - 1) * (q - 1)  # 欧拉函数 φ(n) = (p-1)(q-1)

    # 计算 d = e^(-1) mod φ(n),即 e 的模逆元
    d = mod_inverse(e, phi_n)

    # 返回计算得到的私钥 d
    return d

# 给定的 RSA 参数
p = 473398607161
q = 4511491
e = 17

# 调用 rsa_private_key 函数计算私钥 d
d = rsa_private_key(p, q, e)

# 输出计算得到的私钥 d
print(f"私钥 d 的值为: {d}")

image-20251104135834640

得到flag{125631357777427553}



评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字

插入代码