维吉尼亚密码破解过程
问题分析
我们从维吉尼亚密码加密方式可以发现,假如密钥的长度为 len_key ,那么明文中第 Xi ,Xi+k ,Xi+2*k,……就是用同一个密码加密,即凯撒密码,所以我们需要先把密钥长度搞出来,而后对每一组进行凯撒密钥的爆破。
利用重合指数攻击破解密钥长度
设一门语言由n个字母组成,每个字母出现的概率为 Pi ,则重合指数是指两个元素随机相同的概率之和,记作 CI =∑ Pi2 (1<= i <= n);
经分析,英文中,一段文字是随机的话,CI =0.0385 ;如果这段文字是有意义的,那么 CI=0.065 (约等)。实际上计算的CI应该用这个公式:
L:密文长度; fi :在密文中的出现次数。
这个的好处就是用我们猜测的密钥长度来进行分组,分别计算每组的CI,再求个平均,计算当前密钥长度下,CI 的值与0.065相差多少。然后按照最接近0.065的密钥长度进行排序,为了提高解密的成功率,我取前10个较为接近的密钥长度作为猜测,实验代码如下:
维吉尼亚密码加解密算法的python3实现
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 25 21:11:29 2019
@author: ZHANGJIAHAO
"""
def encrypt(message,key):
#message=message.lower()
key=key.lower()
cipher=''
non_alpha_count=0
for i in range(len(message)):
if message[i].isalpha():
if message[i].isupper():
offset=ord(key[(i-non_alpha_count)%len(key)])-ord('A')
cipher+=chr((ord(message[i])-ord('A')+offset)%26+ord('A'))
else:
offset=ord(key[(i-non_alpha_count)%len(key)])-ord('a')
cipher+=chr((ord(message[i])-ord('a')+offset)%26+ord('a'))
else:
cipher+=message[i]
non_alpha_count+=1
return cipher
def decrypt(ci,key):
#message=message.lower()
key=key.lower()
cipher=''
non_alpha_count=0
for i in range(len(ci)):
if ci[i].isalpha():
if ci[i].isupper():
offset=ord(key[(i-non_alpha_count)%len(key)])-ord('A')
cipher+=chr((ord(ci[i])-ord('A')-offset)%26+ord('A'))
else:
offset=ord(key[(i-non_alpha_count)%len(key)])-ord('a')
cipher+=chr((