题目链接:RUAL 1141. RSA Attack
知道RSA,这个题目就算水题了
RSA加密过程很简单:
1. 选取很大的数p,q,令 n = p*q
2. 取一个数e,满足gcd(e,(p-1)*(q-1)) = 1 && e < (p-1)*(q-1)
3. 求出一个数d,d*e = 1 mod ( (p-1)*(q-1))
n d两个数构成公钥,可以告诉别人;
n e两个数构成私钥,e自己保留,不让任何人知道。
具体怎么加密看这里
由于这里p,q 都很小,所以可以很容易的破解RSA
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=32010; int prime[maxn],num; bool isprime[maxn]; void init() { for(int i=2;i<maxn;i++) if(!isprime[i]) { prime[num++]=i; for(int j=2*i;j<maxn;j+=i) isprime[j]=1; } } int ex_gcd(int &x,int &y,int a,int b) { if(b==0){ x=1;y=0; return a; } int d=ex_gcd(x,y,b,a%b); int t=x; x=y,y=t-a/b*y; return d; } long long quick_mod(int c,int x,int mod) { long long ret=1; for(long long b=c;x;x>>=1,b=b*b%mod) if(x&1) ret=ret*b%mod; return ret; } int main() { init(); int e,n,c,T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&e,&n,&c); int i; for(i=0;i<num;i++) if(n%prime[i]==0&&!isprime[n/prime[i]]) break; int p=prime[i],q=n/prime[i],x,y; int mod=(p-1)*(q-1); ex_gcd(x,y,e,mod); x=(x%mod+mod)%mod; printf("%lld\n",quick_mod(c,x,n)); } return 0; }