題意:給出密文,根據祕鑰求解明文
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;
}