淺析Vigenere加密算法的Java實(shí)現(xiàn)

Vigenere加密算法是多表代換密碼中的一種,其思想是:明文的每個(gè)字母使用不同k的凱撒加密。

我們可以構(gòu)造一個(gè)維吉尼亞密碼表的矩陣,最左邊為密鑰字母,最上面為明文,加密過(guò)程很簡(jiǎn)單:給定密鑰字母x和明文字母y,密文字母為位于x行和y列的字母。

其實(shí),如果假設(shè)能被加密的字符有N個(gè),如果把這N個(gè)字符建成一個(gè)環(huán), 那么加密過(guò)程就是模N的過(guò)程,即,C(i)=(K(i)+P(i))modN,其中K、C、P分別代表的是密鑰空間、密文空間、消息(明文)空間。

根據(jù)維吉尼亞密碼算法,編寫相應(yīng)Java程序:

public class Vigenere {

/**大寫字母表**/
static String alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

/**
* 處理密鑰
* @param str 字符串
* @param K 密鑰
* @return 與str長(zhǎng)度相等的密鑰字符串
*/
public static String dealK(String str,String K){
K=K.toUpperCase();// 將密鑰轉(zhuǎn)換成大寫
K=K.replaceAll("[^A-Z]", "");//去除所有非字母的字符
StringBuilder sb=new StringBuilder(K);
String key="";
if(sb.length()!=str.length()){
//如果密鑰長(zhǎng)度與str不同,則需要生成密鑰字符串
if(sb.length()<str.length()){
//如果密鑰長(zhǎng)度比str短,則以不斷重復(fù)密鑰的方式生成密鑰字符串
while(sb.length()<str.length()){
sb.append(K);
}
}
//此時(shí),密鑰字符串的長(zhǎng)度大于或等于str長(zhǎng)度
//將密鑰字符串截取為與str等長(zhǎng)的字符串
key=sb.substring(0, str.length());
}
return key;
}

/**
* 根據(jù)vigenere密碼算法對(duì)明文進(jìn)行加密
* @param P 明文
* @param K 密鑰
* @return 密文
*/
public static String encrypt(String P,String K){
P=P.toUpperCase();// 將明文轉(zhuǎn)換成大寫
P=P.replaceAll("[^A-Z]", "");//去除所有非字母的字符
K=dealK(P,K);
int len=K.length();
StringBuilder sb=new StringBuilder();
for(int i=0;i<len;i++){
int row=alpha.indexOf(K.charAt(i));//行號(hào)
int col=alpha.indexOf(P.charAt(i));//列號(hào)
int index=(row+col)%26;
sb.append(alpha.charAt(index));
}
return sb.toString();
}

/**
* 根據(jù)vigenere密碼算法對(duì)密文進(jìn)行解密
* @param C 密文
* @param K 密鑰
* @return 明文
*/
public static String decrypt(String C,String K){
C=C.toUpperCase();// 將密文轉(zhuǎn)換成大寫
C=C.replaceAll("[^A-Z]", "");//去除所有非字母的字符
K=dealK(C,K);
int len=K.length();
StringBuilder sb=new StringBuilder();
for(int i=0;i<len;i++){
int row=alpha.indexOf(K.charAt(i));//行號(hào)
int col=alpha.indexOf(C.charAt(i));//列號(hào)
int index;
if(row>col){
index=col+26-row;
}else{
index=col-row;
}
sb.append(alpha.charAt(index));
}
return sb.toString();
}

public static void main(String args[]){
String P="explanation";
String K="leg";
String C=encrypt(P,K);
System.out.println("密文:"+C);
System.out.println("明文:"+decrypt(C,K));
}

}

運(yùn)行程序,結(jié)果如下:
密文:PBVWETLXOZR
明文:EXPLANATION