置换只不过是一个简单的换位,每个置换都可以用一个置换矩阵Ek来表示。每个置换都有一个与之对应的逆置换Dk。置换密码的特点是仅有一个发送方和接受方知道的加密置换(用于加密)及对应的逆置换(用于解密)。它是对明文L长字母组中的字母位置进行重新排列,而每个字母本身并不改变。
代码实现:
#include<stdio.h>
#include<string.h>
int main()
{
char m[999999],c[999999];
int x[26];
int t,k,len,a=0;
printf("请输入你要输入的明文:");
scanf("%s",m);
len=strlen(m);
printf("\n");
printf("选择密钥长度:");
scanf("%d",&k);
t=k-len%k; //补全空格位数
printf("\n");
printf("请输入你选择的密钥方式:\n");
for(int i=0; i<k; i++)
scanf("%d",&x[i]);
for(int j=0; j<(len+t)/k; j++) /* 分组 --> 这里j<3 有0,1,2三组 */
for(int i=0; i<k; i++)
{
c[a++]=m[x[i]+k*j-1];
/*
m是输入的明文字符串
x[i]是输入的密钥方式
m[x[i]]即把密钥方式作为m字符串的数组位置
*/
//printf("%d\n",x[i]+k*j);
}
for(int i=0; i<=len+t; i++)
printf("%c",c[i]);
printf("\n");
return 0;
}