维吉利亚密码
在一个凯撒密码中,字母表中的每一字母都会作一定的偏移,例如偏移量为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;
}
}