1 条题解

  • 0
    @ 2025-12-9 19:41:21

    1. 题目

    已知:

    • 两个用户公钥模数相同 NN,公钥分别是 e1,e2e_1, e_2,并且 gcd(e1,e2)=1\gcd(e_1, e_2) = 1
    • 同一明文 mm 分别用 (N,e1)(N,e_1)(N,e2)(N,e_2) 加密:c1me1(modN)c_1 \equiv m^{e_1} \pmod N c2me2(modN)c_2 \equiv m^{e_2} \pmod N
    • 给出 c1,c2,e1,e2,Nc_1, c_2, e_1, e_2, N,求 mm
    • NN28<N<2632^8 < N < 2^{63} 之间,由两个不同质数相乘得到
    • mmNN 互质(保证 RSA 正常解密)

    2. 核心思路:扩展欧几里得求组合系数

    因为 e1e_1e2e_2 互质,即 gcd(e1,e2)=1\gcd(e_1, e_2) = 1,根据扩展欧几里得算法,存在整数 s,ts, t 使得:

    e1s+e2t=1e_1 \cdot s + e_2 \cdot t = 1

    这里的 sstt 可以为负数。


    3. 利用这个等式恢复 mm

    c1c_1c2c_2 做幂运算:

    c1s(me1)sme1s(modN)c_1^s \equiv (m^{e_1})^s \equiv m^{e_1 s} \pmod N c2t(me2)tme2t(modN)c_2^t \equiv (m^{e_2})^t \equiv m^{e_2 t} \pmod N

    将两式相乘:

    $$c_1^s \cdot c_2^t \equiv m^{e_1 s + e_2 t} \equiv m^1 \equiv m \pmod N $$

    因此:

    mc1sc2t(modN)m \equiv c_1^s \cdot c_2^t \pmod N

    4. 处理 sstt 为负的情况

    如果 ss 是负数,则 c1sc_1^s 表示 c1c_1s|s| 次幂的模逆元。
    即:

    c1s(modN)=(c11)s(modN)c_1^s \pmod N = (c_1^{-1})^{|s|} \pmod N

    前提是 c1c_1NN 互质(RSA 中 c1=me1modNc_1 = m^{e_1} \bmod NmmNN 互质,所以 c1c_1 也与 NN 互质,模逆存在)。

    tt 为负同理。


    5. 具体步骤

    对于每组数据:

    1. 用扩展欧几里得算法求出 s,ts, t,使得 e1s+e2t=1e_1 s + e_2 t = 1
    2. 如果 s<0s < 0,则计算 c11modNc_1^{-1} \bmod N,再计算 (c11)smodN(c_1^{-1})^{-s} \bmod N;否则直接计算 c1smodNc_1^s \bmod N
    3. 如果 t<0t < 0,则计算 c21modNc_2^{-1} \bmod N,再计算 (c21)tmodN(c_2^{-1})^{-t} \bmod N;否则直接计算 c2tmodNc_2^t \bmod N
    4. 计算 m(c1sc2t)modNm \equiv (c_1^s \cdot c_2^t) \bmod N
    5. 输出 mm(范围在 [0,N)[0, N) 内)。

    6. 样例验证

    样例:

    c1=1502992813, c2=2511821915, e1=653507, e2=57809, N=2638352023
    

    计算 gcd(e1,e2)=1\gcd(e_1, e_2) = 1(已知)。

    s,ts, t 使 653507s+57809t=1653507 \cdot s + 57809 \cdot t = 1

    用扩展欧几里得:

    • 先算 gcd(653507,57809)\gcd(653507, 57809) 过程得到系数。 最终可得 s=26704,t=301967s = 26704, t = -301967(具体数值需实际计算,这里为示意)。

    s>0s > 0,计算 c1smodNc_1^s \bmod N
    t<0t < 0,计算 c21modNc_2^{-1} \bmod N,然后取 (t)(-t) 次幂。

    最后相乘模 NNm=19260817m = 19260817,与输出一致。


    7. 算法复杂度

    • 扩展欧几里得算法 O(logmax(e1,e2))O(\log \max(e_1, e_2))
    • 模幂运算用快速幂 O(logs+logt)O(\log |s| + \log |t|)
      注意 s,ts, t 可能很大(与 e1,e2e_1, e_2 同量级),但幂运算在模 NN 下高效。
    • T104T \le 10^4,完全可行。

    8. 代码实现要点(C++)

    • long longN,c1,c2N, c_1, c_2N<263N < 2^{63})。
    • __int128 避免乘法溢出(模幂中的乘法可能超过 long long 范围)。
    • 扩展欧几里得算法求系数时用 long long
    • 模逆用快速幂(费马小定理)或扩展欧几里得均可。

    9. 总结

    这道题考察 共享模数攻击 的基本原理:

    • 条件:gcd(e1,e2)=1\gcd(e_1, e_2) = 1 且同 mm、同 NN
    • 核心:扩展欧几里得求系数 s,ts, t,组合 c1sc2tm(modN)c_1^s \cdot c_2^t \equiv m \pmod N
    • 实现注意:负数指数处理、大数乘法防溢出、模逆计算

    这是一个经典的 RSA 攻击场景,也是 CTF 密码学常见题。

    • 1

    「THUPC 2018」密码学第三次小作业 / Rsa

    信息

    ID
    5956
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者