如何计算维吉尼亚密码?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()的用法

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java实现维吉尼亚密码解密算法的完整源码: ```java import java.util.Scanner; public class VigenereCipher { private static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取明文和密钥 System.out.print("请输入明文:"); String plainText = scanner.nextLine().toUpperCase(); System.out.print("请输入密钥:"); String key = scanner.nextLine().toUpperCase(); // 加密 String cipherText = encrypt(plainText, key); System.out.println("加密后的密文为:" + cipherText); // 解密 String decryptedText = decrypt(cipherText, key); System.out.println("解密后的明文为:" + decryptedText); scanner.close(); } /** * 维吉尼亚密码加密 * * @param plainText 明文 * @param key 密钥 * @return 密文 */ public static String encrypt(String plainText, String key) { StringBuilder cipherText = new StringBuilder(); int keyIndex = 0; for (char c : plainText.toCharArray()) { if (Character.isLetter(c)) { int plainTextIndex = ALPHABET.indexOf(c); int keyCharIndex = ALPHABET.indexOf(key.charAt(keyIndex)); int cipherTextIndex = (plainTextIndex + keyCharIndex) % ALPHABET.length(); cipherText.append(ALPHABET.charAt(cipherTextIndex)); keyIndex = ++keyIndex % key.length(); } else { cipherText.append(c); } } return cipherText.toString(); } /** * 维吉尼亚密码解密 * * @param cipherText 密文 * @param key 密钥 * @return 明文 */ public static String decrypt(String cipherText, String key) { StringBuilder plainText = new StringBuilder(); int keyIndex = 0; for (char c : cipherText.toCharArray()) { if (Character.isLetter(c)) { int cipherTextIndex = ALPHABET.indexOf(c); int keyCharIndex = ALPHABET.indexOf(key.charAt(keyIndex)); int plainTextIndex = (cipherTextIndex - keyCharIndex + ALPHABET.length()) % ALPHABET.length(); plainText.append(ALPHABET.charAt(plainTextIndex)); keyIndex = ++keyIndex % key.length(); } else { plainText.append(c); } } return plainText.toString(); } } ``` 使用时,只需在主函数中调用 `encrypt` 和 `decrypt` 方法即可。注意,这里使用的是大写字母表,如果要支持小写字母,可以在字母表中添加小写字母即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值