Hill密码(Java实现)

最近学了密码学,就自己编了个Hill密码算法

1、获取密码

import java.util.Scanner;

public class MyKey {

	public static int [][]keys;
	public MyKey() {
		System.out.print("您的密码矩阵是几阶:");
		Scanner acc = new Scanner(System.in);
		int a = acc.nextInt();
		System.out.println("请输入:");
		MyKey.keys = new int[a][a];
		for(int i =0;i<keys.length;i++) {
			for(int j=0;j<(keys[i].length);j++) {
				keys[i][j]=acc.nextInt(); 
			}
		}
	}

利用一个二维数组存储密钥

2、获取明文


import java.util.Arrays;

import java.util.Scanner;

public class ClearText {
	public static int [] strs;
	MyKey mk = new MyKey();
	
	public void  AddCipher() {
		
		/*
		 * 
		 * 从键盘键入明文,并且将其数字化。
		 */
		System.out.print("请输入需要加密的明文(请勿键入空格,不分大小写):");
		Scanner a = new Scanner(System.in);
		String getword = a.nextLine();
		String []str = getword.toLowerCase().split("");
		int []strs =new int[getword.length()];
		
	
		for(int i = 0;i<str.length;i++) {
			strs[i] = Zimu.Z_M.indexOf(str[i]);
			
		}
		System.out.print("明文:"+getword+"数字化后是 ");
		for(int j=0;j<strs.length;j++) {
			System.out.print(strs[j]+" ");
		}
		System.out.println();

Z_M是我定义的一个终态常量,里面是二十六个字母。通过方法indexOF返回字母所在的位置,从而将明文正确的数字化

3、明文加密

        /*
		 * 
		 * 加密过程
		 */
		int []Cipher = new int [getword.length()];
		int num =0;
		for(int i = 0;i<MyKey.keys.length;i++) {
			for(int j =0;j<getword.length();j++) {
				num +=(strs[j])*(MyKey.keys[j][i]);
			}
			Cipher[i] = num%26 ;
			num = 0;
			
		}
		System.out.println(Arrays.toString(Cipher));
		for(int i = 0;i<Cipher.length;i++) {
			System.out.print(Zimu.Z_M.charAt(Cipher[i]));
		}

4、示例

实例
由于没考虑到当密钥的阶与加密明文长度不等时,本编程无法实现不等的情况,有待进一步优化。

下篇将继续学习,Hill密码的解密过程。

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页