根据RSA一堆原理,写了个实现的代码,亲测可用,哈哈记录一下
#include <iostream> #include <cstdio> #include <math.h> 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; }