要点:1、输入密钥及明文文本,对明文文本进行预处理(将所有字母改为大写并去除文本中的标点符号和空格)后再加密;
2、将加密后的密文保存为txt文本文档。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
void getKey(string key, vector<int> &key_num);
string pre(string ptxt);
void encrypt(vector<int> &key_num, int &index, string PTXT);
int main()
{
string key;
vector<int> key_num;
string ptxt;
string PTXT;
string tmp;
int index = 0;
ofstream fout;
cout << "请输入密钥: ";
cin >> key;
getline(cin, tmp);
getKey(key, key_num);
fout.open("encryption.txt");
fout << "密钥: " << key << endl;
cout << "输入明文换行后即进行加密" << endl;
while (getline(cin, ptxt)) {
PTXT = pre(ptxt);
cout << "*明文* " << ptxt << endl;
fout << "*明文* " << ptxt << endl;
cout << "*预处理明文* " << PTXT << endl;
fout << "*预处理明文* " << PTXT << endl;
encrypt(key_num, index, PTXT);
}
fout.close();
return 0;
}
void getKey(string key, vector<int> &key_num)
{
int l = key.size();
for (int i = 0; i < l; i++) {
if (key[i] >= 'a')
key_num.push_back(int(key[i]) - 97);
else
key_num.push_back(int(key[i]) - 65);
}
}
string pre(string ptxt)
{
string PTXT = "";
int l = ptxt.size();
for (int i = 0; i < l; i++) {
if (ptxt[i] == ' ')
continue;
else if (ptxt[i] >= 'a')
PTXT = PTXT + char(ptxt[i] - 32);
else
PTXT = PTXT + ptxt[i];
}
return PTXT;
}
void encrypt(vector<int> &key_num, int &index, string PTXT)
{
ofstream fout; //输出文本
fout.open("encryption.txt");
int d = key_num.size(); //加密周期
cout << "*密文* ";
for (int i = 0; i < PTXT.size(); i++, index++) {
if (index == d)
index = 0;
int shift = key_num[index]; //当前位移数
int p = PTXT[i] - 'A'; //当前明文字符下标
int c = (p + shift) % 26; //当前密文字符下标
char ctxt = c + 'A'; //当前密文字符
cout << ctxt;
fout << ctxt;
}
cout << endl;
fout << endl;
}