原理:
置换密码通过改变明文消息各元素的相对位置,但明文消息元素本身的取值或内容形式不变; 矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。 如:Plain: THESIMPLESTPOSSIBLETRANSPOSITIONSXX Key (R): 2 5 4 1 3 注意:分成5列 Key (W): 4 1 5 3 2 O N S X X X O X S N Cipher: STIEH EMSLP STSOP EITLB SRPNA TOIIS XOXSN 其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。 |
内容:
加密消息:we are all togeher:
1.要求使用4行*4列的双重置换密码,使用行置换:(1,2,3,4)→(2,4,1,3)和列置换:(1,2,3,4)→(3,1,2,4) 编写置换密码算法的实现程序,实现加密和解密操作。
全部代码如下:(代码比较简易)
#include<stdio.h>
#include<cstring>
#include<cstdlib>
void encrypt()
{
int i,j,s,m=0;
char l[20];
char W[4][4];
char z[4][4];
int R1[4],R2[4];
printf("请输入明文\n");
gets(l);
printf("请输入行置换密码:\n");
for(i=0;i<4;i++)
scanf("%d",&R1[i]);
printf("请输入列置换密码:\n");
for(i=0;i<4;i++)
scanf("%d",&R2[i]);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{ W[i][j]=l[m++];
z[i][j]=W[i][j];}
//行置换
for(i=0;i<4;i++)
{
for(j=0;j<4;j++){
s=R1[i]-1;
W[i][j]=z[s][j];
}
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
z[i][j]=W[i][j];
//列置换
for(i=0;i<4;i++)
{
for(j=0;j<4;j++){
s=R2[i]-1;
W[j][i]=z[j][s];
}
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf("%c",W[i][j]);
}
printf("\n");
}
void decrypt()
{
int i,j,s,m=0;
char x[20];
char W[4][4];
char z[4][4];
int R3[4],R4[4];
printf("请输入密文\n");
gets(x);
printf("请输入行置换密码:\n");
for(i=0;i<4;i++)
scanf("%d",&R3[i]);
printf("请输入列置换密码:\n");
for(i=0;i<4;i++)
scanf("%d",&R4[i]);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{ W[i][j]=x[m++];
z[i][j]=W[i][j];}
//列置换
for(i=0;i<4;i++)
{
for(j=0;j<4;j++){
s=R4[i]-1;
W[j][s]=z[j][i];
}
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
z[i][j]=W[i][j];
//行置换
for(i=0;i<4;i++)
{
for(j=0;j<4;j++){
s=R3[i]-1;
W[s][j]=z[i][j];
}
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf("%c",W[i][j]);
}
printf("\n");
}
int main()
{
int t;
list:printf("选择功能:\n1.加密\n2.解密\n3.结束\n");
scanf("%d",&t);
getchar();
switch(t)
{
case 1:encrypt();
goto list;
case 2:decrypt();
goto list;
case 3:exit(1);
}
return 0;
}
代码运行结果: