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

📄 test.cpp

📁 rsa加密算法的vc实现
💻 CPP
字号:
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
#include"predefine.h"
#include"rand.h"
#include"rsa.h"

void clearintNode()
{
	intNode i;
	i.clear();
}
void printMenu()
{
	cout << "__________________________\n";
	cout << "请选择:\n";
	cout << "1.产生两个随机大素数并写入文件(16进制)!\n";
	cout << "2.产生两个随机大素数并写入文件(10进制)!\n";
	cout << "3.从文件读入素数和公钥并解密(私钥自动生成)(16进制)!\n";
	cout << "4.从文件读入素数和公钥并解密(私钥自动生成)(10进制)!\n";
	cout << "5.从文件读入模数和公钥并加密(16进制)!\n";
	cout << "6.从文件读入模数和公钥并加密(10进制)!\n";
	cout << "0.退出!\n";
}

void creatPrime(int base)
{
	Rand r;
	char c[30];
	cout << "请输入用DES产生随机素数所需密钥所在的文件名!\n";
	cin >> c;
	r.setKeyFile(c);

	cout <<"请输用产生随机数的种子所在的文件名!\n";
	cin >> c;
	r.setZVFile(c);

	cout << "请输入用来保存素数的文件名!\n";
	cin >> c;
	fstream out;
	out.open(c, ios::out);

	char* ch;
	int ch_l;
	BigInt p, q, n;

	p = r.randStrPrime();
	if(base == 10)
		ch = p.outputDEC(ch_l);
	else
		ch = p.outputHEX(ch_l);
	for(int i = 0; i < ch_l; ++i)
		out << ch[i];
	out << endl;
	delete[] ch;

	q = r.randStrPrime();
	if(base == 10)
		ch = q.outputDEC(ch_l);
	else
		ch = q.outputHEX(ch_l);
	for(i = 0; i < ch_l; ++i)
		out << ch[i];
	out << endl;

	cout << "要在文件后面加入加密时所要的公钥吗?\n";
	char judge;
	cin >> judge;
	if(judge == 'y' || judge == 'Y')
	{
		cout << "请输入公钥( " << base <<" 进制)!\n";
		cin >> ch;
		out << ch << endl;
		out.close();
		cout << "要新建一个文件并保存公钥和模数吗?";
		cin >> judge;
		if(judge == 'y' || judge == 'Y')
		{
			cout << "请输入要保存公钥的文件名:";
			cin >> c;
			out.open(c, ios::out);
			out << ch << endl;
			delete[] ch;
			n = p * q;
			if(base == 10)
				ch = n.outputDEC(ch_l);
			else
				ch = n.outputHEX(ch_l);
			for(i = 0; i < ch_l; ++i)
				out << ch[i];
			out << endl;
			cout << "写入成功!" << endl;
			out.close();
			delete[] ch;
		}
	}

	q.clear();
	p.clear();
	n.clear();
}

void decodingFile(int base)
{
	rsa r;
	char name[30];
	cout << "请输入素数和公钥所在的文件名:\n";
	cin >> name;

	fstream in;
	in.open(name, ios::in);
	BigInt p, q, pub;
	char num[150];

	in >> num;
	if(base == 10)
		p.loadDEC(num, strlen(num));
	else
		p.loadHEX(num, strlen(num));

	in >> num;
	if(base == 10)
		q.loadDEC(num, strlen(num));
	else
		q.loadHEX(num, strlen(num));

	in >> num;
	if(base == 10)
		pub.loadDEC(num, strlen(num));
	else
		pub.loadHEX(num, strlen(num));
	r.setkey(p, q, pub);
	in.close();

	cout << "请输入要解密的文件名:\n";
	cin >> name;
	r.setCFileName(name);

	cout << "请输入要保存明文的文件名:\n";
	cin >> name;
	r.setMFileName(name);
	
	cout << "请选择:\n"
		 << "1.读入文件的ASCII码解密!\n"
		 << "2.读入文件的ASCII码用中国剩余定理解密!\n"
		 << "3.以a = 00, b = 01, .........A = 26, B = 27..........解密!\n"
		 << "4.以a = 00, b = 01, .........A = 26, B = 27..........用中国剩余定理解密!\n";
	cout << "0.返回!" << endl;
	int choose;
	cin >> choose;
	if(choose != 0)
	{
		r.DeCode(choose, base);
		cout << "解密成功!" << endl;
	}
	p.clear();
	q.clear();
	pub.clear();
}
void encodingFile(int base)
{
	rsa r;
	char name[30];
	cout << "请输入公钥和模数所在的文件名:\n";
	cin >> name;

	fstream in;
	in.open(name, ios::in);
	BigInt pub, n;
	char num[300];

	in >> num;
	if(base == 10)
		pub.loadDEC(num, strlen(num));
	else
		pub.loadHEX(num, strlen(num));

	in >> num;
	if(base == 10)
		n.loadDEC(num, strlen(num));
	else
		n.loadHEX(num, strlen(num));

	r.setpubkey(pub, n);
	in.close();

	cout << "请输入要加密的文件名:\n";
	cin >> name;
	r.setMFileName(name);

	cout << "请输入要保存密文的文件名:\n";
	cin >> name;
	r.setCFileName(name);
	
	cout << "请选择:\n"
		 << "1.读入文件的ASCII码加密!\n"
		 << "2.以a = 00, b = 01, .........A = 26, B = 27..........加密!\n";
	cout << "0.返回!" << endl;
	int choose;
	cin >> choose;
	if(choose != 0)
	{
		r.EnCode(choose, base);
		cout << "加密成功!" << endl;
	}

	n.clear();
	pub.clear();
	n.clear();
}
	
int main()
{
	int choose;
	while(true)
	{
		printMenu();
		cin >> choose;
		switch(choose)
		{
		case 1:
			creatPrime(16);
			break;
		case 2:
			creatPrime(10);
			break;
		case 3:
			decodingFile(16);
			break;
		case 4:
			decodingFile(10);
			break;
		case 5:
			encodingFile(16);
			break;
		case 6:
			encodingFile(10);
			break;
		default:
			break;
		}
		if(choose == 0)
			break;
	}

	clearintNode();
	return 0;
}

⌨️ 快捷键说明

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