Hill密码加密算法 Java实现

信息安全概论

m=3的Hill密码加密算法

import java.util.ArrayList;
import java.util.Scanner;

/**
  * m=3的Hill密码加密算法 
  * 根据提示输入矩阵中各个位置的数值,并输入所需加密的明文
  * @author Riyad
  */
public class Hill
{
	private int m = 3;
	
	/**
	 * 加密算法
	 */
	public void encrypt()
	{
		int[][] k = new int[m][m];
		
		//自定义加密密钥矩阵
		System.out.println("Please enter the number of key matrix k: ");
		Scanner scan1 = new Scanner(System.in);
		for(int i = 0; i < 3; i++)
		{
			for(int j = 0; j < 3; j++)
			{
				System.out.print("Please enter k[" + i + "][" + j + "]: ");
				k[i][j] = scan1.nextInt();
			}
		}
		
		//获取明文,将明文中的空格删去,并全部转换为大写字母字符数
		System.out.print("Please enter the plaintext: ");
		Scanner scan2 = new Scanner(System.in);
		String plaintext = scan2.nextLine();		
		char[] plaintextCharArray = plaintext.replaceAll(" ", "").toUpperCase().toCharArray();
		
		//将字符数组中所有内容添加进ArrayList中
		ArrayList<Character> list = new ArrayList<Character>();
		for(int i = 0; i < plaintextCharArray.length; i++) list.add(plaintextCharArray[i]);
		
		//明文不足按3个字母一组分组时补字母x
		while(list.size() % 3 != 0) list.add('x');
		
		//输出密文
		System.out.print("The ciphertext is: ");
		for(int i = 0; i < list.size(); i = i + 3)
		{
			char[] p = new char[3];
			
			p[0] = list.get(i);
			p[1] = list.get(i + 1);
			p[2] = list.get(i + 2);
			
			char[] c = new char[3];
			
			//线性方程,计算得出密文
			c[0] = (char) ((k[0][0] * (p[0] - 65) + k[0][1] * (p[1] - 65) + k[0][2] * (p[2] - 65)) % 26 + 65);
			c[1] = (char) ((k[1][0] * (p[0] - 65) + k[1][1] * (p[1] - 65) + k[1][2] * (p[2] - 65)) % 26 + 65);
			c[2] = (char) ((k[2][0] * (p[0] - 65) + k[2][1] * (p[1] - 65) + k[2][2] * (p[2] - 65)) % 26 + 65);

			System.out.print("" + c[0] + c[1] + c[2] + " ");
		}
		
		scan1.close();
		scan2.close();
	}
	
	public static void main(String[] args)
	{
		/*
		 	{17 17 5}
		k =	{21 18 21}
			{2 2 19}
		 
		pay more money
		*/
		Hill h = new Hill();
		h.encrypt();
	}
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值