A5703 | 「CQOI2016」密钥破解
时间限制1s
内存限制256MB
通过 / 提交0/0
题目描述
一种非对称加密算法的密钥生成过程如下:
1. 任选两个不同的质数 $p, q$;
2. 计算 $N = pq, r=(p-1)(q-1)$;
3. 选取小于 $r$,且与 $r$ 互质的整数 $e$;
4. 计算整数 $d$,使得 $ed \equiv 1 \pmod r$;
5. 二元组 $(N, e)$ 称为**公钥**,二元组 $(N, d)$ 称为**私钥**。
当需要加密消息 $n$ 时(假设 $n$ 是一个小于 $N$ 的整数,因为任何格式的消息都可转为整数表示),使用公钥 $(N, e)$,按照
$$n^e \equiv c \pmod N$$
运算,可得到密文 $c$。
对密文 $c$ 解密时,用私钥 $(N, d)$,按照
$$c^d \equiv n \pmod N$$
运算,可得到原文 $n$。算法正确性证明省略。
由于用公钥加密的密文仅能用对应的私钥解密,而不能用公钥解密,因此称为非对称加密算法。通常情况下,公钥由消息的接收方公开,而私钥由消息的接收方自己持有。这样任何发送消息的人都可以用公钥对消息加密,而只有消息的接收方自己能够解密消息。
现在,你的任务是寻找一种可行的方法来破解这种加密算法,即根据公钥破解出私钥,并据此解密密文。
1. 任选两个不同的质数 $p, q$;
2. 计算 $N = pq, r=(p-1)(q-1)$;
3. 选取小于 $r$,且与 $r$ 互质的整数 $e$;
4. 计算整数 $d$,使得 $ed \equiv 1 \pmod r$;
5. 二元组 $(N, e)$ 称为**公钥**,二元组 $(N, d)$ 称为**私钥**。
当需要加密消息 $n$ 时(假设 $n$ 是一个小于 $N$ 的整数,因为任何格式的消息都可转为整数表示),使用公钥 $(N, e)$,按照
$$n^e \equiv c \pmod N$$
运算,可得到密文 $c$。
对密文 $c$ 解密时,用私钥 $(N, d)$,按照
$$c^d \equiv n \pmod N$$
运算,可得到原文 $n$。算法正确性证明省略。
由于用公钥加密的密文仅能用对应的私钥解密,而不能用公钥解密,因此称为非对称加密算法。通常情况下,公钥由消息的接收方公开,而私钥由消息的接收方自己持有。这样任何发送消息的人都可以用公钥对消息加密,而只有消息的接收方自己能够解密消息。
现在,你的任务是寻找一种可行的方法来破解这种加密算法,即根据公钥破解出私钥,并据此解密密文。
输入格式
输入文件内容只有一行,为空格分隔的三个正整数 $e, N, c$。
输出格式
输出文件内容只有一行,为空格分隔的两个整数 $d, n$。
输入输出样例
输入 #1
3 187 45
输出 #1
107 12
对于 $30\%$ 的数据,$e, N, c \leq 2^{20}$;
对于 $100\%$ 的数据,$1 \leq e, N, c \leq 2^{62}, c < N$。
对于 $100\%$ 的数据,$1 \leq e, N, c \leq 2^{62}, c < N$。
C++ 编辑器
输入
输出
可保存默认模板;新题优先使用已保存模板。
当前快捷键仅展示,暂不支持修改。
- 撤销
Ctrl / ⌘ + Z - 重做
Ctrl / ⌘ + Y - 查找
Ctrl / ⌘ + F - 全选
Ctrl / ⌘ + A - 复制
Ctrl / ⌘ + C - 剪切
Ctrl / ⌘ + X - 粘贴
Ctrl / ⌘ + V - 自动排版
工具栏排版按钮 - 草稿保存
编辑时自动保存到本机
历史
提交记录
状态说明时间源码
AI
作答助手
你好,我是作答助手。可以问思路、复杂度、样例含义或代码报错原因;不会直接给出完整 AC 代码。
确定要清空代码吗?