维吉尼亚加密方法是多表代换加密的一种。将明文按照密钥长度分组,一组中每个明文都对应了一个密钥字符,也就是说,一组中的每个明文都对应一个自己的代换表。而加密的一方可以选择自己的密钥长度和字符,也就是每组的密钥行向量。
K=(k0,k1,k2,...,k(n-1)) 共n个字符
加密过程:
首先将明文按照密钥的长度分成若干个明文组。而其中的一个明文组我们可以写作:
M=(m0,m1,m2,...,m(n-1)) n为密钥长度
以密钥字符为行坐标,明文字符为列坐标,通过查表找到对应的密文字符。
插图,表
注:字符a~z可以转换成0~25的数字。
通过数字的运算我们有一种更快捷的方法来得到密文。观察维吉尼亚表,我们可以得到一个规律:密文C(k,m)=k+m (mod 26)。而明文长度要按照密钥长度分组,在密钥长度为n的情况下,可以得到Ci=k(i mod n) +m (mod 26)。
以下是算法的实现,当然还有更优解:
/**
* @author asouwn
* @param M 明文串(小写)
* @param k 密钥串(小写)
* @return 密文串
*/
public char []ver(char []M,char []k){
char []C=new char[M.length];
for (int i=0;i<M.length;i++){
int a=(int) M[i]+(int) k[i%k.length]-2*(int) 'a';
a=a%26+'a';
C[i]=(char) a;
}
return C;
}