RSA加密算法(未完成)

#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;
}


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

,,,,


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值