维吉尼亚密码破解过程

问题分析

我们从维吉尼亚密码加密方式可以发现,假如密钥的长度为 len_key ,那么明文中第 Xi ,Xi+k ,Xi+2*k,……就是用同一个密码加密,即凯撒密码,所以我们需要先把密钥长度搞出来,而后对每一组进行凯撒密钥的爆破。

利用重合指数攻击破解密钥长度

设一门语言由n个字母组成,每个字母出现的概率为 Pi ,则重合指数是指两个元素随机相同的概率之和,记作 CI =∑ Pi2 (1<= i <= n);

经分析,英文中,一段文字是随机的话,CI =0.0385 ;如果这段文字是有意义的,那么 CI=0.065 (约等)。实际上计算的CI应该用这个公式:

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((ord
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值