#include #include long code(long m,long e,long n)//-----------加解密函数:用c=m^e(modn)加密,用m=c^d(modn)解密 { long c=1; e=e+1; while(e!=1) { c=c*m; c=c%n; e--; } return c; } int (long a,long b)//--------------------判断两个数是否互素 { long r0=a; long r1=b; int q,temp; while(r1!=0) { q=r0/r1; temp=r0; r0=r1; r1=temp-q*r1; } if(r0==1)//------------------------------最大公因数为1时两数互素 return 1; else return 0; } long privatekey(long a,long b)//-------------用欧几里德算法求私钥d { long r,r1=1; long r0=b; long s0,t0,e,s1,q,temprivatekey; r1=a; t0=0; e=1; s0=1; s1=0; q=r0/r1; r=r0-q*r1; while(r>0) { temprivatekey=t0-q*e; t0=e; e=temprivatekey; temprivatekey=s0-q*s1; s0=s1; s1=temprivatekey; r0=r1; r1=r; q=r0/r1; r=r0-q*r1; } while(e<0) { e=e+b; } return e; } void main()//----------------------------------------主函数 { long p,q,e,d,m,n,t; cout<<"请输入两个素数 p,q: "; cin>>p>>q; n=p*q; cout<<"n为 :"< cout<<"n的欧拉函数值 :"< cin>>e;//-------------------------------------------输入公钥e,满足t>e>1 int u; u=(e,t);//----------------------------------------判断e是否与n的欧拉函数值互素 if(1 cout<<"请重新输入: "; cin>>e; } long e2=0; for(int i=0;;i++) { if((e2*e)%t==1) break; else e2++; } cout<<"e2为:"< cout<<"输入1加密,输入2解密:"; cin>>w; switch(w) { case 1 ://----------------------------------------------加密 { cout<<"请输入明文:"; cin>>m;//---------------------------------------输入明文 if(m<=n) cout<< "密文为:"< { long i=0,g,h; g=n; h=m; while(g!=0)//----------------------------------------求n的长度 { g/=10; i++; } long j=0; while(h!=0)//----------------------------------------求明文长度 { h/=10; j++; } long x=0,long c[1000];//-----------------------------数组c用来存放加密后的各个分组 int k=0;//-------------------------------------------k将记录明文分的组数 while(j!=0) { x=m/pow(10,j-i); if(x>n) { x=x/10; c[k]=code(x,e,n); m=m-x*pow(10,j-i+1); j=j-1; k++; } else { c[k]=code(x,e,n); m=m-x*pow(10,j-i); j=j-2; k++; } if(i>j)//----------------------------------------------最后一个分组的长度小于n的长度时直接加密 c[k]=code(m,e,n); } cout<<"密文输出:"; for(long l=0;l break; } case 2 ://------------------------------------------------解密 { cout<<"请输入密文:"< long d; d=privatekey(e,t); if(m<=n) cout<< "密文为:"< { long i=0,g,h; g=n; h=m; while(g!=0) { g/=10; i++; } long j=0; while(h!=0) { h/=10; j++; } long x=0,long c[1000]; int k=0; while(j!=0) { x=m/pow(10,j-i); if(x>n) { x=x/10; c[k]=code(x,d,n); m=m-x*pow(10,j-i+1); j=j-1; k++; } else { c[k]=code(x,d,n); m=m-x*pow(10,j-i); j=j-2; k++; } if(i>j) c[k]=code(m,d,n); } for(long l=0;l cout< break; } } }下载本文
else else