RSA加密算法(未完成)

来源:互联网 发布:电脑淘宝网官方下载 编辑:程序博客网 时间:2024/05/19 01:07
#include <iostream>#include <time.h>struct EuclidRetVal//扩张Euclid算法用的返回值类型{long x;long y;long d;};class RSA{public:long N,NT;long e;long mMessage;RSA(){N=0;e=3;}long modexp(long x,long y,long N)  //模的指数运算{if(y==0) return 1;long z=modexp(x,y/2,N);//计算机中整形数相除,结果必定为向下取整//if (y%2==0) return (z*z)%N;//elsereturn (x*z*z)%N;if (y%2==0) {long modn=(z*z)%N;if(modn<0) return N+modn;elsereturn modn;}else{long modn=(x*z*z)%N;if(modn<0) return N+modn;else return modn;}}EuclidRetVal extend_Euclid(long a,long b)//扩展Euclid算法,a>b{if (b==0){EuclidRetVal temp;temp.x=1,temp.y=0,temp.d=a;return temp;}EuclidRetVal temp=extend_Euclid(b , a%b);long tempval=temp.x-(a/b)*temp.y;temp.x=temp.y;temp.y=tempval;return temp;//(y,x-a/b*y,d)}void CreateTwoPrime(int n){do{srand((int)time(0));p=createRndPrime(n);q=createRndPrime(n);//p=5,q=11;//p=29,q=23;N=p*q;NT=(p-1)*(q-1);xyd=extend_Euclid(NT,e); //}while( xyd.d!=1 );//直到NT与e素为止if(xyd.y<0)d=NT+xyd.y;//小于0时,这样计算得来的d与x模NT同余,因此是e的逆元elsed=xyd.y;}void show(){std::cout<<"p,q,N,NT的值:"<<std::endl;std::cout<<p<<" "<<q<<" "<<N<<" "<<NT<<std::endl;std::cout<<"XYD的值:"<<std::endl;std::cout<<xyd.x<<" "<<xyd.y<<" "<<xyd.d<<std::endl;std::cout<<"密钥d的值:"<<std::endl;std::cout<<d<<std::endl;std::cout<<"加密后的值:"<<std::endl;std::cout<<mMessage<<std::endl;}void Encrypt(long x)  //用公钥加密,加密后保存在mMessage{mMessage=modexp(x,e,N);}long Deciphering(){return modexp(mMessage,d,N);}private:long p,q;long d;EuclidRetVal xyd;long PublicKey(long NT){long e;for(int i=3;i<NT;i++){if(NT%i!=0)int a;}return e;}bool isPrime(long a){ //if( a == -1 ) return false;//int i=2;//long sqr=sqrt(double(a));//for(;i<=sqr;i++)//{//if(a%i==0) break;//}//if(i>sqr)//return true;//else//return false;if ( modexp(2,a-1,a)==1 ) //费马测试,有很小概率出错return true;elsereturn false;}long createRndInteger(int n){if (n<=1) return -1;long RandomNum=1<<(n-1);RandomNum +=  rand()%RandomNum;return RandomNum;}long createRndPrime(int n){long nRandom;do{nRandom=createRndInteger(n);}while(!isPrime(nRandom));return nRandom;}};void main(){RSA temp;int i;std::cout<<"输入要加密的内容:";std::cin>>i;temp.CreateTwoPrime(5);temp.Encrypt(i);temp.show();long tt=temp.Deciphering();std::cout<<tt<<std::endl;}


无法解密,如下图中最下数字为解密后数据;

,,,,


0 0
原创粉丝点击