#P12603. RuShiA

RuShiA

题目背景

原题来自 2025 年洛谷愚人节比赛M 题


已经了解 RSA 算法的选手可以略过题目背景。

RSA 算法是一种非对称加密算法。

前期准备工作:

  • 生成两个很大的质数 ppqq
  • 计算 n=pqn=pq
  • 选择一个合适的质数 ee(不需要太大)。
  • r=(p1)(q1)r=(p-1)(q-1)
  • 计算 ee 在模 rr 下的逆元,记作 dd。即:解方程 ed1(modr)ed \equiv 1 (\bmod r)
  • 公开 nnee,即公钥。ppqqdd 保密,即私钥。

加密消息:

  • 对于明文 mm,计算 c=memodnc=m^e \bmod ncc 即为密文。

解密消息:

  • 对于密文 cc,计算 m=cdmodnm=c^d \bmod nmm 即为明文。

作为破解者,可以知道的只有公钥 nnee 和密文 cc

要想计算出 mm,就必须知道 dd。若要通过 nn 计算出 d=(p1)(q1)d=(p-1)(q-1),相当于要通过分解 nn 计算 ppqq

但是 ppqq 是很大的质数,对 nn 做质因数分解非常困难。这是 RSA 算法安全性的基础。

不过,如果 RSA 运用得不好(比如,ppqq 选取得太小),那么还是有破解的可能(比如,因为质数太小直接暴力分解 nn)。

请试着破解下面几组密文。

题目描述

本题为提交答案题

密文已经下发,请在附件中下载。一共有 99 批密文。请自行尝试解密这些密文。

一批密文内可能含多组 nncc。若无特殊说明,e=65537e=65537

解密出来的 mm 请转化为字符串。转化方式为:将 mm 标识为 16 进制字符串,按字节转化为 ASCII 编码,得到信息。信息中包含了 flag——你不需要提交整条信息,只需要提交该 flag。

flag 会用花括号包围起来,例如:This is your flag: {wxyz9876}。则 flag 是 wxyz9876

例如,m=581758585144958727177341m=581758585144958727177341,转化为十六进制为 7b31323334414243447d\texttt{7b31323334414243447d},按字节转化为 ASCII 编码后得到消息 {1234ABCD},则你需要提交 1234ABCD 作为答案。

输入格式

一个整数 nn 表示密文批次编号,从 1199

输出格式

一行,包含一条字符串,对应批次解密得到的 flag。

提示

Subtask 编号 特殊性质 密文组数 分值
1 1 5
2 p>10298×qp>10^{298}\times q
3 ppqq 差值小于 10310^3 10
4 p1=p2p_1=p_2 2
5 e=3e=3 1
6 e1=65537e_1=65537e2=70001e_2=70001m1=m2m_1=m_2 2 15
7 e1=e2=e3=3e_1=e_2=e_3=3m1=m2=m3m_1=m_2=m_3 3
8 提供 a=(p+2)(q+2)a=(p+2)(q+2) 1
9

如果你使用 Python,那么下面这些可能可以帮助你:

  • Python 自带函数 pow(x, a, p),计算 xamodpx^a \bmod p
  • dd 的计算可以参考如下代码(需要 primefac 包):
from primefac import modinv
p = ...
q = ...
e = ...
r = (p - 1) * (q - 1)
d = modinv(e, r) % r