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;
}

posted @ 2010-09-12 19:44  菜到不得鸟  阅读(182)  评论(0)    收藏  举报