置换密码又称换位密码,是根据一定的规则重新排列明文,以便打破明文的结构特性。置换密码的特点是保持明文的 所有字符不变,只是利用置换打乱了明文字符的位置和次序。也就是说,改变了明文的结构,不改变明文的内容。
例如:明文:asdfghjklmnbvc
密钥:31524
首先把弄清密钥长度,然后将密文分组即
明文矩阵:
a s d f g
h j k l m
n b v c
不足的用空格代替
得到密文:dkvahngm sjbflc;
其中解密密钥得到方式为用密钥的顺序(12345)写出下方正常排序的(12345)例1-2,2-4,3-1····
3 1 5 2 4
1 2 3 4 5
解密密钥:2 4 1 5 3
解密的时候也是一样,先求出转换为矩阵有多少行,然后先将列排满然后再将行排满;
例如上面的密文 dkvahngm sjbflc,加上空格共有15个字符所以分为3行5列,得到矩阵:
d a g s f
k h m j l
v n b c ;
然后用解密密钥逐行输出:第一行:asdfg
第二行:hjklm
第三行:nbvc ;
若有空格则跳过输出。
代码:
/*日期:2018.3.29*/
/*编译:李威鹏*/
/*作用:置换密码的实现*/
/*使用函数:头文件:<conio.h>
<stdio.h>
<string.h>
<stdlib.h>
<algorithm>
函数名:加密函数,解密函数*/
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
char mingwen[10000],miwen[10000],mingwenjuzhen[1000][1000],miwenjuzhen[1000][1000],miyao[10000];
void shouye()
{
system("cls");
printf("欢迎使用置换密码转换程序!\n");
printf("请选择使用功能:\n");
printf("1:加密 2:解密\n");
printf(" 0:终止程序\n");
}
void jiemi();
void jiami()
{
system("cls");
printf("请输入明文\n");
scanf("%s",mingwen);
printf("请输入数字密钥n(0<n<10)\n");
int n,l,k=0,l1=0,i,j,q=1,w=0,aa=0,bb=0,a[10000]= {0};
scanf("%d",&n);
while(n)
{
k++;
miyao[k]=n%10;
n/=10;
}
printf("密钥为:\n");
for(i=k; i>=1; i--)
{
a[k-i+1]=miyao[i];
printf("%d ",miyao[i]);
}
printf("\n");
l=strlen(mingwen);
if(l%k!=0)//计算矩阵行数
aa=l/k+1;
else
aa=l/k;
if(aa==1)
{
printf("密文为:\n\n");
for(i=1; i<=k; i++)
{
for(j=0; j<l; j++)
{
if(a[i]==j+1)
{
printf("%c",mingwen[j]);
}
}
}
}
else
{
for(i=0; i<aa;)
{
if(i==aa-1)
break;
for(j=0; j<l; j++)
{
mingwenjuzhen[i+1][q++]=mingwen[j];
w++;
if(w==k)
{
i++;
w=0;
q=1;
}
}
}
printf("密文为:\n\n");
for(i=k; i>=1; i--)
{
for(j=1; j<=aa; j++)
{
printf("%c",mingwenjuzhen[j][miyao[i]]);
}
}
}
printf("\n\n");
printf("解密密钥为:\n");
for(i=1; i<=k; i++)
{
for(j=1; j<=k; j++)
{
if(i==a[j])
{
printf("%d ",j);
}
}
}
printf("\n");
printf("是否继续?\n");
printf("1:继续 2:解密 3:返回主菜单\n");
int mm;
scanf("%d",&mm);
if(mm==1)
jiami();
if(mm==2)
jiemi();
if(mm==3)
shouye();
}
void jiemi()
{
system("cls");
printf("请输入密文:\n");
getchar();
gets(miwen);
int i,j,m,l,k=0,b[1000]= {0},aa=0,q=1,w=0,bb=0;
char s1[1000]= {0};
l=strlen(miwen);//密文长度
printf("请输入解密密钥m(0<m<10)\n");
scanf("%d",&m);
while(m)
{
k++;
miyao[k]=m%10;
m/=10;
}
printf("解密密钥为:\n");
for(i=k; i>=1; i--)
{
b[k-i+1]=miyao[i];
printf("%d ",miyao[i]);
}
printf("\n");
if(l%k==0)//计算矩阵行数
aa=l/k;
else
aa=l/k+1;
if(aa==1)
{
for(i=0; i<l; i++)
{
if(miwen[i]==' ')
continue;
else
s1[bb++]=miwen[i];
}
printf("明文为:\n\n");
for(i=1; i<=k; i++)
{
for(j=0; j<l; j++)
{
if(b[i]==j+1)
printf("%c",s1[j]);
}
}
}
else
{
for(i=0; i<l;)
{
for(j=0; j<k; j++)
{
for(int r=0; r<aa; r++)
{
miwenjuzhen[r+1][j+1]=miwen[i];
i++;
}
}
}
printf("明文是:\n\n");
for(i=1; i<=aa; i++)
{
for(j=1; j<=k; j++)
{
if(miwenjuzhen[i][b[j]]==' ')
continue;
else
printf("%c",miwenjuzhen[i][b[j]]);
}
}
printf("\n\n");
}
printf("密钥为:\n");
for(i=1; i<=k; i++)
{
for(j=1; j<=k; j++)
{
if(i==b[j])
{
printf("%d ",j);
}
}
}
printf("\n是否继续?\n");
printf("1:继续 2:加密 3:返回主菜单\n");
int mm;
scanf("%d",&mm);
if(mm==1)
jiemi();
if(mm==2)
jiami();
if(mm==3)
shouye();
}
void choose()
{
int test=1;
while(test)//对于菜单的选择
{
printf("请输入选择:\n");
int n;
scanf("%d",&n);
if(n==1)
{
jiami();
}
else if(n==2)
{
jiemi();
}
else if(n==0)
{
printf("欢迎使用!!\n");
test=0;
return;
}
else
{
printf("输入错误!\n请重新输入!");
choose();
}
}
}
int main()
{
shouye();
choose();
return 0;
}