#include<stdio.h>
#include<math.h>
#include<string.h>
#define N 100
int main()
{
int i,j,lenK,lenM,m,n,temp;
int T[N];
char K[N],M[N],C[N],Temp1[N],Temp2[N],Temp3[N];
printf("利用置换密码算法进行加密...\n");
printf("请输入明文M:\n");/*输入明文M*/
gets(M);
printf("请输入密钥K:\n");/*输入密钥K*/
gets(K);
lenK=strlen(K);
lenM=strlen(M);/*测设长度*/
m=lenM/lenK;
n=lenK;/*定义矩阵的长和宽*/
for(i=0;i<lenK;i++)/*对密钥进行数字排序*/
{
temp=0;
for(j=0;j<lenK;j++)
{
if((int)K[i]<(int)K[j])
{
temp+=1;
}
}
T[i]=lenK-temp;
printf("%d ",T[i]); /*输出各字符对应的数字顺序*/
}
printf("\n\nFirst...\n\n");
for(i=0;i<m;i++) /*一、根据密钥将明文排列成矩阵*/
{
for(j=0;j<n;j++)
{
Temp1[i*lenK+j]=M[i*lenK+j];
printf("%c ",Temp1[i*lenK+j]);
}
printf("\n");
}
Temp1[lenM]='\0';
/*--------------------------------*/
printf("\nSecond...\n\n"); /*二、对明文进行第一次置换*/
for(i=0;i<lenK;i++)
{
for(j=0;j<m;j++)
{
Temp2[j*lenK+i]=Temp1[j*lenK+T[i]-1];
}
}
Temp2[lenM]='\0';
for(i=0;i<m;i++)
{
for(j=0;j<lenK;j++)
{
printf("%c ",Temp2[i*lenK+j]);
}
printf("\n");
}
/*-------------------------------*/
printf("\nThird...\n\n"); /*三.对明文进行第二次置换*/
for(i=0;i<lenK;i++)
{
for(j=0;j<m;j++)
{
Temp3[j*lenK+i]=Temp2[j*lenK+T[i]-1];
}
}
Temp3[lenM]='\0';
for(i=0;i<m;i++)
{
for(j=0;j<lenK;j++)
{
printf("%c ",Temp3[i*lenK+j]);
}
printf("\n");
}
/*-----------------------------*/
printf("置换加密后的密文是...\n"); /*输出结果*/
for(j=0;j<lenK;j++)
{
for(i=0;i<m;i++)
{
printf("%c",Temp3[i*lenK+j]);
}
}
return 0;
}