#include <stdio.h> #include <stdlib.h> #include <math.h> #include <malloc.h> #define MAX 20 typedef struct{ int a[MAX]; int N; }BTN; int Euclidean(int a,int b);//欧几里得算法求 最大公约数 int ExtendedEuclidean(int a,int b);//扩展欧几里得算法求逆 int SquareMultiply(int x,int c,int n);//z=pow(x,c)mod n BTN ExBinary(int numx);//十进制向二进制转化 int* RsaParameter(int p,int q);//RSA参数生成 int EnRSA(int p,int q,int num);//加密/*公钥(n,b)*/ int DeRSA(int p,int q,int a,int num);解密/*私钥(p,q,a)*/ void main() { int mp,mq,*MyKey; int x,x1,x2; mp=101;mq=103; x=9726; MyKey=RsaParameter(mp,mq); x1=EnRSA(MyKey[0],MyKey[1],x); x2=DeRSA(MyKey[2],MyKey[3],MyKey[4],x1); printf("\n加密%d得到的密文是:%d",x,x1); printf("\n解密%d得到的明文是:%d\n",x1,x2); } int Euclidean(int a,int b) {//欧几里得算法求 最大公约数 int r0,r1,m,r,q,rm; r0=a; r1=b; m=1; r=r1; if(a==0 || b==0) r=0; while(r!=0) { rm=r; q=r0/r1; r=r0-q*r1; r0=r1; r1=r; m++; } return rm; } int ExtendedEuclidean(int a,int b) {//扩展欧几里得算法求逆 int a0,b0,t0,t,s0,s,q,r; int temp; a0=a; b0=b; t0=0;t=1;s0=1;s=0; q=a0/b0; r=a0-q*b0; while(r>0) { temp=t0-q*t; t0=t; t=temp; temp=s0-q*s; s0=s; s=temp; a0=b0; b0=r; /*********** r=gcd(a,b) s*a+t*b=r *************/ q=a0/b0; r=a0-q*b0; } r=b0; if(s<0)s=b+s; return s; } int SquareMultiply(int x,int c,int n) {//z=pow(x,c)mod n int l; int z; BTN c2; c2=ExBinary(c); z=1; l=c2.N; for(int i=l-1;i>=0;i--) { z=pow(z,2); z=z%n; if(c2.a[i]==1) { z=(z*x)%n; } //printf("%d %d\n",c2.a[i],z); } return z; } BTN ExBinary(int num) {//十进制转换成二进制 BTN b; int i=0; while(num!=0) { b.a[i]=num%2; num=num/2; i++; } b.N=i; return b; } int* RsaParameter(int p,int q) {//RSA参数生成 int n,s,b,a,k; int *key; key=(int *)malloc(5*sizeof(int)); n=p*q; s=(p-1)*(q-1); for(;;) { b=rand()%s; k=Euclidean(b,s); if(k==1)break; } a=ExtendedEuclidean(b,s); *key=n; *(key+1)=b; *(key+2)=p; *(key+3)=q; *(key+4)=a; return key; } int EnRSA(int n,int b,int num) {//加密/*公钥(n,b)*/ int Cryptograph; Cryptograph=SquareMultiply(num,b,n); return Cryptograph; } int DeRSA(int p,int q,int a,int num) {//解密/*私钥(p,q,a)*/ int Cleartext; int n; n=p*q; Cleartext=SquareMultiply(num,a,n); return Cleartext; }