ural 1141 RSA Attack
http://acm.timus.ru/problem.aspx?space=1&num=1141
即给出e,n,c(c即密文),求明文,先求出phi函数就ok了.
#include <stdio.h>
typedef long long LL;
#define MAXN 32005
int e,n,c;
int pn,prime[MAXN],phi[MAXN]={0,1};
void calc_phi()
{
for(int i=2;i<MAXN;i++)
{
if(!phi[i])
{
prime[pn++]=i;
phi[i] = i-1;
}
for(int j=0; j < pn && i*prime[j] < MAXN; j++)
{
if(i % prime[j] == 0)
{
phi[ i*prime[j] ] = phi[i] * prime[j];
// printf("%I64d\n",phi[ i*prime[j] ]);
break;
}
else
{
phi[ i*prime[j] ] = phi[i] * (prime[j]-1);
}
}
}
// printf("%d\n",phi[32000]);
}
void ext_gcd(int a,int b,int &x,int &y) // gcd(a,b) = ax+by
{
if(!b)
{
x = 1;
y = 0;
return;
}
ext_gcd(b,a%b,x,y);
int t = x;
x = y;
y = t - a / b * y;
}
int mod_pow(int a,int b,int m) //a^b(mod m)
{
bool bit[32];
int i=0;
while(b)
{
bit[i++] = b&1 ? 1 : 0;
b >>= 1;
}
LL s = 1;
for(i--;i>=0;i--)
{
s = s * s % m;
if(bit[i]) s = s * a % m;
}
return s;
}
inline void solve()
{
int d,y,ans;
ext_gcd(e,phi[n],d,y);
if(d < 0) d = (d + phi[n]) % phi[n];
ans = mod_pow(c,d,n);
printf("%d\n",ans);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("tdata.txt","r",stdin);
#endif
calc_phi();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %d %d",&e,&n,&c);
solve();
}
return 0;
}
浙公网安备 33010602011771号