#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;
//else return (x*z*z)%N;
if (y%2==0)
{
long modn=(z*z)%N;
if(modn<0) return N+modn;
else return 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的逆元
else
d=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;
else
return 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;
}
无法解密,如下图中最下数字为解密后数据;
,,,,