RSA密钥生成-已知p、q、e求私钥d的python脚本

题目:

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

求解过程:

首先计算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}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Draina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值