⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsa.cpp

📁 使用RSA算法对一个数字进行加密和解密。可以自由指定p
💻 CPP
字号:
#include<iostream>
#include<math.h>
using namespace std;

class Rsa
{
private:
	int p, q;	//two different primes
	int n;		//p*q
	int e;		//choose one
	int d;		//calculated
public:
	Rsa(int a, int b) {		//constructor
		p = a;
		q = b;
		n = a*b;
		e = confirmE(a, b);
		d = confirmD(e, a,b);
	}
//========constructor in use==========
	void swap(int a, int b) {	//swap two nums
		int c;
		c = a;
		a = b;
		b = c;
	}
	int gcd(int a, int b) {		//get gcd
		if(a == 0) {
			return b;
		}
		if(b == 0) {
			return a;
		}
		if(b < a) {
			swap(a ,b);
		}
		int c;
		for(c = a % b; c > 0; c = a % b) {
			a = b;
			b = c;
		}
		return b;
	}
	int confirmE(int p, int q) {			//confirm the "E"
		int phi;
		phi = (p-1)*(q-1);
		int e;
		for(e = 2; gcd(phi, e) != 1; e++) {
		}
		return e;
	}
	int confirmD(int e, int p, int q) {			//confirm the "D"
		int phi = (p-1)*(q-1);
		int u1, u2, u3;
		int v1, v2, v3;
		int t1, t2, t3;
		int uu, vv;
		int temp;
		int inverse;
		u1 = 1;
		u2 = 0;
		u3 = phi;
		v1 = 0;
		v2 = 1;
		v3 = e;
		
		while(v3 != 0) {
			temp = u3 / v3;
			
			t1 = u1 - temp*v1;
			t2 = u2 - temp*v2;
			t3 = u3 - temp*v3;
			
			u1 = v1;
			u2 = v2;
			u3 = v3;
			
			v1 = t1;
			v2 = t2;
			v3 = t3;
		}
		uu = u1;
		vv = u2;
		
		if(vv < 0) {
			inverse = vv + phi;
		}
		else {
			inverse = vv;
		}
		return inverse;
	}

	long mod(long base,long exponent,long num) {	//计算形如base^exponent mod num
		long bin[32], i = 0, result(1);
		while (exponent != 0) {		//转换成二进制
			long temp;
			temp = exponent%2;
			bin[i++] = temp;
			exponent = exponent/2;
		}
		i = i-1;					//i自减1,回到二进制的最高位
		while(i >= 0) {				//快速指数算法
			long c(0);
			c = 2*c;
			result = (result*result)%num;
			if(bin[i] == 1) {
				c = c+1;
				result = (result*base)%n;
			}
		i--;
		}
		return result;
	}

//====================================
	void setP(int a) {
		p = a;
	}
	void setQ(int a) {
		q = a;
	}
	int getP() {
		return p;
	}
	int getQ() {
		return q;
	}
	int getN() {			//n = p*q
		return n;
	}
	int getE() {
		return e;
	}
	int getD() {
		return d;
	}
	long getPhi() {
		return (p-1)*(q-1);
	}

//========get KU======================
	void getKu() {		//Key Public
		cout<<"公钥为:{"<<e<<","<<n<<"}"<<endl;
	}
	void getKr() {		//Key Private
		cout<<"私钥为:{"<<d<<","<<n<<"}"<<endl;
	}
};


//======================================
long isPrime(long num) {		//Is prime number?
	long temp, i;
	temp = sqrt((double)num);
	for(i = 2; i <= temp; i++) {
		if(num%i == 0) {
			break;
		}
	}
	if(i>temp) {
		return 1;
	}
	else {
		return 0;
	}
}

long Auto(long t) {
	long prime;
	for(prime = t; isPrime(prime) == 0; prime = t) {
		t++;
	}
	return prime;
}

int input(char word) {				//接受数字并判断是否素数
	int inputnum;
	char yesno;
	cout<<"请输入"<<word<<":";
	cin>>inputnum;			//get inputnum
//=======input over, check it===========
	while(isPrime(inputnum) == 0) {
		cout<<"您输入的不是素数。"<<endl;
		while((yesno != 'n') & (yesno != 'y')) {
			cout<<"是否让系统自动为你生成一个素数。(y/n):";
			cin>>yesno;
		}
		if(yesno != 'y') {
			cout<<"请输入"<<word<<":";
			cin>>inputnum;
		}
		else {
			inputnum = Auto(inputnum);
			cout<<word<<":"<<inputnum<<endl;
		}
		yesno = 0;
	}
	return inputnum;
}

void outputAllArguments(Rsa rsa) {				//输出参数值
	cout<<"==========首先输出各参数值=========="<<endl;
	cout<<"p="<<rsa.getP()<<endl;
	cout<<"q="<<rsa.getQ()<<endl;
	cout<<"n=p*q="<<rsa.getN()<<endl;
	cout<<"Φ(n)=(p-1)*(q-1)="<<rsa.getPhi()<<endl;
	cout<<"e="<<rsa.getE()<<endl;
	cout<<"d="<<rsa.getD()<<endl;
	rsa.getKu();
	rsa.getKr();
	cout<<"==========参数值输出结束============"<<endl;
}

void main()
{
//	char yesno;
	long p;
	long q;
	char quit;
//=======output congratulations=========
	cout<<"===========8000104008彭鹏============="<<endl;
	cout<<"RSA加密软件"<<endl<<endl;
	cout<<"通过输入两个素数p和q,产生一个公钥(e,n)和一个私钥(d,n)。"<<endl;
	cout<<"其中公钥用于加密,私钥用于解密。"<<endl;
	while(quit != 'n') {
		//=======input p & q======================
		cout<<"===================================="<<endl;
		p = input('p');				//input p
		q = input('q');				//input q
		//=======p & q are all over===========

		//=======caculate=======================
		Rsa rsa1(p, q);
		cout<<"p和q都已经输入完毕,下面进行加密和解密进程。"<<endl;
		//=======output all arguments===========
		outputAllArguments(rsa1);
		//=======input num======================
		cout<<"输入明文数字:"<<endl;
		long mnum;			//明文数字
		cin>>mnum;
		cout<<"输入明文为:"<<mnum<<endl;
		//======================================
		cout<<"输出密文为:";
		long c_num;			//密文数字
		//	c_num = c(mnum, rsa1);		//encryption
		c_num = rsa1.mod(mnum, rsa1.getE(), rsa1.getN());		//encryption
		cout<<c_num<<endl;
		//======================================
		cout<<"输出明文为:";
		long m_num;			//解密出的明文数字,理论应与mnum一样
		//	m_num = m(c_num, rsa1);		//decryption
		m_num = rsa1.mod(c_num, rsa1.getD(), rsa1.getN());		//decryption
		cout<<m_num<<endl;
		//===========coutinue ?=================
		cout<<"是否继续使用?(按任意键继续,按'n'结束)";
		cin>>quit;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -