简介

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

加密

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

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

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

   h  e  l  lo  -  m  y-  c  i  ph  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;elsespace = (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;} 

古典密码——置换密码相关推荐

  1. 古典加密算法-----置换密码

    置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密.置换密码有时又称为换位密码. 矩阵换位法是实现置换密码的一种常用方法.它将明文中的字母按照给的顺序安排在一个 ...

  2. 密码学基础知识(三)古典密码

    说完了前面那些,想起个事,本系列依据内容主要来自<现代密码学>马春光编著.我就是学这本书的. 好了,古典密码就是古时候的密码,哈哈,逗你玩的,shannon的保密系统的通信理论发表前的都是 ...

  3. 周期置换加密算法用c语言实现,古典密码实验报告.doc

    . .. 哈尔滨工程大学 实 验 报 告 实 验 名 称: 古典密码算法 班 级: 学 号: 姓 名: 实 验 时 间: 2014年4月 成 绩: 指 导 教 师: 实验室名称: 哈尔滨工程大学实验室 ...

  4. 古典密码算法 java_古典密码算法的实现

    1.古典密码可以分为代替密码和置换密码两种,这里实现了代替密码中的仿射变换和置换密码中的换位变换. 2.仿射变换: 加密过程:e(x) = ax + b (mod m) 解密过程:d(e(x)) = ...

  5. Crypto菜狗的学习日志之古典密码(一)

    一.凯撒密码 凯撒密码的原理相当简单,就是通过把字母移动一定的位数来实现加密和解密,其公式如下: 加密公式:密文 = (明文 + 位移数) Mod 26 解密公式:明文 = (密文 - 位移数) Mo ...

  6. 第二章:简单古典密码(及其五元组)

    简单古典密码及其五元组 编制密码的基本原理和基本方法称为密码法.基本的密码法主要有移位(也称为置换),代替,和加减三种(在许多书上只是介绍置换和代替).在密码发展的初级阶段,他们都曾经独立地作为加密算 ...

  7. 有趣的密码学介绍~古典密码之凯撒密码来咯~

    游说万乘苦不早,著鞭跨马涉远道.仰天大笑出门去,我辈岂是蓬蒿人! 文章目录 前言 正文 古典密码 一.古典密码概述介绍 1.置换密码 2.代换密码 二.古典密码分类介绍 1.置换密码 2.编辑本段代换 ...

  8. 补充(二)古典密码两张思维导图速通

    目录 目录 古典密码思维导图 古典密码分析思维导图 唯密文分析古典密码 单表代替密码 棋盘密码 曾公密码 置换密码的代表:斯巴达人的密码棒 古典密码思维导图 古典密码分析思维导图 唯密文分析古典密码 ...

  9. chapter 2 古典密码技术

    chapter 2 古典密码技术 2.1替代密码 替代是古典密码中用到的最基本的处理技巧之一 : 替代密码是指先建立一个替换表,加密时将需要加密的明文依次通过查表,替换为相应的字符,明文字符被逐个替换 ...

最新文章

  1. 代码优化的 5 大原则,第 1 条相信你一开始就没想到!
  2. 采用流水线技术实现8位加法器
  3. Spring集成web环境(手动实现)
  4. pppoe错误代码 linux,PPPOE常见故障代码及分析
  5. 汉王云名片识别(SM)组件开发详解
  6. 【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上
  7. STM32之通用定时器输出比较模式
  8. 测试markdown的发布
  9. Activity跳转与返回
  10. 【MySQL】MySQL 8报错 Unknown initial character set index 255 received from server. Initial client char
  11. 实验11 链表 程序1奇数值结点链表
  12. Python中__init__和__del__方法介绍
  13. IOS文件操作(NSFileManager)
  14. Atitit nosql的概念与attilax的理解 目录 1. 常见的nosql 二、Redis,Memcache,MongoDb的特点 1 HBase 1 2. Nosql的核心nosql 1
  15. 计算机二级excel高级筛选,Excel高级筛选怎么用之相关案例:excel高级筛选多个条件(并且、或用法)...
  16. my97日期范围限制
  17. AES加密/解密算法
  18. PS图层混合模式实例详解
  19. 寒假线上兼职:300-500元/小时,安利一个大学生也能月入8K的线上兼职!
  20. CDA学习笔记--EXCEL篇

热门文章

  1. Nunjucks模板语法
  2. 手机爱奇艺html5,爱奇艺手机会员能在电视上用吗?解决的两种方法
  3. CAD使qt打开DWG文件
  4. Python 列表 append() 方法
  5. 我的2010 :得到比失去的多
  6. [FFmpeg] 水平翻转视频,对称显示播放
  7. 如何在论文中引用文献
  8. Python列表添加字典并换行打印输出(字典换行)
  9. 中心化交易所和去中心化交易所优势分别在哪
  10. 一份关于windows不错的资料(转)