//不需要用户手动输入密文
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <string>
#include <math.h>
#define N 100
#include "code_func.h"
using namespace std;
int main(int argc, char *argv[])
{
srand(time(0));
//随机产生大素数p,q,且p=q模4=3
long long p=RandomPrime(28); //随机生成两个素数,p、q是私钥
long long q=RandomPrime(28);
long long n=p*q;
cout<<"p= "<<p<<" q= "<<q<<" n= "<<n<<endl;
//求中国剩余定理需要的p1,q1
//广义欧几里德除法求p1,q1
long long p1=Oj(p,q);
long long q1=Oj(q,p);
//明文s1=;(数字化处理);
string s1m,mes;
char c;
long long s1[N]={0};
long long len=0;
cout<<"please input the massage"<<endl;
cin>>s1m;
len=s1m.size();
c=getchar();
while(c==' '){
cin>>mes;
s1m=s1m+" "+mes;
len=s1m.size();
c=getchar();}
Mes_num(s1m,s1);
//得到c=s1^2=s2(mod n);
long long s2[N]={0};
long long k=0;
while(s1[k]){
s2[k]=Mod_equ((s1[k]*s1[k]),n);
k++;}
//输出加密后密码
cout<<endl<<endl<<"the code is: ";
k=0;
while(s2[k]){
cout<<s2[k]<<" ";
k++;}
cout<<endl;
//解密后使用中国剩余定理
k=0;
long long s3[N]={0},s4[N]={0};//手动输入的密码
long long i=0,j=0;
while(s2[k]){
i=Cod_Mes(s2[k],p);
j=Cod_Mes(s2[k],q);
if(i>(long long)(p/2)) i=p-i;
if(j>(long long)(q/2)) j=q-j;
long long i1=Mod_equ((p*p1*j),n);
long long j1=Mod_equ((q*q1*i),n);
s4[k]=Mod_equ((i1+j1),n);
k++;}
char ss[N];//密码解密后对应的明文
cout<<endl<<endl<<"the message should be:"<<endl;
Num_mes(s4,ss);
k=0;
while(ss[k]){
cout<<ss[k];
k++;}
getchar();
system("PAUSE");
return EXIT_SUCCESS;
}
评论2