【密码学】传统密码:置换密码

    虽然说开通博客已经很久了,也写了一些文章,但是在自己看来没有什么干货都是些水文,内容比较散,有一种打游击的感觉。不过如果说作为一种总结,习惯,笔记,那也达到了目的。前面一段时间花在网络编程,后面的书看着看着有点难以看下去的感觉了。突然在笨牛书店看到《现代密码学教程》,挺感兴趣的,这几天网络编程的学习也就搁下了,打算先把这本看完再接着看下去吧。

    置换密码又称换位密码,是根据一定的规则重新排列明文,以便打破明文的结构特性。置换密码的特点是保持明文的 所有字符不变,只是利用置换打乱了明文字符的位置和次序。也就是说,改变了明文的结构,不改变明文的内容。


一、列置换密码(明文遵照密钥的规程按列换位并且按列读出序列得到密文 )


【密码学】传统密码:置换密码_第1张图片


实例:

已知信息:明文p=【Beijing 2008 Olympic Games】,密钥k=(143)(56)。

求解加密过程:首先将明文p写成【Beijing2008OlympicGames】得到23个字符,写成一个4*6的矩阵。也要将密钥k写成矩阵形式出来,方便理解,以后熟悉了,其实可以省去这个步骤的。

k=

     1     2     3     4     5     6
     4     2     1     3     6     5

P=

     B     e     i     J     i     n

     g     2     0     0     8     O

     l     y     m     p     i     c

     G     a     m     e     s

M=

     i     e     j     B     n     i

     0     2     0     g     O     8

     m     y     p     l     c     i

     m     a     e     G           s

代码:

/***********************************************************/    
// 程序目的:列置换密码  
// 日期:    2014-12-19    
// 作者:    spencer_chong    
// 邮箱:    [email protected]    
/***********************************************************/   
#include 
#define col 6
int row;
int* key;
//明文
char plaintext[100]={32};
char *ptemp=plaintext;
//密文
char cipher[100][col]={32};
char c[100]={32};
//操作函数
int* getkey(char*k);
void encrypt(char*p,int* k);
char* printCipher(char cipher[100][col]);
int main ()
{
//加密
	char* plain;
	char k[100];
	char p[100]={32};
	char* ciphertext;
	int i,j;
	//输入密钥k
	gets(k);
	//输入明文p
	gets(p);
	key=getkey(k);

	encrypt(p,key);
	ciphertext=printCipher(cipher);
}
int* getkey(char* pointerK){
	int temp[100];
	int* ktemp=temp;
	int i;
	int t=0;
	for(i=0;i<100;i++)
		temp[i]=i;

    //分析密钥,得到矩阵ktemp
	do{
		if(*pointerK=='(')
			continue;
		else{
			t=*pointerK-'0';
			while(*(pointerK+1)!=')'){
			ktemp[*pointerK-'0']=*(pointerK+1)-'0';
			pointerK++;
			}
			ktemp[*pointerK-'0']=t;
			pointerK++;
		}
	}	while(*(++pointerK)!='\0');	
	return ktemp;
}
void encrypt(char * p,int* k){
	int totalLength=0;
	int i,j;

	while(*p!='\0'){
		if(*p!=32){
		*(ptemp+totalLength)=*p;
		totalLength++;
		}
		p++;
		
	}
	row=totalLength/col+1;

	for(i=0;i

               

【密码学】传统密码:置换密码_第2张图片


二、周期置换密码(将明文P按固定长度m分组,然后对每组 按 的某个置换重排位置从而得到密文C) ;

【密码学】传统密码:置换密码_第3张图片【密码学】传统密码:置换密码_第4张图片


你可能感兴趣的:(cryptography)