威望0
积分7966
贡献0
在线时间763 小时
UID1
注册时间2021-4-14
最后登录2024-11-23
管理员
- UID
- 1
- 威望
- 0
- 积分
- 7966
- 贡献
- 0
- 注册时间
- 2021-4-14
- 最后登录
- 2024-11-23
- 在线时间
- 763 小时
|
- #include <iostream.h>
- #include <math.h>
- 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 gcd(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为 :"<<n<<endl;
- t=(p-1)*(q-1);//------------------------------------欧拉函数值
- cout<<"n的欧拉函数值 :"<<t<<endl;
- cout<<"请输入公钥e: ";
- cin>>e;//-------------------------------------------输入公钥e,满足t>e>1
- int u;
- u=gcd(e,t);//----------------------------------------判断e是否与n的欧拉函数值互素
- if(1<e&&e<t&&u==0)
- {
- cout<<"请重新输入: ";
- cin>>e;
- }
- int w;
- cout<<"输入1加密,输入2解密:";
- cin>>w;
- switch(w)//--------------------------------------------w为1时加密,为2时解密
- {
- case 1 ://----------------------------------------------加密
- {
- cout<<"请输入明文:";
- cin>>m;//---------------------------------------输入明文
- if(m<=n)
- cout<< "密文为:"<<code(m,e,n)<<endl;//----------明文数值小于n时直接加密
- else
- {
- 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<k;l++)
- cout<<c[l];
- cout<<endl;
- }
- break;
- }
- case 2 ://------------------------------------------------解密
- {
- cout<<"请输入密文:"<<endl;
- cin>>m;
- long d;
- d=privatekey(e,t);
- if(m<=n)
- cout<< "密文为:"<<code(m,d,n)<<endl;
- else
- {
- 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<k;l++)
- cout<<c[l];
- cout<<endl;
- }
- break;
- }
-
- }
- }
复制代码 |
|