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

📄 rsa.cpp

📁 RSA算法 C++ 实现 RSA算法 C++ 实现
💻 CPP
字号:
#include<iostream>
#include<cmath>
#include<string>

using namespace std;
int miwen[1024];



//////判断输入的数是否为素数//////
bool pdprime(long m)
{
	bool pd;
	for(int i = 3;i < m;i= i + 2)
		if(m % i ==0)
			break;
	if(m == i)
		pd = 1;
	else 
		pd = 0;
	return pd;
}

///// 判断两个数是否互素/////
bool pdhusu(long a,long b)
{
	int t0 = 0, t = 1,s0 = 1,s = 0 , q , r ;
	int temp;
	bool pdhs;
	q = a / b;
	r = a - q * b;

	while ( r > 0)
	{
		
		temp = t0 - q * t;
		t0 = t;
		t = temp;
		temp = s0 - q * s;
		s0 = s;
		s = temp;
		a = b;
	    b = r;
		q = a / b;
		r = a - q * b;	
		
	}
	r = b;

	if ( r == 1)
		pdhs = 1;
	else 
		pdhs = 0;
	return pdhs;


}

/////求d 的值//////


int qiuni(long a, long b)
{
	int t0 = 0, t = 1,s0 = 1,s = 0 , q , r , u , v , d;
	int temp;

	u = a;
	v = b;
	q = a / b;
	r = a - q * b;

	while ( r > 0)
	{
		
		temp = t0 - q * t;
		t0 = t;
		t = temp;
		temp = s0 - q * s;
		s0 = s;
		s = temp;
		a = b;
	    b = r;
		q = a / b;
		r = a - q * b;	
		
	}
	r = b;


	if ( r == 1)
	{
		cout << endl;
		cout << "s = " << s << endl;		
		cout << "t = " << t << endl;
		cout << "r = " << s << " * " << u << " + " ;
		cout << t << " * " << v << endl << endl;
		
		cout << u << "和"<< v << "互素,满足条件" << endl << endl;
		if(t > 0)
			d = t % u;
		else
			d = (u + t) % u;
			
		return d;
	}
	else 
	{
		cout << u << " 和 " << v << "不互素,不满足条件" << endl;
		return false;
	}
	


}
////// 加密/////

void jiami(string data,int p ,int d)

{
	char c;
	int u = 0;
	cout << "加密后的结果为:" << endl ;
	for(int i = 0;i < data.size(); i ++)
	{
		miwen[i] = data.at(i);
		c = miwen[i];
		for(int j = 1;j < d ;j ++)
			miwen[i] = miwen[i] * c % p;
		
		cout << miwen[i] << ' ';

	}

}


////....解密....//////
void hjiemi(int z1,int x)
{
	int c;
	char g;
	int jiemi[1024];
	cout << "解密后的结果为:" << endl ;
	for(int i = 0;i < 1024; i ++)
	{
		jiemi[i] = miwen[i];	
		c = miwen[i];
		for(int j = 1;j < z1 ;j ++)	
			jiemi[i] = jiemi[i] * c % x;
	
		if(jiemi[i] != 0)
		{
			g = jiemi[i];
			cout << g;
		}

	}

}




void main()
{
	long p , q , n , m , a = 0 , d;
	char c;
	string data;
	cout << "请输入一段明文 :" << endl; 
	getline(cin, data, '\n');

	cout << "请输入 p 和 q 的值  = ";
	cin >> p >> q;
	cout << pdprime(p) << ' ' << pdprime(q) << endl;
	if(pdprime(p) == 1 && pdprime(q) == 1)
	{
		cout << "输入的 p 和 q 满足条件" << endl << endl;
		n = p * q;
		m = (p - 1) * (q - 1);
		cout << "请输入一个小于 n = p * q 的随机整数 a = ";
		cin >> a;
		cout << endl;
		if(pdhusu(a , m) == 1)
		{
			d = qiuni(m, a);
			cout << "a 的逆模 m 为 " << d << endl << endl;
			jiami(data,n,a);

			cout << endl << endl;
			cout << "公钥为 :" << n << ' ' << a << endl;
			cout << "私钥为 :" << p << ' ' << q << ' ' << d << endl << endl;

			cout << "是否解密(y/n)"<< endl;
			cin >> c;
			if(c == 'y')
				hjiemi(d,n);
			else
				exit(1);
		}
		else
			cout << "输入的小于 n 的随机整数 a 和 m 不互素" << endl;


	}

	else
		cout << " 输入的p 和 q不全为素数 " << endl;



}









⌨️ 快捷键说明

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