置换密码:置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而 实现明文信息的加密。置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的顺序安排 在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。
源码:
#include<stdio.h>
#include<string.h>
#define LENGTH 26
int encrypt()
{
int i=0,j=0,k_len=0,t_len=0,row=0;
char key[LENGTH]={0};
char number[LENGTH]={0};
char ptext[LENGTH*10]={0};
char ctext[LENGTH*10]={0};
printf("输入明文:\n");
scanf("%s",ptext);
i=0;
while(ptext[i]!=0)
{
t_len++;
i++;
}
printf("输入密钥:\n");
scanf("%s",key);
i=0;
while(key[i]!=0)
{
k_len++;
i++;
}
for(i=0;i<k_len;i++)
{
number[i]=0;
for(j=0;j<k_len;j++)
{
if(key[j]<key[i])
number[i]++;
}
}
for(i=0;i<k_len;i++)
{
for(j=i+1;j<k_len;j++)
{
if(key[j]==key[i])
number[j]++;
}
}
if(t_len%k_len==0)
row=t_len/k_len;
else
row=t_len/k_len+1;
for(i=0;i<k_len;i++)
{
for(j=0;j<row;j++)
{
ctext[i*row+j]=ptext[number[i]+k_len*j];
}
}
for(i=0;i<k_len;i++)
{
for(j=0;j<row;j++)
{
printf("%c",ctext[i*row+j]);
}
}
printf("\n");
return 0;
}
int decrypt()
{
int i=0,j=0,k_len=0,t_len=0,row=0;
char key[LENGTH]={0};
char number[LENGTH]={0};
char ptext[LENGTH*10]={0};
char ctext[LENGTH*10]={0};
printf("输入密文:\n");
scanf("%s",ctext);
while(ctext[i]!=0)
{
t_len++;
i++;
}
printf("输入密钥:\n");
scanf("%s",key);
i=0;
while(key[i]!=0)
{
k_len++;
i++;
}
for(i=0;i<k_len;i++)
{
int j=0;
number[i]=0;
for(j=0;j<k_len;j++)
{
if(key[j]<key[i])
number[i]++;
}
}
for(i=0;i<k_len;i++)
{
int j=0;
for(j=i+1;j<k_len;j++)
{
if(key[j]==key[i])
number[j]++;
}
}
if(t_len%k_len==0)
row=t_len/k_len;
else
row=t_len/k_len+1;
for(i=0;i<k_len;i++)
{
for(j=0;j<row;j++)
{
ptext[number[i]+k_len*j]=ctext[i*row+j];
}
}
for(i=0;i<k_len;i++)
{
for(j=0;j<row;j++)
{
printf("%c",ptext[i*row+j]);
}
}
printf("\n");
return 0;
}
void main()
{ int k;
printf("输入1加密,输入2解密:\n");
scanf("%d",&k);
if(k==1)
encrypt();
else if(k==2)
decrypt();
}