Vigenere加密法原理很简单,实现起来也不难。与普通的单码加密法不同,明文经过加密之后,每个字母出现的频率就不会有高峰和低峰。
密钥中字母代表行和明文中的字母代表行。在vigenere表中找到对应的字母即可。当明文的长度大于密钥的长度的时候,密钥重复使用。下面是go语言的实现版本。

vigenege表
var arr [27][27]int //Vigenere表var key string = "hold" //密钥 //初始化vigenere表 func init() { arr[0][0] = 0 for i := 0; i < 2; i++ { for j := 1; j < 27; j++ { arr[i][j] = 'a' + j - 1 } } for i := 1; i < 27; i++ { arr[i][0] = 'a' + i - 1 } var num int = 0 for i := 26; i > 0; i-- { for j := 2; j < 27; j++ { arr[j][i] = 'a' + num num++ if num%26 == 0 { num = 0 } } } }
//进行加密 func encrypt(str string) []byte { count := 0 var ciphertext []byte = []byte(str) length := len(key) for i := 0; i < len(str); i++ { ciphertext[i] = byte(arr[str[i]-'a'+1][key[count]-'a'+1]) count++ count %= length } return ciphertext }
在很长的一段时间内Vigenere加密法一直被认为是无法破解的。我们可以通过IC(index of coincidence)值来得到密钥的长度。这里还要用到MR(measure of roughness)。当所有字母都均匀分布,那么选取每个字母的概率都相同。为1/26。那么从一段密文中选取某个字母的概率与均匀分布的概率偏差为

MR就是a-z中所有的字母的偏差的和。

展开后在进行一些简单的计算可以得到

在MR中唯一依赖密文的地方就是
。其值为密文中 i 单词出现的次数与密文长度的比值。那么
和IC为


知道了IC值之后,我们可以用IC值,当IC值在0.038与0.066之间时。则表示采用了多码加密法。但我们任然无法准确的得到密钥的长度。1863年Kasisk

