1、qi=k;while(is_prime_san(q)!素数 q 为 :,qqMAX-1-i-1);return;3.2选择整数e整数e满足/产生与(p-1)*(q-1)互素的随机数void erand(int eMAX,int mMAX)eMAX-1=5;随机产生一个与(p-1)*(q-1)互素的 e :for(i=0;eMAX-1-1;ei=k;while(k=rand()%10)=0)eeMAX-1-1=k;while(coprime( e, m)!eMAX-1;,eeMAX-1-i-1);return ;3.3确定d确定d使得/根据上面的p、q和e计算密钥dvoid rsad(int e
2、MAX,int gMAX,int *d)int rMAX,n1MAX,n2MAX,kMAX,wMAX;int i,tMAX,b1MAX,b2MAX,tempMAX;mov(g,n1);mov(e,n2);MAX; ki=wi=ri=tempi=b1i=b2i=ti=0;b1MAX-1=0;b10=0;/b1=0;b2MAX-1=1;b20=1;/b2=1;while(1) ki=wi=0; divt(n1,n2,k,w);/k=n1/n2; tempi=0; mul(k,n2,temp);/temp=k*n2; ri=0; sub(n1,temp,r); if(rMAX-1=1) & (r0=
3、0)/r=0 break; else mov(n2,n1);/n1=n2; mov( r,n2);/n2=r; mov(b2, t);/t=b2; mul(k,b2,temp);/b2=b1-k*b2; b2i=0; sub(b1,temp,b2); mov(t,b1); ti=0; add(b2,g,t); tempi=di=0; divt(t,g,temp,d);由以上的(p-1)*(q-1)和 e 计算得出的 d :dMAX-1;,ddMAX-1-i-1);3.4加密函数利用上面的函数我们可以得到加密使用的公钥加密函数如下所示:加密函数:/加密模块儿,例如C = Pe mod nstru
4、ct slink *jiami(int eMAX,int nMAX,struct slink *head)struct slink *p;struct slink *h; struct slink *p1,*p2; int m=0,i;n加密后形成的密文内容:p1=p2=(struct slink* )malloc(LEN);h=NULL; p=head; if(head!=NULL)do expmod( p-bignum , e ,n ,p1-bignum);p1-bignumMAX-1;,p1-bignump1-bignumMAX-1-1-i); m=m+1;if(m=1) h=p1;el
5、se p2-next=p1;p2=p1; p1=(struct slink * )malloc(LEN); p=p-next; while(p!=NULL);p2-next=NULL; p=h;return(h);3.5解密函数利用之前的函数我们可以得到解密的私钥为解密函数如下:解密函数:/解密模块儿,例如P = Cd mod nvoid jiemi(int dMAX,int nMAX,struct slink *h) int i,j,temp;struct slink *p,*p1;char ch65535;p1=(struct slink* )malloc(LEN);p=h;j=0;if(
6、h! do p1-bignumi=0;bignum , d ,n ,p1- temp=p1-bignum0+p1-bignum1*10+p1-bignum2*100; if ( p1-bignumMAX-2)=0) temp=0-temp; chj=temp; j+;while (p!解密密文后所生成的明文:j;%c,chi);4实验结果运行程序,系统自动生成公钥和私钥:公钥为:私钥为:加密操作:输入明文:wangxinijfioajfioahgiuhaijfalijgoaijrgfiahguajdnandijuhaifhfuiah输出密文,程序运行结果如下所示:解密操作:解密所用的密文就是上
7、面加密得到的密文。输出明文,程序运行结果如下所示:5实验完整代码#includestring.hstdlib.htime.hmath.hmalloc.h#define MAX 100#define LEN sizeof(struct slink)void sub(int aMAX,int bMAX ,int cMAX );struct slink int bignumMAX;/bignum98用来标记正负号,1正,0负bignum99来标记实际长 struct slink *next;/大数运算void print( int aMAX ) int i;a99;,aa99-i-1); retur
8、n;int cmp(int a1MAX,int a2MAX) int l1, l2;int i;l1=a199;l2=a299;if (l1l2) return 1; if (l1=0;i-) if (a1ia2i) return 1 ; if (a1i return 0;void mov(int aMAX,int *b)int j;for(j=0;jj+) bj=aj; return ;/大数相乘(向左移)void mul(int a1MAX,int a2MAX,int *c)int i,j,y,x,z,w,l1,l2;l1=a1MAX-1;l2=a2MAX-1;if (a1MAX-2=-
9、a2MAX-2= cMAX-2=0;else if (a1MAX-2= cMAX-2=;else if (a2MAX-2=l1;l2; x=a1i*a2j; y=x/10; z=x%10; w=i+j; cw=cw+z; cw+1=cw+1+y+cw/10; cw=cw%10;w=l1+l2;if(cw-1=0)w=w-1;cMAX-1=w; /大数相加,注意进位void add(int a1MAX,int a2MAX,int *c)int i,l1,l2;int len,tempMAX;int k=0;if(a1MAX-2=)&(a2MAX-2=)cMAX-2=mov(a1,temp);te
10、mpMAX-2=0;sub(a2,temp,c);mov(a2,temp);temp98=0;sub(a1,temp,c);if(l1len)for(i=len; ci=(a1i+k)%10; k=(a1i+k)/10;if(k!=0) cl1=k; len=l1+1;else len=l1;else ci=(a2i+k)%10; k=(a2i+k)/10; cl2=k; len=l2+1;c99=len;/大数相减,注意借位void sub(int a1MAX,int a2MAX,int *c)int len,t1MAX,t2MAX;if (a1MAX-2=) & (a2MAX-2=mov(
11、a1,t1); mov(a2,t2);t1MAX-2=0; t2MAX-2=0;sub(t2,t1,c);else if( a2MAX-2=mov(a2,t2);t2MAX-2=0;add(a1,t2,c);t2MAX-2=if(cmp(a1,a2)=1)len=l2;if (a1i-k-a2i)0)ci=(a1i-a2i-k+10)%10; k=1; else ci=(a1i-a2i-k)%10; k=0; if (a1i-k)显示为980了 len=l1-1; i=2; while (cl1-i=0)/111456-111450=00006,消除0后变成了6 len=l1-i; i+;el
12、se len=l1;if(cmp(a1,a2)=(-1)len=l1;if (a2i-k-a1i)ci=(a2i-a1i-k+10)%10; ci=(a2i-a1i-k)%10; if (a2i-k)ci=(a2i-k+10)%10; ci=(a2i-k)%10;if(cl2-1=0) len=l2-1; while (cl1-i=0)else if(cmp(a1,a2)=0) len=1; clen-1=0;cMAX-1=len;/取模数void mod(int aMAX,int bMAX,int *c)/c=a mod b,注意:经检验知道此处A和C的数组都改变了 int dMAX;mov
13、 (a,d);while (cmp(d,b)!=(-1)/c=a-b-b-b-b-b.until(c41245-30000*1-11245-3000*3-2245-300*7-145-30*4=25-25-3*8=1 for(j=0; dj=0; di=1; dMAX-1=i+1; mov(b,g); mul(g,d,e); while (cmp(a,e)!=(-1) ci+; sub(a,e,f); mov(f,a);/f复制给g for(j=i;j+)/高位清零 ej=0;mov(a,w);if (cm=0) cMAX-1=m;else cMAX-1=m+1;/解决了 m=a*b mod
14、nvoid mulmod(int aMAX ,int bMAX ,int nMAX,int *m)int cMAX,dMAX; di=ci=0;mul(a,b,c); divt(c,n, d,m);mMAX-1;,mmMAX-1-i-1);nm length is : %d n,mMAX-1);/解决了 m=ap mod n的函数问题。void expmod(int aMAX ,int pMAX ,int nMAX,int *m)int tMAX,lMAX,tempMAX; /t放入2,l放入1int wMAX,sMAX,cMAX,bMAX,i;MAX-1; bi=li=ti=wi=0;t0=
15、2;tMAX-1=1;l0=1;lMAX-1=1; mov(l,temp);mov(a,m); mov(p,b);while(cmp(b,l)!wi=ci=0; divt(b,t,w,c);/ c=p mod 2 w= p /2 mov(w,b);/p=p/2if(cmp(c,l)=0) /余数c=1wi=0;mul(temp,m,w);mov(w,temp);divt(temp,n,w,c);/c为余c=temp % n,w为商w=temp/nmov(c,temp);si=0;mul(m,m,s);/s=a*aci=0;divt(s,n,w,c);/w=s/n;c=s mod nmov (c,m);mul(m,temp,s);/余数s给mmMAX-2=aMAX-2;/为后面的汉字显示需要,用第99位做为标记/k=temp*k%nint is_prime_san(int pMAX ) int i,aMAX,tMAX,sMAX,oMAX; si=oi=ai=ti=0; t0=1; tMAX-1=1; a0=2;/ 2,3,5,7 aMAX-1=1; sub(p,t,s); expmod ( a, s, p ,o); if ( cmp(o,t) != 0 ) a0=3;i+) oi=0; a0=5; a0=7;if ( cmp(o,t) !return 1;