📄 permutation.cpp
字号:
#include<iostream>
#include<string>
using namespace std;
class Permutation {
private:
string key;
int kl;
string text;
string result;
int *order;
public:
Permutation () {
text="";
key="";
result="";
order=new int[];
//result = new char[];
}
void orderArray () {
order=new int[kl];
for (int i=0;i<kl;i++) order[i]=kl;
for (int m=0;m<kl;m++)
for (int j=0;j<kl;j++)
{
if (key[m]==key[j]&&j<=m) order[m]=order[m];
if (key[m]<key[j]) order[m]--;
}
} //根据密钥判断矩阵列数的取出次序
void encryption (string plt,string k) {
key=k;
text=plt;
int pl=text.length();
kl=key.length();
for (int i=0;i<pl;i++)
{
if (i!=pl&&text[i]=='\0')
{
for (int j=i;j<pl;j++) text[j] =text[j+1];
pl--;
}
} //消除明文中的空字符
int rnum=pl/kl;
int yu=pl%kl;
if (yu!=0) rnum++; //计算矩阵的行数
//建立二维数组存储明文
char **pMatrix = new char*[rnum];
for (int p = 0; p < rnum; p++)
pMatrix[p] = new char[kl];
for (int q=0;q<rnum;q++)
for (int j=0;j<kl;j++)
{
char a = text[q*kl+j];
if (a==NULL) break;
else {
pMatrix[q][j] =a;
}
} //将明文字符按行存放入矩阵
orderArray(); //调用函数判断矩阵列数的取出次序
for (int j=0;j<kl;j++) {
int num= order[j]-1; //不能忘记减1
for (int i=0;i<rnum;i++)
{
char f=pMatrix[i][num];
if (f!='\0')
result.append(1,f);//取出矩阵中相应列的元素
}
}
cout<<result<<endl;
delete[] order;
order= NULL;
for (int m = 0; m < rnum; m++)
{
delete[] pMatrix[m];
}
delete[] pMatrix;
pMatrix= NULL; //释放内存空间
}
void decryption (string cpt,string k) {
key=k;
text=cpt;
int pl=text.length();
kl=key.length();
orderArray(); //调用函数判断矩阵列数的取出次序
int rnum=pl/kl;
int yu=pl%kl;
if (yu!=0) {
rnum++; //计算矩阵的行数,给密文中加入空字符
for (int n=0;n<kl;n++) {
if ((order[n]-1)>=yu) text.insert(rnum*n+rnum-1,'\0');
}
}
//建立二维数组存储明文
char **pMatrix = new char*[rnum];
for (int i = 0; i < rnum; i++)
pMatrix[i] = new char[kl];
for (int p=0;p<kl;p++) {
int col=order[p];
for (int j=0;j<rnum;j++)
pMatrix[j][col-1]= text[p*rnum+j]; //
}
for (int q=0;q<rnum;q++)
for (int j=0;j<kl;j++) {
char b=pMatrix[q][j];
result.append (1,b);
}
cout<<result<<endl;
delete[] order;
order= NULL;
for (int m = 0; m < rnum; m++)
{
delete[] pMatrix[m];
}
delete[] pMatrix;
pMatrix= NULL; //释放内存空间
}
};
void main ()
{
cout<<"Please input the plaintext and the keyword"<<endl;
string s1,s2;
cin>>s1>>s2;
Permutation p1;
p1.encryption(s1,s2);
cout<<"Please input the ciphertext and the keyword"<<endl;
string s3,s4;
cin>>s3>>s4;
Permutation p2;
p2.decryption(s3,s4);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -