JAVA实现维吉利亚密码加密解密

维吉利亚密码

在这里插入图片描述

在一个凯撒密码中,字母表中的每一字母都会作一定的偏移,例如偏移量为3时,A就转换为了D、B转换为了E……而维吉尼亚密码则是由一些偏移量不同的恺撒密码组成。
为了生成密码,需要使用表格法。这一表格(如图1所示)包括了26行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进行的,在过程中会不断地变换。
在这里插入图片描述
例如,假设明文为:
ATTACKATDAWN
选择某一关键词并重复而得到密钥,如关键词为LEMON时,密钥为:
LEMONLEMONLE
对于明文的第一个字母A,对应密钥的第一个字母L,于是使用表格中L行字母表进行加密,得到密文第一个字母L。类似地,明文第二个字母为T,在表格中使用对应的E行进行加密,得到密文第二个字母X。以此类推,可以得到:
明文:ATTACKATDAWN密钥:LEMONLEMONLE密文:LXFOPVEFRNHR
解密的过程则与加密相反。例如:根据密钥第一个字母L所对应的L行字母表,发现密文第一个字母L位于A列,因而明文第一个字母为A。密钥第二个字母E对应E行字母表,而密文第二个字母X位于此行T列,因而明文第二个字母为T。以此类推便可得到明文。
用数字0-25代替字母A-Z,维吉尼亚密码的加密文法可以写成同余的形式:
在这里插入图片描述
解密方法则能写成:
在这里插入图片描述
---------------------------------来自百度------------------------------------------

package cryptology;
import java.util.Scanner;
public class vigenere {
public static void main(String []args)
{
	int stop=1;
	System.out.println("*******************************Vigenere**********************************");
	System.out.println("                            Vigenere密码加解密                                                                                   ");
	System.out.println("加密:0");
	System.out.println("解密:1");
	System.out.println("*******************************Vigenere**********************************");
	while(stop==1)
	{
		String text;
		String key;
		int[]mediume=new int [100000];
		int base=97;
		int M;
	   System.out.println("Please select 加密 or 解密:");
	   int select;
	   Scanner input0=new Scanner(System.in);
	   select=input0.nextInt();
	   System.out.println("Please input your text:");
	   Scanner input=new Scanner(System.in);
	      text=input.nextLine();
	   System.out.println("Please input your key:");  
	      Scanner input1=new Scanner(System.in);
		   key=input1.nextLine();
		   if(text.charAt(0)<97)
			   base=65;
		   if(select==0)
			   M=encrypt(text,key,mediume,base);
		   else
			   M=decode(text,key,mediume,base);
		   System.out.println("Please select daxiezimu or xiaoxiezimu ,press(0/1):");
		   Scanner input2=new Scanner(System.in);
		   select=input2.nextInt();
		   if(select==0)
			   base=65;
		   else base=97;
		   for(int j=0;j<M;j++)
		   {
			   char A=(char) ((char)mediume[j]+base);
			   System.out.print(A);
		   }
		   
		   System.out.println("\npress 1 to continue,press 0 to stop:");
			Scanner input4=new Scanner(System.in);
		   stop=input4.nextInt();
		}
	}
public static int encrypt(String text,String key,int []medium,int base)
{
	int k=0;int keypoint=0;
	for(int i=0;i<text.length();i++)
	{
		if(text.charAt(i)==' ')
		continue;
		keypoint=k%key.length();
		medium[k++]=(text.charAt(i)-base+key.charAt(keypoint)-97)%26;
	}
	return k;
}
public static int decode(String text,String key,int []medium,int base)
{
	int k=0;int keypoint=0;
	for(int i=0;i<text.length();i++)
	{
		if(text.charAt(i)==' ')
		continue;
		keypoint=k%key.length();
		medium[k++]=(text.charAt(i)-base-key.charAt(keypoint)+97+26)%26;
	}
	return k;
}
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值