Vigenre密码使用26个密文字母表,它们依次把明文字母表循环右移0,1,2,……,25位的结果。我们选用一个词组或者短语作为密钥,以密钥字母控制使用哪一个密文字母表。把26个密文字母表排在一起称为Vigenre方阵。由此可知,Vigenre是一个26*26的方阵。
Vigenre密码的代替规则是用明文字母在Vigenre方阵中的列和密钥字母在Vigenre方阵中的行的交点处的字母来代替该明文字母。Vigenre密码的解码操作就是利用Vigenre方阵进行反替代。
下面是用java实现的加密解密算法:
import java.util.Scanner;
public class Vigenre
{
public static void main(String[] args)
{
int temp,i,j,c,ch=0,column=0,row=0,m=0,t=0;
char[] v = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
char[][] v1 = new char[26][26];
char[] vTemp=new char[26];
for (i = 0; i < 26; i++)
{
temp=i;
for (j = 0; j < 26-i; j++)
{
if(temp!=0)
{
for(c=0;c<temp;c++)
{
vTemp[c] = v[c];
}
}
v1[i][j] = v[temp++];
}
c=0;
while(j<26)
{
v1[i][j]=vTemp[c++];
j++;
}
}
Scanner in=new Scanner(System.in);
System.out.println("请输入明文:");
String name=in.nextLine();
System.out.println("输入的明文的是:"+name);
Scanner in1=new Scanner(System.in);
System.out.println("请输入密钥:");
String key=in.nextLine();
System.out.println("输入的密钥是:"+key);
char[] stringM=name.toCharArray();
char[] stringKey=key.toCharArray();
int k=0,d,temp1=0;
for(i=0;i<name.length();i++)
if(stringM[i]==' ')
temp1++;
else
ch++;
char[] secret=new char[stringM.length-temp1+1];
char[] decode=new char[ch];
for(i=0,d=0;i<name.length();i++,d++)
{
if(stringM[i]==' ')
i++;
for(j=0;j<26;j++)
{
if(stringM[i]==v[j])
{
column=j;
break;
}
}
if(stringKey[d]==' ')
d++;
for(j=0;j<26;j++)
{
if(stringKey[d]==v[j])
{
row=j;
break;
}
}
secret[k++]=v1[row][column];
}
System.out.println("加密后的结果是:");
for(i=0;i<secret.length-1;i++)
System.out.print(secret[i]);
System.out.println("\n解密后的结果是:");
for(i=0,k=0;i<stringKey.length;i++)
{
if(stringKey[i]!=' ')
{
for(j=0;j<26;j++)
{
if(stringKey[i]==v[j])
{
m=j;
break;
}
}
for(int n=0;n<26;n++)
{
if(secret[k]==v1[m][n])
{
decode[t++]=v[n];
k++;
break;
}
}
}
}
for(i=0;i<decode.length;i++)
System.out.print(decode[i]);
}
}
以下是运行结果: