如何计算维吉尼亚密码?Java实现维吉尼亚密码的加密解密算法

如何计算维吉尼亚密码?

计算维吉尼亚密码有2种方式,一种是根据密码表查找,另一种是手动计算方法。
1.密码表查找法
第一行是密钥,第一列是明文,某明文对应密钥加密产生的密文即为该行该列处的字母。
比如:明文是I LOVE YOU,密钥是KEY
那么对应的查询关系就是
在这里插入图片描述

在这里插入图片描述
2.手动计算方法
用数字0-25代替字母A-Z,需要特别注意的是第一个字母是从0开始编号的。要是从1开始计算,得到的结果肯定是错误的。还有就是·编号相加之后数值大于等于26,我们都要将这个数据对26做模运算才行。
则可以有以下计算过程
在这里插入图片描述

Java实现加密算法

package encryption;
import java.util.Scanner;

public class encryption {
	public static void main(String[] args){
	//读取键盘输入值
	Scanner sc1 = new Scanner(System.in);
	System.out.println("请输入明文");
	Scanner sc2= new Scanner(System.in);
	System.out.println("请输入密钥");
	//将读取的明文的赋给m,将读取的密钥赋给k
	String m=sc1.nextLine();
	String k=sc1.nextLine();
	char[] result=new char[50];
	
//  测试使用		
//	String m="iloveyou";
//	String k="key";
	
	
//	System.out.println(m.charAt(0));
//  运行结果是i
//	System.out.println(m.charAt(0)-'a');
//  运行结果是8,也就是字符i与a之间差的位数
//	System.out.println((char)(m.charAt(0)-'a'+97));
//  如果不加97强制转换成char类型会产生乱码
//	System.out.println((char)(((m.charAt(1)-'a'+k.charAt(1)-'a')%26)+97));

	//加密算法
	//java.lang.String.charAt() 方法返回指定索引处的char值
	int j=0,z=0;
	for(int i=0;i<m.length();i++)//在明文长度内循环
	{
		if(m.charAt(i)>='a' && m.charAt(i)<= 'z')  //默认输入为小写字母
			result[z]=(char)(((m.charAt(i)-'a'+k.charAt(j)-'a')%26)+97);	
		else								//大写字母
			result[z]=(char)(((m.charAt(i)-'A'+k.charAt(j)-'a')%26)+65);
		j++;
		if(j>=k.length()) j=0;//以密钥长度为一个周期循环
		z++;
	}
	
	System.out.println(result);
	}
}

运行结果为:
在这里插入图片描述

Java实现解密算法

package encryption;

import java.util.Scanner;

public class decrypt {
	public static void main(String[] args){
		//读取键盘输入值
		Scanner sc1 = new Scanner(System.in);
		System.out.println("请输入密文");
		Scanner sc2= new Scanner(System.in);
		System.out.println("请输入密钥");
		//将读取的明文的赋给m,将读取的密钥赋给k
		String m=sc1.nextLine();
		String k=sc1.nextLine();
		char[] result=new char[50];

		//加密算法
		//java.lang.String.charAt() 方法返回指定索引处的char值
		int j=0,z=0;
		for(int i=0;i<m.length();i++)//在明文长度内循环
		{
			if(m.charAt(i)>='a' && m.charAt(i)<= 'z')  //默认输入为小写字母
				result[z]=(char)(((m.charAt(i)-'a'-(k.charAt(j)-'a')+26)%26)+97);	
			else								//大写字母
				result[z]=(char)(((m.charAt(i)-'A'-(k.charAt(j)-'a')+26)%26)+65);
			j++;
			if(j>=k.length()) j=0;//以密钥长度为一个周期循环
			z++;
		}
		
		System.out.println(result);
		}

}

运行结果

在这里插入图片描述

参考博客

强制转成char类型为什么会出现乱码(为什么要加97)
c语言实现维吉尼亚加解密算法
Java中charAt()的用法