1141. RSA Attack(RSA)

1141ios

愈來愈喜歡數論了 頗有意思web

先看個RSA的介紹算法

RSA算法是一種非對稱密碼算法,所謂非對稱,就是指該算法須要一對 密鑰,使用其中一個加密,則須要用另外一個才能解密。
RSA的算法涉及三個參數,n、e一、e2。
其中, n是兩個大質數p、 q的積,n的二進制表示時所佔用的位數,就是所謂的密鑰長度。
e1和e2是一對相關的值,e1能夠任意取,但要求e1與(p-1)*(q-1) 互質;再選擇e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n,e1),(n,e2)就是密鑰對。其中 (n,e1)爲 公鑰(n,e2)爲私鑰。[1]
RSA加解密的算法徹底相同,設A爲明文,B爲密文,則:A=B^e2 mod n;B=A^e1 mod n;(公鑰加密體制中,通常用公鑰加密,私鑰解密)
e1和e2能夠互換使用,即:
A=B^e1 mod n;B=A^e2 mod n;
這題就是一個RSA求密文的算法
由於(e2*e1)mod((p-1)*(q-1))=1。 因此 e2*e1+k*(p-1)*(q-1)  = 1 運用擴展歐幾里得能夠求出e2 K 固然K是沒有用的 再快速冪求出(c,e2)%n=B
若是e2爲負值 就加上e1與(p-1)*(q-1)的乘積
 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 using namespace std;
 7 #define N 32000
 8 #define LL long long
 9 int p[N+10],f[N+10],g;
10 void init()
11 {
12     int i,j;
13     for(i = 2; i < N ; i++)
14     {
15         if(!f[i])
16         for(j = i+i ; j < N ; j+=i)
17         f[j] = 1;
18     }
19     for(i = 2; i < N ; i++)
20     if(!f[i])
21     p[++g] = i;
22 }
23 void exgcd(int a,int b,int &x,int &y)
24 {
25     if(b==0)
26     {
27         x=1;y=0;return ;
28     }
29     exgcd(b,a%b,x,y);
30     int t = x;
31     x = y;
32     y = t-a/b*y;
33 }
34 LL expmod(int a,int b,int mod)
35 {
36     LL t;
37     if(b==0) return 1%mod;
38     if(b==1) return a%mod;
39     t = expmod(a,b/2,mod);
40     t = t*t%mod;
41     if(b&1) t = t*a%mod;
42     return t;
43 }
44 int main()
45 {
46     int n,k,e,i,c,a,b,x,y;
47     init();
48     cin>>k;
49     while(k--)
50     {
51         cin>>e>>n>>c;
52         for(i = 1 ; i <= g ; i++)
53         if(n%p[i]==0)
54         {
55             a = p[i];
56             b = n/p[i];
57         }
58         int o = (a-1)*(b-1);
59         exgcd(e,o,x,y);
60         x = x<0?x+e*o:x;
61         LL ans = expmod(c,x,n);
62         cout<<ans<<endl;
63     }
64     return 0;
65 }
View Code
相關文章
相關標籤/搜索