置换加密算法
置换加密算法:
原理:如key={4,3,2,1};
plainText={abcdefghijklmn};
那么有
secretText={dhicgkbfjnaeim}
密钥:4 3 2 1
明文:a b c d
e f g h
i j k l
m n
密文:d h i c g k b f j n a e i m
具体算法如下:
/*************加密算法***********/
char * toSecret(char* key,char* plainText)
{
int length=0,length1=0,row=0,i=0,j=0,n=0,k=0;
char** plainText1;//用二维数组来装载明文;
char* secretText;//用来装载密文
char* tempText;//用来临时存放文件
int* realKey;//真正的密钥
/**算法key字符串的长度,也就是二维数组的列数*/
length=strlen(key);
realKey=(int*)malloc(sizeof(int)*(length+1));
while('\0'!=key[i])
{
realKey[i]=key[i]-48;
i++;
}
if (key[i]=='\0')
{
realKey[i+1]='\0';
}
/******************计算二维数组的列数*******/
/**length1为明文长度, row为二维数组的行数**/
length1=strlen(plainText);
if (length1 % length == 0)
{
row=length1/length;
}
else if(0<length1 % length)
{
row=length1/length+1;
}
plainText1=(char**)malloc(sizeof(char*) * row);
for(i=0;i<row;i++)
{
plainText1[i]=(char*)malloc(sizeof(char)*(length1+1));
}
/*****定义一个二唯数组来装载明文*********/
for(i=0;i<row;i++)
{
for(j=0;j<length;j++)
{
if (i*length+j>=length1)
{
plainText1[i][j]='\0';
}
else
{
plainText1[i][j]=plainText[n];
}
n++;
}
}
/*******按照key的顺序来进行置换加密*******************/
tempText=(char*)malloc(sizeof(char)*row);
secretText=(char*)malloc(sizeof(char)*(length+1));
for(i=0;i<length;i++)
{
j=0;
while(j<length)
{
if ((i+1)==realKey[j])
{
for(n=0;n<row;n++)
{
/************将某一列的数取出来,然后存进存放密钥的数组里面*************/
tempText[n]=plainText1[n][j];
}
if (tempText[row-1]=='\0')
{
n=0;
for(;n<row-1;k++)
{
secretText[k]=tempText[n];
n++;
}
}
else
{
tempText[row]='\0';
n=0;
for(;n<row;k++)
{
secretText[k]=tempText[n];
n++;
}
}
}
j++;
}
}
secretText[length1]='\0';
return (secretText);
}
/******************解密算法*************************/
char* toPlainText(char* key,char *secretText)
{
int length=0,length1=0,row=0,i=0,j=0,n=0,k=0;
char** secretText1;//用二维数组来装载明文;
char* plainText;//用来装载明文
int* realKey;//真正的密钥
/**算法key字符串的长度,也就是二维数组的列数*/
length=strlen(key);
realKey=(int*)malloc(sizeof(int)*(length+1));
while('\0'!=key[i])
{
realKey[i]=key[i]-48;
i++;
}
if (key[i]=='\0')
{
realKey[i+1]='\0';
}
/******************计算二维数组的列数*******/
/**length1为密文长度, row为二维数组的行数**/
length1=strlen(secretText);
if (length1 % length == 0)
{
row=length1/length;
}
else if(0<length1 % length)
{
row=length1/length+1;
}
secretText1=(char**)malloc(sizeof(char*) * row);
for(i=0;i<row;i++)
{
secretText1[i]=(char*)malloc(sizeof(char)*(length1+1));
}
/*******按照key的顺序来进行置换解密*******************/
for(i=0;i<length;i++)
{
j=0;
while(j<length)
{
//j表示对应的密钥里的数字是第几列;
if ((i+1)==realKey[j])
{
for(n=0;n<row;n++)
{
/************将某一列的数取出来,然后存进存放密钥的数组里面*************/
if (n*length+j>=length1)
{
secretText1[n][j]='\0';
}
else
{
secretText1[n][j]=secretText[k];
k++;
}
printf("secretText=%c\n",secretText1[n][j]);
}
}
j++;
}
}
/*********把存进二维数组里面的数拿出来*********************/
plainText=(char*)malloc(sizeof(char)*(length1+1));
k=0;
for(i=0;i<row;i++)
{
for(j=0;j<length;j++)
{
plainText[k]=secretText1[i][j];
k++;
}
}
plainText[length1]='\0';
return (plainText);
}
测试:
int main(void)
{
char key[]="4321";
char plainText[]="abcdefghijklmn";
char* secretText;
char* plainText1;
secretText=toSecret(key,plainText);
printf("secretText=%s\n",secretText);
plainText1=toPlainText(key,secretText);
printf("plainText=%s\n",plainText1);
return 1;
}
结果如下:

浙公网安备 33010602011771号