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

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

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


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




实例:

已知信息:明文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    
// 邮箱:    zhuangxb91@qq.com    
/***********************************************************/   
#include <stdio.h>
#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<row;i++){
		for(j=0;j<col;j++){
			 cipher[i][*(k+j+1)-1]=*(ptemp+i*col+j);
		}
	}
}
char* printCipher(char cipher[][col]){
	int i,j;
	for(i=0;i<col;i++){
		for(j=0;j<row;j++){
			printf("%c",cipher[j][i]);
			c[i*row+j]=cipher[j][i];
		}
	}
	return c;
}

               



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



  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值