Vigenere密码的唯密文攻击暴力破解(python实现)

2023-11-01 13:50

本文主要是介绍Vigenere密码的唯密文攻击暴力破解(python实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、找到最可能的密钥长度

在不知道密钥的情况下破解,首先要猜测密钥长度,这是非常重要的一个环节。

书上写的是kasiski测试法重合指数法

这里使用到的不是课本上的,而是代码实现中用到的一种方法:移位法(暂且称之为移位法)

原理:

我们都知道vigenere密码是多表循环加密实现的,在这里假设密钥长度是d,那么第1,1+d,....,1+k*d都是同一个密钥字母加密的,那么如果第i和第i+d*n个字母相同的话,他们的密文一定是一样的。

所以我们可以利用这个事实,来进行概率推测,我们假设密钥长度是3~15,我们从密钥长度为3开始测试:

从第0个字符开始,对每个字符(i)判断,如果该字符与相隔密钥长度(我们猜想的)的字符(i+3)一样,那么我们可以认为,这两个字符在一定程度上明文也是匹配的,可以把这个匹配个数记下来,进行累加。(这里不用计算重合指数,代码实现起来比较快,正确率也是很高的

重复测试直到密钥长度15,每次都会计算出一个匹配最大值,我们取最后的匹配量最大的密钥长度,很有可能是我们的密钥长度。

下面给出图示,来清晰下这个过程:

下面给出代码实现:

def getKeyLen(cipherText): # 获取密钥长度keylength = 1maxCount = 0for step in range(3,10): # 循环密钥长度count = 0for i in range(len(cipherText)-step): #range(step,len(cipherText)-step):if cipherText[i] == cipherText[i+step]:count += 1if count>maxCount:maxCount = countkeylength = stepreturn keylength

二、找到最可能的匹配密钥

寻找密钥是使用的是交互重合指数法

在得到密钥长度之后,就要实现对密钥字母的匹配了。

我们知道密钥长度(k)之后,那么将密文分成n个组(每组包含k个字符),那么每个分组中的第i个字符,都是使用同一个密钥字母进行加密的,那么现在所有分组第i个字符就是一个单表加密的实现,故,他的每组中字母频率,只是明文字母频率的一个转换(shift)。

字母频率也会是这样的一个转换,但是我们实际上是不可能得到明文的频率分布的,(不然还破解个?2?)

这里只是清晰下思路。

现在我们可以来计算明文和所有分组用同一密钥字母加密的密文的交互重合指数(两个都随机取一个字母相同的概率)

\sum_{h=0}^{25}P_{h-ki}P_{h-kj}=\sum_{h=0}^{25}P_{h}P_{h+ki-kj}=\sum_{h=0}^{25}P_{h}P_{h-l}    注:l为密文与明文的相对位移

这个式子表示一段文本中第i个字符和另一段文本中第j个字符同为26个字母中第h个字母的概率,由于26个字母的概率我们是知道的,也就是P_{h},式子就变成了:     [已知的字母概率]  *  [密文字母概率](也就是相对位移l后的字母概率)

很显然,我们的密文字母概率是可以统计出来的。

如果我们此时我们存在相对位移的话,也就是说没有找对正确的密钥字母时,这时候交互重合指数的数值是在[0.031,0.045]之间浮动的;当不存在相对位移时,也就是说相对位移为0时,这时候这个数值会比较接近0.065.

但是这个0.065是在大量大量大量英文中找到的一个普遍水平,我们随便找的文本,可以说是不可能达到0.065的水平。

所以我们只需要取最接近0.065的那个相对位移值(0~25),其对应的字母就是我们的密钥第一个字母。

其他密钥字母如是。

下面给出代码实现:

def getKey(text,length): # 获取密钥key = [] # 定义空白列表用来存密钥#已知的字母出现概率alphaRate = [0.082, 0.015,0.028,0.043,0.127,0.022,0.02,0.061,0.07,0.002,0.008,0.04,0.024,0.067,0.075,0.019,0.001,0.06,0.063,0.091,0.028,0.01,0.023,0.001,0.02,0.001]
#更准确的概率,使用一个就ok#alphaRate =[0.08167,0.01492,0.02782,0.04253,0.12705,0.02228,0.02015,0.06094,0.06996,0.00153,0.00772,0.04025,0.02406,0.06749,0.07507,0.01929,0.0009,0.05987,0.06327,0.09056,0.02758,0.00978,0.02360,0.0015,0.01974,0.00074]matrix =textToList(text,length)   #将明文按照密钥长度分组成二位列表for i in range(length):w = [row[i] for row in matrix] #获取每组密文中第i位的密文    这都是用同一个字母加密的li = countList(w)    #计算里面的字母频率powLi = [] #交互重合指数for j in range(26):Sum = 0.00000for k in range(26):Sum += alphaRate[k]*li[k]  #   Ic的值Sum[k] += alphaRate[k]*li[k+j] 的话  就不用后面的切片操作powLi.append(Sum)li = li[1:]+li[:1]#循环移位 向左移一位   Abs = 1ch = ''for j in range(len(powLi)):if abs(powLi[j] -0.065546)<Abs: # 找出最接近英文字母重合指数的项Abs = abs(powLi[j] -0.065546) # 保存最接近的距离,作为下次比较的基准ch = chr(j+97)key.append(ch)return key#用到的两个子函数
def countList(lis): # 统计字母频率li = []alphabet = [chr(i) for i in range(97,123)]  //生成小写字母表for c in alphabet:   统计26个字母的出现概率count = 0for ch in lis:if ch == c:count+=1li.append(count/len(lis))return li        #返回字母表每个字母的出现概率def textToList(text,length): # 根据密钥长度将密文分组textMatrix = []   #二维表  里面添加分组数个分组  每个分组中都是按照密钥加密的row = []     #行  = 分组   每个row都是按照密钥逐一加密的   每个row长度为密钥的元素个数index = 0    #从0开始for ch in text:row.append(ch)index += 1if index % length ==0:   #一组完成后,加入二维表textMatrix.append(row)row = []return textMatrix

三、密文还原为明文 

因为我们的密钥是重复使用的,所以在还原时,需要不断根据密文字母的位置对密钥长度取余,判断使用密钥的哪个字母。

plainText = ''
index = 0
for ch in cipherText:c = chr((ord(ch)-ord(key[index%length])+26)%26+97)  #字母的ascii值与对该位置加密的密钥字母,相对位移plainText += cindex+=1

至此,我们就已经完成了vigenere的 唯密文破解。

 

 

 

前面的代码已经很完善了,如果还有不明白的,这里附上完整源码<传送门>。

附:图源水印

加油加油加油啊~

不要辜负大好年华!

这篇关于Vigenere密码的唯密文攻击暴力破解(python实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/323449

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1