置换密码程序设计
置换、幻方加解密
- (一)描述
- (二)原理
- (三)程序
- (四)实现
(一)描述
(二)原理
(三)程序
import java.io.*;
public class Experiment2 {public static void main(String[] args) throws IOException {// 获取3阶幻方对应的置换int[] key = getMagicTrans(createMagicSquare(3));// 读取本地txt文件中转置加密的明文,进行转置加密File transFile = new File("./transposition.txt");transposition(transFile, key);// 读取本地txt文件幻方加密的明文,进行幻方加密File magicFile = new File("./magic_square.txt");magicSquare(magicFile, key);}// 置换加密public static void transposition(File transFile, int[] key) throws IOException {String[] plainText = readTxt(transFile);System.out.println("\n\n置换加密的明文: ");for (int i = 0; i < plainText.length; i++) {System.out.print(plainText[i] + " ");}// 将加密后的密文保存到.txt文件中,并以空格隔开FileWriter writer = new FileWriter(new File("./trans.txt"));System.out.println("\n置换加密的密文: ");for (int i = 0; i < key.length; i++) {System.out.print(plainText[key[i] - 1] + " ");if (i == key.length - 1) {writer.write(plainText[key[i] - 1]);} else {writer.write(plainText[key[i] - 1] + " ");}}// 释放资源writer.close();}// 幻方加密private static void magicSquare(File magicFile, int[] key) throws IOException {// 获取明文字符串数组String[] plainText = readTxt(magicFile);System.out.println("\n\n幻方加密的明文: ");for (int i = 0; i < plainText.length; i++) {System.out.print(plainText[i] + " ");}// 将加密后的密文保存到.txt文件中FileWriter writer = new FileWriter(new File("./Magic.txt"));// 对明文进行加密,并保存到strArr字符数组中String[] strArr = new String[plainText.length];for (int i = 0; i < key.length; i++) {strArr[key[i] - 1] = plainText[i];}System.out.println("\n幻方加密的密文: ");for (int i = 0; i < key.length; i++) {System.out.print(strArr[i] + " ");if (i == key.length - 1) { // 字符间以空格隔开,末尾不能留有空格writer.write(strArr[i]);} else {writer.write(strArr[i] + " ");}}System.out.println("");// 释放资源writer.close();}// 生成奇数阶幻方,可以是3、5、7、... 、2n+1阶public static int[][] createMagicSquare(int k) {int[][] magicArr = new int[k][k];int x = 0;int y = k / 2;int total = k * k;for (int i = 1; i <= total; i++) {magicArr[x][y] = i;int m = (x - 1 + k) % k;int n = (y + 1) % k;if (magicArr[m][n] > 0) {x = (x + 1) % k;} else {x = m;y = n;}}System.out.println("生成的3阶幻方:");for (int i = 0; i < magicArr.length; i++) {for (int j = 0; j < magicArr.length; j++) {System.out.print(magicArr[i][j] + " ");}System.out.println("");}return magicArr;}// 幻方对应的置换public static int[] getMagicTrans(int[][] arr) {int[] res = new int[(int) Math.pow(arr.length, 2)];int index = 0;for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length; j++) {res[index++] = arr[i][j];}}System.out.println("\n密钥:");for (int i = 0; i < res.length; i++) {System.out.print(res[i] + " ");}return res;}// 读取.txt文件中的明文public static String[] readTxt(File file) throws IOException {// 通过字符流读取.txtBufferedReader br = new BufferedReader(new FileReader(file));// 将读取到的明文以空格进行分割,并保存到字符串数组中String[] plainText = br.readLine().split(" ");// 释放资源br.close();return plainText;}
}
(四)实现
1)创建文件夹huanfang
magic_square.txt和transposition.txt存放准备加密的明文,Magic.txt、trans.txt存放生成的密文,Experiment2.java用于算法实现。
2)写入明文
magic_square.txt、transposition.txt填入要加密的明文4D 61 65 53 2D 4F 69 20 4E,如下:
3)运行结果
控制台输入: java Experiment2.java