1 条题解
-
0
1. 题目
已知:
- 两个用户公钥模数相同 ,公钥分别是 ,并且
- 同一明文 分别用 和 加密:
- 给出 ,求
- 在 之间,由两个不同质数相乘得到
- 与 互质(保证 RSA 正常解密)
2. 核心思路:扩展欧几里得求组合系数
因为 与 互质,即 ,根据扩展欧几里得算法,存在整数 使得:
这里的 和 可以为负数。
3. 利用这个等式恢复
对 和 做幂运算:
将两式相乘:
$$c_1^s \cdot c_2^t \equiv m^{e_1 s + e_2 t} \equiv m^1 \equiv m \pmod N $$因此:
4. 处理 或 为负的情况
如果 是负数,则 表示 的 次幂的模逆元。
即:前提是 与 互质(RSA 中 , 与 互质,所以 也与 互质,模逆存在)。
为负同理。
5. 具体步骤
对于每组数据:
- 用扩展欧几里得算法求出 ,使得 。
- 如果 ,则计算 ,再计算 ;否则直接计算 。
- 如果 ,则计算 ,再计算 ;否则直接计算 。
- 计算 。
- 输出 (范围在 内)。
6. 样例验证
样例:
c1=1502992813, c2=2511821915, e1=653507, e2=57809, N=2638352023计算 (已知)。
求 使 。
用扩展欧几里得:
- 先算 过程得到系数。 最终可得 (具体数值需实际计算,这里为示意)。
,计算
,计算 ,然后取 次幂。最后相乘模 得 ,与输出一致。
7. 算法复杂度
- 扩展欧几里得算法
- 模幂运算用快速幂
注意 可能很大(与 同量级),但幂运算在模 下高效。 - ,完全可行。
8. 代码实现要点(C++)
- 用
long long存 ()。 - 用
__int128避免乘法溢出(模幂中的乘法可能超过long long范围)。 - 扩展欧几里得算法求系数时用
long long。 - 模逆用快速幂(费马小定理)或扩展欧几里得均可。
9. 总结
这道题考察 共享模数攻击 的基本原理:
- 条件: 且同 、同
- 核心:扩展欧几里得求系数 ,组合
- 实现注意:负数指数处理、大数乘法防溢出、模逆计算
这是一个经典的 RSA 攻击场景,也是 CTF 密码学常见题。
- 1
信息
- ID
- 5956
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者