置换密码
置换密码算法的原理是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。例如,明文为attackbeginsatfive,密钥为cipher,将明文按照每行6个字母的形式排在矩阵中,形成如下形式:
根据密钥cipher中各个字母在字母表中出现的先后顺序,给定一个置换:
根据上面的置换,将原有居住中的字母按照第1列、第4裂、第5裂、第3裂、第2列、第6列的顺序排列,则有下面的形式:
从而得到密文:abatgftetcnvaiikse
其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
#include<iostream>
#include<cstring>
usingnamespacestd;
voidjiami()
{
charstr[100];
charstr1[100];
chara[100];
cout<<"请输入您的密钥:"<<endl;
cin.get();//每次在重新输入前必须加这个!
cin.get(str,100);
cout<<"请输入您的明文:"<<endl;
cin.get();
cin.get(a,100);
intlen=strlen(str);
charb[100][100];
charc[100][100];
chard[100][100];
intj=0;
intt=0;
intj1;
intt1;
for(inti=0;a[i]!='\0';i++)
{
if(a[i]!=''){
b[j][t]=a[i];
c[j][t]=a[i];
t++;
if(t>=len)
{
t=0;
j++;
}
j1=j;
t1=t;
}
else{};
}
strcpy(str1,str);
for(inti=0;i<len;i++)
{
for(intj=0;j<len-i-1;j++)
{
if(str1[j]>str1[j+1])
{
charch=str1[j];
str1[j]=str1[j+1];
str1[j+1]=ch;
}
}
}
for(inti=0;i<len;i++)
{
for(intj=0;j<len;j++)
{
if(str[i]==str1[j])
{
for(intx=0;x<j1;x++)
{
c[x][i]=b[x][j];
}
}
}
}
for(inti=0;i<j1;i++)
{
strcpy(d[i],c[i]);
}
for(inti=0;i<len;i++)
{
for(intj=0;j<len;j++)
{
if(str[i]==str1[j])
{
for(intx=0;x<j1;x++)
{
d[x][i]=c[x][j];
}
}
}
}
cout<<"经置换算法后的密文为:"<<endl;
for(inti=0;i<len;i++)
{
for(intj=0;j<j1;j++)
cout<<d[j][i]<<"";
}
}
voidjiemi()
{
charstr[100];
charstr1[100];
chara[100];
cout<<"请输入您的密钥:"<<endl;
cin.get();
cin.get(str,100);
cout<<"请输入您的密文:"<<endl;
cin.get();
cin.get(a,100);
intlen=strlen(str);
intlen1=strlen(a);
intle=len1/len;
charb[100][100];
charc[100][100];
chard[100][100];
intj=0;
intt=0;
for(inti=0;a[i]!='\0';i++)
{
if(a[i]!=''){
b[j][t]=a[i];
c[j][t]=a[i];
j++;
if(j>=le)
{
j=0;
t++;
}
}
else{};
}
strcpy(str1,str);
for(inti=0;i<len;i++)
{
for(intj=0;j<len-i-1;j++)
{
if(str1[j]>str1[j+1])
{
charch=str1[j];
str1[j]=str1[j+1];
str1[j+1]=ch;
}
}
}
for(inti=0;i<len;i++)
{
for(intj=0;j<len;j++)
{
if(str[i]==str1[j])
{
for(intx=0;x<le;x++)
{
c[x][i]=b[x][j];
}
}
}
}
for(inti=0;i<le;i++)
{
strcpy(d[i],c[i]);
}
for(inti=0;i<len;i++)
{
for(intj=0;j<len;j++)
{
if(str[i]==str1[j])
{
for(intx=0;x<le;x++)
{
d[x][i]=c[x][j];
}
}
}
}
cout<<"经置换算法解密后的明文为:"<<endl;
for(inti=0;i<le;i++)
{
for(intj=0;j<len;j++)
cout<<d[i][j]<<"";
}
}
intmain()
{
intchoice;
cout<<"请输入您的选择:"<<endl;
cout<<"1.加密;2.解密;"<<endl;
cin>>choice;
switch(choice)
{
case1:
jiami();
break;
case2:
jiemi();
break;
default:
break;
}
//cout<<searchnum(s)<<endl;
return0;
}
执行结果为: