
#include<bits/stdc++.h>
using namespace std;
string encrypt(string pt, string key)
{
string ct = ""; // 密文
int k = 0; //控制key的长度
//ceil(a) 返回大于a的最小整数
int row = ceil((float)pt.length() / key.length()); // 行数
int col = key.length(); //列数
std::vector<std::vector<int> > Matx(row, vector<int>(col, 0)); ///初始化row * col二维动态数组Matx,初始化值为0
cout << "\n加密矩阵为 :" << endl;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (k < pt.length())
{
cout <<(char) (Matx[i][j] = pt[k++]) << " ";
}
else
{
cout << (char)(Matx[i][j] = 'x') << " ";
}
}
cout << endl;
}
for (int i = 0; i < col; i++)
{
for (int j = 0; j < row; j++)
{
ct += Matx[j][key.find(i + '1')]; //密文抄送
}
}
return ct;
}
string decrypt(string ct, string key)
{
string pt = ""; // plaintext
int k = 0; // ciptext iterator
int num_row = ceil((float)ct.length() / key.length());
int num_col = key.length();
std::vector<std::vector<int> > Matx(num_row, vector<int>(num_col, 0));
for (int i = 0; i < num_col; i++)
{
for (int j = 0; j < num_row; j++)
{
Matx[j][key.find(i + '1')] = ct[k++];
}
}
for (int i = 0; i < num_row; i++)
{
for (int j = 0; j < num_col; j++)
{
pt += Matx[i][j];
}
}
return pt;
}
int main()
{
string plaintext, key, ciphertext, decryptext;
/*cout << "Enter text : ";
cin >> plaintext;*/
plaintext = "transpoipher";
/*cout << "Enter key : ";
cin >> key;*/
key = "4231";
cout << "\n明文 \t:" << plaintext << endl;
ciphertext = encrypt(plaintext, key);
cout << "\n密文 \t: " << ciphertext << endl;
decryptext = decrypt(ciphertext, key);
cout << "\n解密 \t: " << decryptext << endl;
}