置换加密算法

置换加密算法:

原理:如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;
  }

  结果如下:

 

posted on 2012-09-21 18:28  yucong  阅读(4879)  评论(1)    收藏  举报

导航