您的位置:首页 > 其它

HDU 1211 RSA (逆元)

2015-10-25 14:55 447 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1211

题意:

给出加密后的信息和加密解密方法要求出,解密后的信息。

方法如下:

1)给出p q e l, 先求出n = p * q, f = (p - 1) * (q - 1)

2) C = E(m) = me mod n (m为原信息,保证gcd(e,
f) = 1)

3)M = D(c) = cd mod
n (c为加密后的信息),求d,使得满足d × e mod f = 1 mod f,然后用 d 解密出信息

思路:关键是求d,易得d mod f = (1 mod f)/ e,即 d 为 mod f 的运算下 e 的逆元,照着模版打就行了。

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <stdlib.h>
#define INF 0x7fffffff
#define MOD 1000000007
using namespace std;
typedef long long ll;

ll extgcd(ll a, ll b, ll& x, ll& y)
{
ll d = a;
if(b != 0)
{
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
}
else
{
x = 1; y = 0;
}
return d;
}

ll mod_inverse(ll a, ll m)
{
ll x, y;
extgcd(a, m, x, y);
return (m + x % m) % m;
}

ll mod_pow(ll x, ll n, ll mod)
{
ll res = 1;
while(n > 0)
{
if(n & 1) res = res * x % mod;
x = x * x % mod;
n >>= 1;
}
return res;
}

int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif

ll p, q, e, l, num;
while(scanf("%I64d%I64d%I64d%I64d", &p, &q, &e, &l) != EOF)
{
ll n = p * q, f = (p - 1) * (q - 1);
ll d = mod_inverse(e, f);
//printf("n=%I64d f=%I64d d=%I64d\n", n, f, d);
for(int i = 0; i < l; i++)
{
scanf("%I64d", &num);
printf("%c", mod_pow(num, d, n));
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: