置换密码是一种通过一定规则改变字符串中字符的顺序从而实现加密的密码算法。常见的是将明文字符串按照n个一行形成矩阵,然后再按列读出,矩阵的列数(n)和按列读出的顺序便是密钥。

我们以字符串“hello-my-cipher”为例来演示加密过程

  1. 选择密钥,我们这里使用“4213”作为密钥。该密钥共4位,表示中间结果的矩阵共4列,4213表示按照第四列,第二列,第一列,第三列的顺序读出形成密文

  2. 生成中间结果矩阵(该行不够4个则用明文中不包含的固定字符填充,这里使用‘@’)

   h  e  l  l
   o  -  m  y
   -  c  i  p
   h  e  r  @
  1. 按照密钥所示的列顺序读出

    lyp@e-ceho-hlmir

  2. 至此加密完成

解密过程即按照密钥所示的长度顺序恢复出矩阵,再按行读取即可。

已知明文破解

根据置换密码算法的特点,破解的主要难点是确定密钥的长度。我们可以根据密文的第一个和第二个字符在明文中的位置之差得出密钥的长度,但这中方法并不总是有效,例如helloeye用密钥1234加密后密文前两个字符是he,而h,e在明文中的位置有1和4,再例如helloeye用3124加密后前两个字符是ly,而l,y在明文中的位置有4和5,所以这个方法无法完全确定密钥长度。假如我们确定了密钥长度,就可以把明文形成矩阵,然后比对密文和明文矩阵的列,便能确定按列读出的顺序,也就得到了密钥。(这里还有碰到明文矩阵中两列完全一样情况,这样就得不到完整的密钥)

举个栗子:

明文:abcdefgh
密钥:2143
加密结果:bfaedhcg(8个字符)
根据bf在明文中的位置,第2和第6,得到密钥长度为4,则每列长度为8/4=2,然后生成矩阵
a	b	c	d
e	f	g	h
密文中前2个字符为bf,找到矩阵中bf列为第二列,密钥第一位是2,密文中接下来2个字符是ae,找到矩阵中ae
列为第一列,密钥第二位是1,按这个方法,就可以得到密钥为2143

当面对密钥长度有多种可能的时候,目前在我看来只能全部试过,所以这个破解不算完全。

/*置换密码编码
*permutation_encode(plain_text,len,key,key_len,&result)
*@para1:字符串明文
*@para2:该明文的长度
*@para3:以字符串数字表示的密钥,即读取列的顺序
*@para4:密钥的长度,也是置换中矩阵行的长度
*@para5:用来接收结果的二级指针(传入参数时使用&+一级指针)
*返回加密后字符串的长度
*permutation_decode(cipher_text,len,key,key_len,&result)
*参数与加密函数类似,区别是第一个为密文字符串
*返回解密后明文的长度
/*编码*/
int permutation_encode(const char* plain_text,int len,const char* key,int key_len,char** result)
  //读取密文的指示
  int p_cipher = 0;
  //读取密钥的指示
  int p_key = 0;
  //读取明文的指示
  int p_plain = key[p_key]-'1';
  //密文的长度(需要分配的空间)
  int space;
  //按密钥长度分组后余下的部分长度(不足矩阵一行)
  int stuff_len = len%key_len;
  char* cipher_text;
  //分配空间
	if(stuff_len==0)
		space = len;
		space = (len/key_len+1)*key_len;
  cipher_text = (char*)malloc(space+1);
	for(;p_cipher<space;p_cipher++)
		if(p_plain<len)/*正常读取*/ 
			cipher_text[p_cipher] = plain_text[p_plain];
		else if(p_plain>=space)/*该列已经读取完毕*/ 
			p_key++;
			p_plain = key[p_key]-'1';
			cipher_text[p_cipher] = plain_text[p_plain];
		else/*该列最后一行没有字符,则填充@*/ 
			p_key++;
			p_plain = key[p_key]-'1';
			cipher_text[p_cipher] = '@';
			continue;	
		/*取该列下一个字符*/
		p_plain = p_plain + key_len;
	cipher_text[space] = '\0';
	*result = cipher_text;
	return space;
int permutation_decode(char* cipher_text,int len,char* key,int key_len,char** result)
	int p_cipher = 0;
	int p_key = 0;
	int p_plain = key[p_key]-'1';
	int plain_text_len = len;
	char* plain_text;
	plain_text = (char*)malloc(len);
	for(;p_cipher<len;p_cipher++)
		if(p_plain>=len)/*该列已经读取完毕*/ 
			p_key++;
			p_plain = key[p_key]-'1';
			plain_text[p_plain] = cipher_text[p_cipher];
		else/*正常读取*/ 
			if(cipher_text[p_cipher] == '@')
				plain_text_len--;
			plain_text[p_plain] = cipher_text[p_cipher];
		p_plain = p_plain + key_len;
	plain_text[plain_text_len] = '\0';
	*result = plain_text;
	return plain_text_len;
利用定义进行求解,设A是一个n阶矩阵,如果存在n阶矩阵B,使得AB=BA=E,则称矩阵A为可逆矩阵。
2.伴随矩阵法
首先判断矩阵是否可逆,若可逆求出每个元素的代数余子式,伴随矩阵就是代数余子式的转置形式
3.初等变换法
矩阵的初等行(列)变换:(1)对调矩阵的两行(列);(2)矩阵的某行(列)乘以非零常数k;(3)所有元素的k倍(k为非零常数)加到
	置换密码算法的原理是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密置换密码有时又称为换位密码。
	矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。例如,明文为attack begins at five,密钥为cipher,将明文按照每行6个字母的形式排在矩阵中,形成如下形式:
	根据密钥cipher中各个字母在字母表中出现的先后顺序,给定一个置换:
	根据上面的置换,将原有居住中的字母按照第1列、第4裂、第5裂、第3裂、第2列、第6列的顺序排列,则有下面的形式:
	从而得到密文:abatgftetcnvaiikse
	其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由    密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
				
置换密码置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而 实现明文信息的加密置换密码有时又称为换位密码。 矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的顺序安排 在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。 #include<stdio.h> #include<string.h> #defin...
置换密码/huanweim 置换密码(Permutation Cipher)又叫换位密码(Transposi-tionCipher),它根据一定的规则重新排列明文,以便打破明文的结构特性。置换密码的特点是保持明文的所有字符不变,只是利用置换打乱了明文字符的位置和次序。 最常见的置换密码有二种: 列置换密码(明文遵照密钥的规程按列换位并且按列读出序列得到密文);周期置换密码(将明文P按固定长度m分组,然后对每组按1,2…,m的某个置换重排位置从而得到密文C)。
 置换密码又称换位密码,是根据一定的规则重新排列明文,以便打破明文的结构特性。置换密码的特点是保持明文的 所有字符不变,只是利用置换打乱了明文字符的位置和次序。也就是说,改变了明文的结构,不改变明文的内容。 例如:明文:asdfghjklmnbvc 密钥:31524 首先把弄清密钥长度,然后将密文分组即 明文矩阵:       a s d f g      h j k l m 明文遵照密钥规则按列换位,按列读出明文序列得到密文。 加密:明文分段,不足则填充,根据密钥以列为单位进行互换,按行从左到右写出,得到密文。 解密:密文分段,根据密钥逆置换以列为单位进行互换,按行从左到右写出,得到明文。
密码学是一门研究设计密码算法和破译密码算法的综合性技术科学,是网络空间安全学科中理论体系最完善的一门科学,也是信息安全的基石。密码学通常由密码编码和密码分析两大分支组成。 从密码学的发展历史来看,可以分为古典密码学和现代密码学。古典加密算法往往只是对单个的代替或置换操作,现代密码学就是寻求基于简单运算来构造复杂算法的数学方法,形成安全性较高的加密算法,重复混合应用置换和替代运算,实现对明文的扩散和...
实验原理: 不改变明文字符,但是把字符在明文中的排列顺序改变,来实现明文信息的加密置换密码也被称为换位密码。本次实验使用的是矩阵换位法,是将明文中的字母按照给定的顺序安排在一个矩阵中,然后又根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。 解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵恢复正...