Vigenere加密

 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

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信