📄 test.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 + -