同余方程或快速幂水题。题意:RSA加密算法是这样的,
1.选择两个大素数p和q
2.计算n = p × q,F(n) = (p - 1) × (q - 1)
3.选择一个整数e(1 < e < F(n)),令gcd(e, F(n)) = 1,e 就是公钥
4.计算一个整数d,使得d × e = 1 (mod F(n)),d 就是密钥
加密用这个方法
C = E(m) = m^e mod n
解密用这个方法
M = D(c) = c^d mod n
现在给你p,q,e,l以及接下来l个c,c是密文,求输出明文。
解题思路:可以通过加密方法求明文也可以通过解密方法求明文,通过加密方法求明文的话就是找一个ASCII值m使得m^e mod n = c就行了,使用快速幂,解密方法的话就是要找到一个d使得c^d mod n的结果是在ASCII值范围内,要用同余方程。这里用的是加密方法求明文。
算出n后直接枚举ASCII值使得m^e mod n = c然后输出m代表的字符就行了。
解题代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <limits.h>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
LL p, q, n, e, l, c;
LL FastPow(LL base, LL n, LL mod);
int main()
{
while (~scanf("%lld %lld %lld %lld", &p, &q, &e, &l))
{
n = p * q;
for (LL i=0; i<l; ++i)
{
scanf("%lld", &c);
for (LL i=0; i<256; ++i)
{
if (FastPow(i, e, n) == c)
{
printf("%c", (int)i);
break;
}
}
}
puts("");
}
return 0;
}
LL FastPow(LL base, LL n, LL mod)
{
LL res = 1;
base %= mod;
while (n)
{
if (n & 1)
{
res *= base;
res %= mod;
}
base *= base;
base %= mod;
n >>= 1;
}
return res;
}