代码如下:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<cmath>
#include<stdio.h>
using namespace std;//定义Caesar类
class Caesar {
private:
int key;// 移位密钥
public:
Caesar(int k) :key(k) {}//构造函数//使用移位密钥key对明文字母进行加密
string encrypt(string cleartext) {
string ciphertext;//加密后密文
//自行编写一段代码,对明文区分大小写进行加密,使得最终效果与步骤截图同
for (int i = 0; i < cleartext.length(); i++)
{
// 对小写字母进行加密
if (cleartext[i] >= 'a' && cleartext[i] <= 'z')
ciphertext += char((cleartext[i] - 97 + this->key) % 26 + 97);
// 对大写字母进行加密
else if (cleartext[i] >= 'A' && cleartext[i] <= 'Z')
ciphertext += char((cleartext[i] - 65 + this->key) % 26 + 65);
}
//返回加密后密文
return ciphertext;
}
//使用穷举法进行破译
vector<string>decrypt(string ciphertext)
{
vector<string>cleartextSet;//定义解密后的明文信息
//解密公式:
//f(a) = (a + (26 - N)) mod 26//自行编写一段代码,穷举26个密钥对密文区分大 小写进行解密以此判断 明文,使得最终效果与步骤截图同
// 密钥为0时,明密文完全相同,直接将密文串进行保存
cleartextSet.push_back(ciphertext);
// 将其余25个不同的密钥进行穷举及解密
for (int i = 1; i < 26; i++)
{
// 用一个临时变量对解密的后的字符串进行保存
string s;
for (int j = 0; j < ciphertext.length(); j++)
{
//对密文串中的小写字母进行解密
if (ciphertext[j] >= 'a' && ciphertext[j] <= 'z')
s += char((ciphertext[j] - 97 +26-i) % 26 + 97);
//对密文串中的大写字母进行解密
else if (ciphertext[j] >= 'A' && ciphertext[j] <= 'Z')
s += char((ciphertext[j] - 65 +26 - i) % 26 + 65);
}
//将字符串传入到容器中进行保存
cleartextSet.push_back(s);
}
return cleartextSet;
}
};
int main()
{
int mode, flag = 1;
while (flag)
{
cout << "---------- Caesar加解密!----------" << endl;
cout << "请选择[1->encrypt 2->decrypt 3->exit]" << endl;
cin >> mode;
if (mode != 1 && mode != 2 && mode != 3)
{
cout << "输入错误,请重输 :[1->encrypt 2->decrypt 3->exit]" << endl;
cin >> mode;
}
if (mode == 1)
{
int myKey;
cout << "输入移位密钥: ";
cin >> myKey;//输入移位密钥
Caesar myCaesar(myKey);
string cleartext;//待加密的明文
string ciphertext;//加密后的密文
cout << "输入要加密的明文: " << endl;
getchar();
getline(cin, cleartext);
ciphertext = myCaesar.encrypt(cleartext);
cout << "加密后的密文: " << endl;
cout << ciphertext << endl;
}
else if (mode == 2) {
vector<string>textset;//用于存放明文
string ciphertext;//待解密的密文
Caesar myCaesar(0);
cout << "输入要解密的密文: " << endl;
getchar();
getline(cin, ciphertext);
textset = myCaesar.decrypt(ciphertext);
int k;
for (k = 0; k < textset.size(); k++) {
cout << "If (key mod 26) == " << k << ": " << endl;
cout << textset[k] << endl;
}
}
else {
return 0;
}
cout << "是否继续加解密? [0->exit 1 or other->continue]: ";
cin >> flag;
}
return 0;
}