[NFLSPC #6] 挑战大数因子分解
题目背景
`NFLSPC #6` 在即,来不了现场的 *SolarPea* 要把自己的题目的 std 发给能去现场的 *PolarSea*。
为了防止有选手窃听他们的通信以获得 std,他们打算使用一个公钥加密算法来确保通信的安全性。
于是 *SolarPea* 使用了他在知乎上看到的有 “最大的加解密速度和安全性” 的算法,这个算法的安全性 “依赖于大数因子分解难题”:
![](https://cdn.luogu.com.cn/upload/image_hosting/bc5hi2d2.png)
你是一名拥有 `factorization oracle` 的参赛选手,并且你已经获得了公钥和明文。请你利用手上的 `factorization oracle`,破解出 std 吧。
题目描述
由于图片可能看不清,我们重新描述这个加密算法:
- 假设 *SolarPea* 要给 *PolarSea* 发一个消息 $M'$,那么他们会进行如下的操作。
- *PolarSea* 首先生成五个大整数 $P, S_4, S_6, S_7, S_1$,使得 $P < S_6 < S_4P$ 且 $S_5 = S_4P + S_6$ 且 $(S_6\bmod P) ^ 3 < S_4 ^ 3 < S_1 ^ 3 < (S_1 + 1) ^ 3 < S_7 ^ 3 < P$,并计算 $S_3 = S_4P + S_5$。
- 然后 *PolarSea* 将 $S_3, S_5, S_7, S_1$ 发给 *SolarPea*。
- *SolarPea* 拿到了 *PolarSea* 给他发的四个数。首先,他需要构造一个 $M$ 使得 $S_1 < M < S_7$,并且和 *PolarSea* 商量好一个通过 $M$ 算出 $M'$ 的方法(例如若 $M'$ 为比较小的正整数,则可以令 $M = M' + S_1$),这个方法是不保密的,所以拿到 $M$ 就相当于拿到 $M'$ 了,所以你可以不用关心 $M'$ 而是只关心 $M$。
- *SolarPea* 生成了两个满足 $(S_3 - S_5) ^ 3 < r < w$ 的数 $w, r$,并计算 $C = (S_3 - S_5) ^ 3w + MS_5 + r(S_3 - S_5)$,然后将 $C$ 发给 *PolarSea*。
- *PolarSea* 只需计算 $\frac{C \operatorname{\bmod} P}{(2S_5 - S_3) \operatorname{\bmod} P}$ 即可获得 $M$。
现在你截获了 *PolarSea* 和 *SolarPea* 之间的所有通信(即 $S_3, S_5, S_7, S_1, C$),请你利用已知的信息破解出 $M$。
输入输出格式
输入格式
第一行,读入四个整数 $S_3, S_5, S_7, S_1$,表示公钥。
第二行,读入一个整数 $C$,表示密文。
输出格式
输出一行,包含一个值在 $S_1 < M < S_7$ 的整数 $M$,表示破解的明文。可以证明在给定限制下 $M$ 唯一。
输入输出样例
输入样例 #1
7001 4001 7 5
1155511307999246176590006
输出样例 #1
6
输入样例 #2
11083610 7305110 52 32
4578384821991465584924042474394616310820101790
输出样例 #2
39
说明
### 样例 1 解释
生成的 $P=1000$,$S_4=3$,$S_6=1001$,$S_7=7$,$S_1=5$。计算出的 $S_5=4001$,$S_3=7001$。
密文 $M=6$。加密时选取的 $w=42796713439376$,$r=15045364725522$,加密结果 $C=1155511307999246176590006$。
当然,这次加密是很弱的,因为 $6$ 是 $5$ 和 $7$ 中间的唯一整数。
### 数据范围与约定
对于所有数据, $P < 10 ^ {500}$,$C < P^{10}$。
- 子任务 1($20$ 分):$P < 10 ^ 6$。
- 子任务 2($20$ 分):$P < 10 ^ {18}$。
- 子任务 3($20$ 分):$P$ 为质数。
- 子任务 4($20$ 分):所有数均为随机生成。
- 子任务 5($20$ 分):无特殊限制。
Source:NFLSPC #6 E by asmend