题意:给出密文,根据秘钥求解明文
RSA算法流程
(1)用户秘密选择两个大素数p, q,然后计算出N = pq;
(2)用户计算出F_N = (p-1)(q-1),然后随机选择一个整数e,满足1 < e < F_N,且gcd(e, F_N) == 1.e为加密秘钥
(3)然后用e和F_N算出脱密秘钥d,ed%F_N==1,d是e mod F_N 的逆元,d是脱密秘钥
(4)e, N是公开参数,即公钥,p, q,d严格保密
加密:c = E(m) = m ^e(modN)
解密:m = D(c) = c ^ d(modN)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1211
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ect_gcd(ll a, ll b, ll &x, ll &y)
{
if(b == 0)
{
x = 1, y = 0;
return a;
}
ll d = ect_gcd(b, a % b, x, y);
int temp = x;
x = y;
y = temp - a / b * (y);
return d;
}
ll inv(ll a, ll n)
{
ll d, x, y;
d = ect_gcd(a, n, x, y);
return d == 1 ? (x + n) % n : -1;
}
ll pow_mod(ll x, ll n, ll mod)
{
ll res = 1;
while(n)
{
if(n & 1) res = res * x % mod;
x = x * x % mod;
n >>= 1;
}
return res;
}
ll solve(ll c, ll d, ll N)
{
return pow_mod(c, d, N);
}
int main()
{
int l;
ll N, F_N;
ll p, q, e, d;
while(~scanf("%I64d%I64d%I64d%d", &p, &q, &e, &l))
{
N = p * q, F_N = (p - 1) * (q - 1);
d = inv(e, F_N);
for(int i = 0; i < l; i++)
{
ll val;
scanf("%I64d", &val);
printf("%c", solve(val, d, N) % 128);
}
printf("\n");
}
return 0;
}