Hill密码(希尔密码) 您所在的位置:网站首页 字母b吉利吗 Hill密码(希尔密码)

Hill密码(希尔密码)

2023-12-14 08:11| 来源: 网络整理| 查看: 265

易受已知明文的攻击

希尔密码的加密过程:

1.准备一个n*n的可逆矩阵 E(即密钥)

2.将a-z 对应0-25编码

3.将要加密的一串字母当作n维度向量,比如矩阵E的大小是3*3,那么abcde就可以分为 abc de 转为数字就是012 340(不足n位补0)

4.密文(数字列向量)=(E*明文(数字列向量) )mod26

5.得到密文(字母)

希尔密码的解密:

1.算出E的逆矩阵E-1

2.明文(数字列向量)(E-1*密文(数字列向量))mod26

3.得到明文(字母)

下面是代码的实现(使用了自己写的Matrix类,其中大部分方法在本例中没有使用),代码中有较为详尽的注释

package HillEncryp; import link_about.KeyInput; public class HillEncryp { static double[][] encry={ //建立密钥矩阵要用的二维数组 {6,24,1}, {13,16,10}, {20,17,15} }; static double[][] de_encry={ //建立密钥矩阵的逆矩阵的二维数组 {8,5,10}, {21,8,21}, {21,12,8} }; static Matrix m_encry=new Matrix(encry); //密钥矩阵 static Matrix m_de_encry=new Matrix(de_encry);//密钥矩阵的逆矩阵 public static void main(String[] args) { int t = 0; while (true) { System.out.print("1.Hill密码程序\n0.exit"); t = KeyInput.readInt(); if(t==0) break; Hill();// } } public static double[][] set_matrix_plaintext(String s){//设置明文矩阵 double[][] plain=new double[3][3]; int k=0; for(int i=0;i if(k plain[j][i]=0; } } } return plain; } public static String de_encry_matrix(Matrix matrix){//将矩阵中内容转为字符串 String s=""; for(int i=0;i s += (char) (matrix.getData(j, i) + 97); //注意此处用j,i是因为明文和密文都是按列向量保存的 } } return s; } public static void Hill(){ System.out.println("请输入要加密的字符串(最好在6-9个字符内)"); String s=KeyInput.readString(); String s1=""; String s2=""; double[][] plain=set_matrix_plaintext(s);//构建两个矩阵 Matrix m_plain=new Matrix(plain); double[][] cipher=new double[3][3]; Matrix m_cipher=new Matrix(cipher); m_cipher=m_encry.multiply(m_plain);//加密 System.out.println("\n密钥为\n"+m_encry.toString()); System.out.println("\n明文矩阵为:\n"+m_plain); System.out.println("\n初始密文矩阵为:\n"+m_cipher.toString()); m_cipher.matrix_mod(26); System.out.println("\n密文矩阵为:\n"+m_cipher); s1=de_encry_matrix(m_cipher);//根据密文矩阵得到密文 System.out.println("\n密文为:\n"+s1); System.out.println("\n密钥的逆矩阵为:\n"+m_de_encry); Matrix decode=m_de_encry.multiply(m_cipher);//密钥的逆矩阵和密文矩阵相乘,再mod26获得解密后的矩阵 decode.matrix_mod(26); System.out.println("\n解密得矩阵为:\n"+decode.toString()); s2=de_encry_matrix(decode); System.out.println("\n解密得到明文:\n"+s2); } }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有