简介
简单介绍下我写的换位密码:通过输入英文密钥进行加密和解密,使用密钥长度作为明文的列宽输出明文矩阵,对明文按照字母表进行排序,明文对应变换进行加密。比如密钥computer
{c o m p u t e r}
{0 1 2 3 4 5 6 7}按照数组下标从0开始
排序后变为
{c e m o p r t u}
{0 6 2 1 3 7 5 4}
废话少说,大家看代码吧,挺简单的,如果写得不好请谅解,勿喷,有更好的想法或者改进的地方欢迎私信一起讨论呀~
代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i;
string key, plain, back;
cout << "请输入密钥:\n";
cin >> key;
back = key;
cout << "请输入明文(不需要输入间隔):\n";
cin >> plain;
int l;
l = plain.size() / key.size();
for (auto i = plain.size(); i % key.size() != 0; i++)
{
plain.push_back('x');//通过判断在明文数组后面补齐x
}
cout << endl;
for (auto i = 0; i < plain.size(); i++)//输出列宽为密钥长度的矩阵
{
cout << plain[i];
if (i % key.size() == key.size()-1)
{
cout << "\n";
}
}
cout << "\n\n";
cout << "排序后:\n";
for (auto i = 0; i < key.size() - 1; i++)
{
for (auto j = 1; j < key.size() - 1; j++)
{
if ((int)key[j]>(int)key[j + 1])//使用冒泡排序通过对比密钥对应的asc码进行从小到大排序
{
swap(key[j], key[j + 1]);//将明文通过此排序可得排序后的明文
for (auto k = 0; k <= l; k++)
{
swap(plain[j + k*key.size()], plain[j + 1 + k*key.size()]);
}
}
}
}
for (auto i = 0; i < plain.size(); i++) //输出列宽为密钥长度的矩阵
{
cout << plain[i];
if (i % 8 == 7)
{
cout << "\n";
}
}
cout << "\n\n";
cout << "加密后密文:\n";
for (auto i = 0; i <key.size(); i++)
{
for (auto j = 0; j <= l; j++)
{
cout << plain[i + j*l];
}
}
cout << "\n\n";
for (i = 0; i < key.size(); i++)//自己想的冒泡排序逆算法,解密
{
for (auto j = 0; j < key.size(); j++)
{
if (back[i] == key[j])
{
swap(key[i], key[j]);
for (auto k = 0; k <= l; k++)
{
swap(plain[i + k*key.size()], plain[j + k*key.size()]);
}
break;
}
}
}
cout << "解密后明文:\n";
for (auto i = 0; plain[i] != 'x'; i++)
{
cout << plain[i];
}
cout << endl;
system("pause");
return 0;
}
运行结果:
希望对大家有所帮助,谢谢大家啦