根据RSA一堆原理,写了个实现的代码,亲测可用,哈哈记录一下
#include
#include
#include
using namespace std;
int exgcd(int a,int b,int & x,int & y){
if(b == 0){
x = 1;
y = 0;
return a;
}
int r = exgcd(b, a%b, x, y);
int t = y;
y = x - (a/b)*y;
x = t;
return r;
}
//快速幂
int PowerMod(int a, int b, int c)
{
int ans = 1;
a = a % c;
while(b>0) {
if(b % 2 == 1)
ans = (ans * a) % c;
b = b/2;
a = (a * a) % c;
}
return ans;
}
long SKG(long p,long q,long e,long M)
{
long N=p*q;
long fN=(p-1)*(q-1);
long C=1;
C=PowerMod(M,e,N);
return C;
}
long SKG_1(long p,long q,long e,long C)
{
long N=p*q;
long fN=(p-1)*(q-1);
long M=1;
int x,y;
long d;
exgcd(e,fN,x,y);
d=x%fN;
M=PowerMod(C,d,N);
return M;
}
int main()
{
long p,q,e,d,M,C;
char i;
printf("请选择加密或解密:加密请选择1,解密请选择2\n");
i=getchar();
if(i=='1')
{
printf("请依次输入p,q,e,M\n");
scanf("%d%d%d%d",&p,&q,&e,&M);
printf("%d\n",SKG(p,q,e,M));
}
if(i=='2')
{
printf("请依次输入p,q,e,C\n");
scanf("%d%d%d%d",&p,&q,&e,&C);
printf("%\d\n",SKG_1(p,q,e,C));
}
return 0;
}