在上篇文章中,讲述了一些加密解密的概念以及Caesar、单表替换密码、Playfair密码。在这篇文章中主要涉及Hill密码,Vigenere密码,Vernam密码,置换技术。

Hill密码

希尔密码(Hill Cipher)是运用基本矩阵论原理的替换密码,由Lester S.Hill在1929年发明。该加密算法将m个连续的明文字母替换成m个密文字母,这是由m个线性等式决定的,在等式里每个字母被指定为一个数值(a=0,b=1,....,z=25)。例如m=3,系统可以描述为: c1=(k11p1+k21p2+k31p3)mod26 c2=(k12p1+k22p2+k32p3)mod26 c3=(k13p1+k23p2+k33p3)mod26 用行向量和矩阵表示如下:

这里C和P是长度为3的行向量,分别代表密文和明文,K是一个3*3矩阵,代表加密密钥。运算按模26执行。相应的解密公式为P=CK-1mod26。

代码如下:

package com.general.encryanddecode;import java.util.Arrays;
import java.util.Random;/**
* Hill算法
* 希尔密码(Hill Cipher)是运用基本矩阵论原理的替换密码,由Lester S.Hill在1929年发明.下面实现简单的Hill算法的加密解密
*
* @author generalandroid
* **/
public class HillTest {private int[][] k= new int[3][3];//{17,17,5,21,18,21,2,2,19};/**逆矩阵**/private int[][] d_k=new int[3][3];//{4,9,15,15,17,6,24,0,17}private String table="ABCDEFGHIJKLMNOPQRSTUVWXYZ";private int p_length;private String pContent;private String cContent;private int[] p_int;private int[] c_int;public HillTest(String cotent){System.out.println("原文:"+cotent);pContent=cotent;p_length=pContent.length();initKAndDK();initPContent();}private void initKAndDK(){//正向矩阵k[0][0]=17;k[0][1]=17;k[0][2]=5;k[1][0]=21;k[1][1]=18;k[1][2]=21;k[2][0]=2; k[2][1]=2; k[2][2]=19;//逆向矩阵d_k[0][0]=4; d_k[0][1]=9; d_k[0][2]=15;d_k[1][0]=15;d_k[1][1]=17;d_k[1][2]=6;d_k[2][0]=24;d_k[2][1]=0; d_k[2][2]=17;}//对明文做初始处理private void initPContent(){if(p_length%3==2){pContent=pContent+"Z";}else if(p_length%3==1){pContent=pContent+"ZZ";}if(p_int==null){p_int=new int[pContent.length()];}int i=0;System.out.println(pContent.toCharArray());for(char c:pContent.toCharArray()){p_int[i]=table.indexOf(c);i++;}System.out.println("p_int="+Arrays.toString(p_int));}private void encrypt(){if (c_int==null){c_int=new int[pContent.length()];}for(int i=0;i<p_int.length;i=i+3){c_int[i]=(p_int[i]*k[0][0]+p_int[i+1]*k[1][0]+p_int[i+2]*k[2][0])%26;c_int[i+1]=(p_int[i]*k[0][1]+p_int[i+1]*k[1][1]+p_int[i+2]*k[2][1])%26;c_int[i+2]=(p_int[i]*k[0][2]+p_int[i+1]*k[1][2]+p_int[i+2]*k[2][2])%26;}System.out.println("c_int="+Arrays.toString(c_int));StringBuilder c_content=new StringBuilder();for(int c:c_int){c_content.append(table.charAt(c));}cContent=c_content.toString();System.out.println("密文:"+cContent);}private void decrypt(){for(int i=0;i<p_int.length;i=i+3){p_int[i]=(c_int[i]*d_k[0][0]+c_int[i+1]*d_k[1][0]+c_int[i+2]*d_k[2][0])%26;p_int[i+1]=(c_int[i]*d_k[0][1]+c_int[i+1]*d_k[1][1]+c_int[i+2]*d_k[2][1])%26;p_int[i+2]=(c_int[i]*d_k[0][2]+c_int[i+1]*d_k[1][2]+c_int[i+2]*d_k[2][2])%26;}StringBuilder p_content=new StringBuilder();for(int c:p_int){p_content.append(table.charAt(c));}pContent=p_content.toString();System.out.println("明文:"+pContent.substring(0,p_length));}public static void main(String[] args){HillTest hillTest= new HillTest("GENERALANDROIDGEEKAXYEN");hillTest.encrypt();hillTest.decrypt();}}
/**
原文:GENERALANDROIDGEEKAXYEN
GENERALANDROIDGEEKAXYENZ
p_int=[6, 4, 13, 4, 17, 0, 11, 0, 13, 3, 17, 14, 8, 3, 6, 4, 4, 10, 0, 23, 24, 4, 13, 25]
c_int=[4, 18, 23, 9, 10, 13, 5, 5, 16, 20, 21, 14, 3, 20, 9, 16, 4, 8, 11, 20, 3, 1, 14, 14]
密文:ESXJKNFFQUVODUJQEILUDBOO
明文:GENERALANDROIDGEEKAXYEN* **/复制代码

多表代替密码

对简单单表代替的改进方法是在明文消息中采用不同的单表代替。这种方法一般称之为多表代替密码 。所有这些方法都有以下的共同特征:(1)采用相关的单表代替规则集(2)密钥决定给定变换的具体规则。

Vigenere密码

Vigenere密码:多表代替密码中最著名的和最简单的是Vigenere密码。它的代替规则集由26个Caesar密码的代替表组成,其中每一个代替表是对明文字母表移位0~25次后得到的代替单表。每个密码由一个密钥字母来表示,这个密钥字母用来代替明文字母a,故移位3次的Caesar密码由密钥值3来代表。 代码如下:

package com.general.encryanddecode;import java.util.Arrays;/**** 多表代替密码-Vigenere* 它的代替规则集由26个Caesar密码的代替表组成,其中每一个代替表是对明文字母表移位0~25次后得到的代替单表。每个密码由一个密钥字母来表示* ,这个密钥字母用来代替明文字母a,故移位3次的Caesar密码由密钥值3来代表。* @author generalandroid*/
public class VigenereTest {private String key;private String pContent;private String cContent;private int[] key_index;private char[] p_content;private char[] c_key;private char[] c_content;public VigenereTest(String key,String content){this.key=key;this.pContent=content;System.out.println("密钥:"+key);System.out.println("原文:"+pContent);this.key_index=new int[pContent.length()];this.p_content=pContent.toCharArray();this.c_content=new char[p_content.length];initKey();}public static void main(String[] args){VigenereTest vigenereTest=new VigenereTest("GEAKAAZEN","GENERALANDROIDGEAKAAZEN");vigenereTest.encrypt();vigenereTest.decrypt();}/**重新构建密钥词**/private void initKey(){key=key+pContent.substring(0,pContent.length()-key.length());System.out.println("转换之后的key:"+key);c_key=key.toCharArray();for(int i=0;i<c_key.length;i++){key_index[i]=c_key[i]-'A';}System.out.println("Caesar 代替集:"+ Arrays.toString(key_index));}public void encrypt(){for(int i=0;i<p_content.length;i++){int p_index=p_content[i]+key_index[i];if(p_index>90){p_index=p_index-90+'A';//System.out.println("p_index:"+p_index);}c_content[i]=(char)p_index;}System.out.println("密文:"+new String (c_content));}public void decrypt(){char []t=new char[p_content.length];for(int i=0;i<c_content.length;i++){int c_index=c_content[i]-key_index[i];if(c_index<65){c_index=c_index+90-'A';//System.out.println("c_index:"+c_index);}t[i]=(char)c_index;}System.out.println("明文:"+new String (t));}}
/***密钥:GEAK原文:GENERALANDROIDGEAKAAZEN转换之后的key:GEAKGENERALANDROIDGEAKACaesar 代替集:[6, 4, 0, 10, 6, 4, 13, 4, 17, 0, 11, 0, 13, 3, 17, 14, 8, 3, 6, 4, 0, 10, 0]密文:MINOXEYEFDDOVGXSINGEZON明文:GENERALANDROIDGEAKAAZEN密钥:GEAKAAZEN原文:GENERALANDROIDGEAKAAZEN转换之后的key:GEAKAAZENGENERALANDROIDCaesar 代替集:[6, 4, 0, 10, 0, 0, 25, 4, 13, 6, 4, 13, 4, 17, 0, 11, 0, 13, 3, 17, 14, 8, 3]密文:MINORALEBJVCMUGPAXDROMQ明文:GENERALANDROIDGEAKAAAEN** **/复制代码

Vernam密码

Vernam密码:Vernam密码属于流密码,其加密过程是明文与密钥按位异或,解密过程是密文与密钥按位异或。

其中:pi是明文第i个二进制位,ki是密钥第i个二进制位,ci是密文第i个二进制位。

代码如下:

package com.general.encryanddecode;import org.omg.Messaging.SYNC_WITH_TRANSPORT;import java.util.Arrays;/**** Vernam密码:Vernam密码属于流密码,其加密过程是明文与密钥按位异或,解密过程是密文与密钥按位异或。* @author generalandroid* **/
public class VernamTest {private String key;private String pContent;private String cContent;private char[] c_key;private char[] c_content;private char[] p_content;public VernamTest(String key,String content){this.key=key;this.pContent=content;System.out.println("密钥:"+key);System.out.println("原文:"+pContent);initKey();c_key=this.key.toCharArray();c_content=new char[pContent.length()];p_content=pContent.toCharArray();}public  static void main(String[] args){VernamTest vernamTest=new VernamTest("GEEK","GENERALANDROID");vernamTest.encrypt();vernamTest.decrypt();}/**重新构建密钥词**/private void initKey(){key=key+pContent.substring(0,pContent.length()-key.length());System.out.println("转换之后的key:"+key);}public void encrypt(){for(int i=0;i<p_content.length;i++){c_content[i]=(char) (c_key[i]^p_content[i]);}System.out.println("密文:"+new String(c_content));}public void decrypt(){char[] t=new char[c_content.length];for(int i=0;i<c_content.length;i++){t[i]=(char) (c_key[i]^c_content[i]);}System.out.println("明文:"+new String(t));}}复制代码

置换技术

前面几种简单的加密技术都是使用的代替技术,即将明文的内容代替为其他内容 ,这里面会出现明文中没有的元素,而置换技术强调的是对明文的重排列,故不会出现明文中没有的元素。 栅栏技术:最简单的置换技术例子是栅栏技术,按照对角线的顺序写出明文, 而按行的顺序读出作为密文。举个例子:GENERALANDROID写成如下 GNRLNRI EEAADOD 则密文就为:GNRLNRIEEAADOD 一个更复杂的置换技术的例子:把消息一行一行地写成矩形块,然后按列读 出 ,但是把列的次序打乱。列的次序就是算法的密钥。 为了安全,一般对明文进行多次置换来保护信息。

要说的内容就这么多,如果文中有不对的地方,麻烦指出,如果喜欢我的文章,可以动动手指关注一下,赞一下,我会有更大的动力写出更多的文章,转载请注明出处:http://blog.csdn.net/android_jiangjun/article/details/79131386

参考资料

《密码编码学与网络安全》第六版

传统加密技术续-Hill Vigenere Vernam相关推荐

  1. 【密码学基础】03 传统加密技术

    传统加密技术 1. 对称密码概述 1.1 对称密码模型 1.2 密码编码学 1.3 密码分析学 2. 传统加密技术 2.1 代替技术 2.1.1 Caesar密码 2.1.2 单表代替密码 2.1.3 ...

  2. 密码编码学与网络安全(2):对称密码之传统加密技术

    对称密码之传统加密技术 关于对称加密 对称密码模型 密码编码学 密码分析学与穷举攻击 古典加密算法 代替技术 置换技术 转轮机 隐写术 关于对称加密 对称加密,也称为传统加密或单密钥加密,是20世纪7 ...

  3. 【现代密码学原理】——传统加密技术(学习笔记)

  4. 信息安全 chap-3 传统加密方法

    传统加密方法 1 换位法 2 简单代替密码 基于仿射变换的密码 3 同音代替密码 4 多表代替密码 Vigenère密码 Beaufort密码 重合度 Kasiski方法 游动密钥密码 Vernam密 ...

  5. 计算机儿童上网加密,计算机三级网络技术辅导:加密技术

    计算机三级网络技术辅导:加密技术 导语:所有的加密算法都基于两个原理:代换和置换.下面就由小编为大家带来计算机三级网络技术辅导:加密技术,希望能给大家带来帮助! (1)密码学基本术语 明文:原始的消息 ...

  6. 【安全加密技术】 对称加密

    转载请注明出处:http://blog.csdn.net/sk719887916/article/details/46822663 上篇了解了<非对称加密>后 今天我来继续了解下加密技术中 ...

  7. [数据加密]GIS空间数据水印信息隐藏与加密技术方法[转]

    到目前为止,国内外数字水印技术的研究主要集中在图像.视频和声音等多媒体信息的版权保护上,在GIS空间数据中,通过隐藏水印信息并对其加密.压缩以实现其安全保护的研究还很少,这是数字水印技术应用的一个新领 ...

  8. 深度学习实践:计算机视觉_深度学习与传统计算机视觉技术:您应该选择哪个?

    深度学习实践:计算机视觉 计算机视觉 (Computer Vision) Deep Learning(DL) is undeniably one of the most popular tools u ...

  9. 数据自治开放的加密技术挑战

    数据自治开放的加密技术挑战 黄霖1,2, 黎源1,2, 汪星辰1,2, 赵运磊1,2 1. 复旦大学计算机科学技术学院,上海 201203 2. 上海市数据科学重点实验室,上海 201203 摘要:数 ...

最新文章

  1. 最简单的基于FFmpeg的AVfilter的例子-修正版
  2. 面试题08(C++)
  3. HTTPS中SSL协议总结
  4. 计算机系统基础:校验码知识笔记
  5. php socket_create_listen(),socket_create_listen()
  6. Python编程基础19:封装、继承与多态
  7. 存储产业进入闪存时代
  8. 概率分布-beta分布
  9. win系统服务器做加速,Win 2003操作系统25招加速大法(转)
  10. Manjaro-KDE安装动态桌面插件
  11. Huawei 华为云 机器翻译调用 详解
  12. Excalidraw:开源趣味画图工具(在线和本地均可)
  13. 年薪40万最牛应届生 南大一出5个其中2个同宿舍
  14. 网页黑夜模式白天模式切换 html+css+js
  15. Natas 幽灵王病毒分析
  16. 清华美女学霸的面试笔记,超详细
  17. 2022年最新广东水利水电施工安全员考试题库及答案
  18. Qt 桌面悬浮画图软件--电子白板
  19. c++ std vector用法介绍
  20. 进大公司还是进小公司

热门文章

  1. 黑客挂马紧盯娃娃 儿童节育儿教育网站被挂马
  2. 山大华特卧龙学校第一届ACM赛后总结
  3. mysql2000清除挂起工具_安装SQL SERVER2000提示注册表文件被挂起的解决方案
  4. ThinkPad触摸板开启或者关闭方法
  5. 福布斯:雅虎代理权争夺战背后的十大问题
  6. logitech摄像头 linux,logitech webcam linux 驱动安装
  7. iOS OC Sugars collection
  8. 使Windows XP快上几倍的三招
  9. JavaFX桌面应用开发-菜单栏-MenuBar、Menu 、MenuItem
  10. 终于搞懂了,用大白话给你解释Zookeeper的选举机制,包教会