置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码有时又称为换位密码。

矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。例如,明文为attack begins at five,密钥为cipher,将明文按照每行6列的形式排在矩阵中,形成如下形式:

a t t a c k

b e g i n s

a t f i v e

根据密钥cipher中各字母在字母表中出现的先后顺序,给定一个置换:

1 2 3 4 5 6

f =

1 4 5 3 2 6

根据上面的置换,将原有矩阵中的字母按照第1列,第4列,第5列,第3列,第2列,第6列的顺序排列,则有下面形式:

a a c t t k

b i n g e s

a i v f t e

从而得到密文:aacttkbingesaivfte

  1. package cn.hdu.edu.encrypt;
  2. /*
  3. * 古典密码算法之  置换算法
  4. * @author ni掌柜
  5. */
  6. public class Change {
  7. //当加密或者解密成功时返回CRYPT_OK,失败时返回CRYPT_ERROR
  8. private final static int CRYPT_OK =     1;
  9. private final static int CRYPT_ERROR = 0;
  10. /*
  11. * @param initCode 没有加密前的字符串
  12. * @CRYPT_OK 加密成功
  13. * @CRYPT_ERROR 加密失败
  14. */
  15. public static int encrypt(String initCode)throws Exception{
  16. //用来输出加密后的字符
  17. StringBuilder sb = new StringBuilder();
  18. //获取initCode的字符串长度
  19. int codeLength = initCode.length();
  20. //根据这个codeLength来确定要几行6列
  21. int rows = (int)Math.ceil(codeLength/6.0 );
  22. //构造一个rows行6列的数组
  23. char[][] initChar = new char[rows][6];
  24. //存放initCode中的所有字符,包括空格
  25. for(int i = 0; i < initChar.length; i++ )
  26. for(int j=0; j < initChar[0].length; j++){
  27. //将对应字符放入这个数组中
  28. try{
  29. initChar[i][j] = initCode.charAt(
  30. (i ) * initChar[0].length + j
  31. );
  32. }catch(Exception e){
  33. //多出来的用@表示
  34. initChar[i][j] = 64;
  35. }
  36. }
  37. //进行如下转换
  38. /*
  39. * 00 01 02 03 04 05
  40. * 10  11 12  13 14  15
  41. */
  42. // 1 4 5 3 2 6
  43. //构造一个rows行6列的数组 作为目标
  44. char[][] targetChar = new char[rows][6];
  45. for(int i = 0; i < targetChar.length; i++ )
  46. for(int j=0; j < targetChar[0].length; j++){
  47. //第二列的字符是initChar中的第四列的字符
  48. if(j == 1 ){
  49. targetChar[i][j] = initChar[i][3];
  50. }
  51. //第三列的字符是initChar中的第五列的字符
  52. else if(j == 2){
  53. targetChar[i][j] = initChar[i][4];
  54. }
  55. //第四列的字符是initChar中的第三列的字符
  56. else if(j == 3){
  57. targetChar[i][j] = initChar[i][2];
  58. }
  59. //第五列的字符是initChar中的第二列的字符
  60. else if(j == 4){
  61. targetChar[i][j] = initChar[i][1];
  62. }
  63. //第一和六列的字符不变
  64. else{
  65. targetChar[i][j] = initChar[i][j];
  66. }
  67. }
  68. //整合成一个密文
  69. //==================输出======================
  70. for(int i = 0; i < targetChar.length; i++ )
  71. for(int j=0; j < targetChar[0].length; j++){
  72. sb.append(targetChar[i][j] );
  73. }
  74. //  ==================输出======================
  75. //  for(int i = 0; i < initChar.length; i++ )
  76. //      for(int j=0; j < initChar[0].length; j++){
  77. //          System.out.print(targetChar[i][j] );
  78. //      }
  79. //以下就是加密后的字符
  80. String targetCode = sb.toString();
  81. System.out.println(targetCode);
  82. return CRYPT_OK;
  83. }
  84. /*
  85. * @param targetCode 加密后的字符串
  86. * @CRYPT_OK 解密成功
  87. * @CRYPT_ERROR 解密失败
  88. */
  89. public static int decrypt(String targetCode)throws Exception{
  90. //用来输出解密后的字符
  91. StringBuilder sb = new StringBuilder();
  92. //获取targetCode的字符串长度
  93. int codeLength = targetCode.length();
  94. //根据这个codeLength来确定要几行6列
  95. int rows = (int)Math.ceil(codeLength/6.0 );
  96. //构造一个rows行6列的数组
  97. char[][] targetChar = new char[rows][6];
  98. //存放targetCode中的所有字符,包括空格
  99. for(int i = 0; i < targetChar.length; i++ )
  100. for(int j=0; j < targetChar[0].length; j++){
  101. //将对应字符放入这个数组中
  102. targetChar[i][j] = targetCode.charAt(
  103. (i ) * targetChar[0].length + j
  104. );
  105. }
  106. //由于加密的时候是如下变换,现在要变回来
  107. /*
  108. * 00 01 02 03 04 05
  109. * 10  11 12  13 14  15
  110. */
  111. // 1 4 5 3 2 6
  112. //构造一个rows行6列的数组 作为目标
  113. char[][] initChar = new char[rows][6];
  114. for(int i = 0; i < initChar.length; i++ )
  115. for(int j=0; j < initChar[0].length; j++){
  116. //init第二列的字符是targetChar中的第四列的字符
  117. if(j == 1 ){
  118. initChar[i][j] = targetChar[i][3];
  119. }
  120. //第三列的字符是targetChar中的第五列的字符
  121. else if(j == 2){
  122. initChar[i][j] = targetChar[i][4];
  123. }
  124. //第四列的字符是targetChar中的第三列的字符
  125. else if(j == 3){
  126. initChar[i][j] = targetChar[i][2];
  127. }
  128. //第五列的字符是targetChar中的第二列的字符
  129. else if(j == 4){
  130. initChar[i][j] = targetChar[i][1];
  131. }
  132. //第一和六列的字符不变
  133. else{
  134. initChar[i][j] = targetChar[i][j];
  135. }
  136. }
  137. //整合成一个密文
  138. //==================输出======================
  139. for(int i = 0; i < initChar.length; i++ )
  140. for(int j=0; j < initChar[0].length; j++){
  141. sb.append(initChar[i][j] );
  142. }
  143. //  ==================输出======================
  144. //  for(int i = 0; i < initChar.length; i++ )
  145. //      for(int j=0; j < initChar[0].length; j++){
  146. //          System.out.print(targetChar[i][j] );
  147. //      }
  148. //以下就是init的字符
  149. String initCode = sb.toString();
  150. System.out.println(initCode);
  151. return CRYPT_OK;
  152. }
  153. }

古典加密算法-----置换密码相关推荐

  1. 古典密码——置换密码

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

  2. 信息安全复习四:置换密码乘积密码隐写术

    一.章节梗概 置换密码.Rail Fence密码.行置换密码.乘积密码.转子机.隐写术 二.置换技术 2.1 定义 重新排列明文字母,达到信息加密的目的. 与替代密码不同的是,原来明文中的字母同样出现 ...

  3. 加密算法的重要性以及了解加密算法分类

    首先什么是加密算法: 加密算法的作用就是把一段信息(明文) 通过某种算法 转化为不能(易)看懂的信息 ->既密文 为什要用到加密算法 (加密算法的重要性): 不论政府企业还是个人,运用加密算法的 ...

  4. Android MD5 RSA DES等几种加密算法

    参考:http://www.2cto.com/kf/201207/138943.html http://www.iplaysoft.com/encrypt-arithmetic.html http:/ ...

  5. 古典密码学原理和Base64算法原理

    密码学,就是研究如何将一个内容(可以是字符串.文件.二进制流)通过一系列算法转换成另一种内容的学科.从广义上来看,有一个算法可以将字符串转换成另一个字符串即可,即该算法可逆不可逆都可以:从狭义上来看, ...

  6. 信息安全密码学:DES算法的核心 E盒、S盒、P盒

    加密密钥等于脱密密钥,或者由一个可以轻易的计算出另一个的密码体制,称为单密钥密码体制,亦或称为对称密码体制或传统密码体制.其最具代表意义的当然属于DES密码体制了. 1.DES的设计背景 1973年5 ...

  7. 【渝粤题库】陕西师范大学164107 电子商务信息安全 作业(高起专)

    <电子商务信息安全(高起专)>作业 一.单选题 以下那个不是杀毒软件的正确使用方法( ). A. 定期对病毒库进行升级 B. 经常针对电脑进行全盘扫描 C. 设置开机自动运行杀毒软件 D. ...

  8. 2023年江苏省赛事网络空间安全理论题库

    [单选题] 1.访问控制是指确定( )以及实施访问权限的过程? A.用户权限 B.可给予哪些主体访问权利 C.可被用户访问的资源 D.系统是否遭受入侵 答案:A 2.数据安全从总体上可以分成5个层次, ...

  9. 软考信息安全工程师笔记(第二章--密码学基础与应用)

    目录 1. 密码学基本概念 1.1 密码学的基本安全目标 1.2 密码体制 1.3 古典密码 2. 分组密码 2.1 分组密码的概念 2.2 DES 2.3 AES 2.4 SM4 2.5 分组密码工 ...

最新文章

  1. linux的more 命令
  2. 【数据结构】二叉树及其相关操作
  3. pix2pixhd_一文读懂GAN, pix2pix, CycleGAN和pix2pixHD
  4. centos7 配置静态ip时出现双ip问题解决
  5. 【LeetCode笔记】617. 合并二叉树(Java、DFS、二叉树)
  6. 容器编排技术 -- Kubernetes kubectl get 命令详解
  7. Linux/UNIX 图形操作环境KDE 与GNOME
  8. Oracle Share Pool工作原理
  9. c语言中find的作用,c语言find函数的用法详解
  10. 5G技术演进与核心技术一(笔记)
  11. matlab乖离率计算,终于有人把“乖离率”说清楚了,看懂少走十年弯路!
  12. html2canvas生成放大图片
  13. CentOS7配置代理上网
  14. 分布式架构之CAP理论/AP架构/CP架构
  15. 磊科路由器如何设置虚拟服务器,nw711磊科路由器设置桥接步骤图文
  16. QT数据库访问技术简介
  17. 走向云计算之HBase模式设计及表设计案例
  18. java+jna+DD实现全局键鼠驱动级模拟
  19. 渗透测试国内外研究_浅析晶硅光伏背板阻隔性能测试(一)——水蒸气透过率测试...
  20. Spring 源码学习一: 使用Gradle 构建Spring 源码环境

热门文章

  1. 【工具使用系列】关于 MATLAB 机器视觉,你需要知道的事
  2. redis在Linux上的安装
  3. IIS服务器五大安全要素
  4. Mysql 添加用户和数据库授权
  5. 【系统架构师修炼之道】(1):『序』
  6. nf_hook_slow函数
  7. mxmkc编译器参数!
  8. 如何找回由于IO设备错误移动磁盘的文件
  9. ZooKeeper 的典型应用场景
  10. 迁移 Nexus 软件仓库拾遗