Hill密码是一种传统的密码体系。加密原理:选择一个二阶可逆整数矩阵A称为密码的加密矩阵,也就是这个加密体系的密钥。加密过程:
明文字母依次逐对分组,例如加密矩阵为二阶矩阵,明文就两个字母一组,如果最后一组不足(明文长度为奇数),就补充任意字母凑个双,构成二维向量组a。计算矩阵A乘以向量组a,得到新的二维列向量b,反查字母表得到两个字母即为密文字母。
也就是说,加密过程为:明文-->映射为数字矩阵-->经过矩阵加密-->映射为字符串(密文)
解密过程也是同样的过程,只不过中间使用矩阵解密,Hill密码是一种传统的密码体系。
根据这个过程,每一阶段功能代码如下:
首先创建一个类,HillCrypto,
成员变量有加密密钥矩阵和解密密钥矩阵,字母转数值映射和数值转字母映射
初始化阶段,实例化以上成员变量,其中映射表较大,因此写在了本地文件中便于重用,创建映射时需要读取本地文件。
文件内容如下:
代码如下:
importjava.io.BufferedReader;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;public classHillCrypto {private Maptable;private MapgetPlainMap;private int[][] encryption = { {1, 1},{0, 3}};private int[][] decryption;publicHillCrypto(String tableFilePath) {//TODO Auto-generated constructor stub
int mrow = encryption.length;int mcolumn = encryption[0].length;this.decryption = new int[mrow][mcolumn];//二阶矩阵的逆矩阵,如果是更高阶的,使用其他办法,比如通过余子式除以行列式得到逆矩阵,行列式的求法见鄙人的其他博客。
decryption[0][0] = (encryption[1][1] * 27 / (encryption[0][0]*encryption[1][1] - encryption[0][1]*encryption[1][0])) % 26;