密码学—重合指数法Python程序
重合指数(Ic)
计算重合指数就是用来验证在Kasiski测试法中猜测出来的各种密钥长度哪一个才是最接近真实密钥长度的。
计算重合指数步骤
按照Kasiski测试法猜测的密钥长度分组
↓
分好组之后将其每组相同下标的再分一个大组(这里和Vigenere多了一步,Vigenere中不用继续分大组了,只需要拿着每一组给密钥进行遍历加密即可)
↓
分好大组之后现在就是每一个密钥字母就是对应一个大组,这就是多表的意思,每个组为一个凯撒表
↓
统计一个组中每一个字母出现的频率p
↓
所有字母的p2加起来就是这一组的重合指数
↓
所有组都进行这样的操作,然后我的在这里简单猜测密钥长的时候只是将其所有组的重合指数求出来看是否大于0.055,因为这样我可以用肉眼选择到底哪一个是最接近0.065的 (如果要破解的时候假如可能越接近0.065的反而不是密钥长度也有可能,所以我选择了一个大于0.055的就存进去,当然破解的时候用的是另一种,这里只是当时学到的时候想到的一个点子。)
↓
重合指数越接近0.065就代表你猜的密钥越接近真的密钥长度
如果接近越0.038就代表你猜了个屁的密钥长度
这就是使用个重合指数法将其Kasiski猜测的密钥长度进一步进行验证了
实现算法
这里是基于实现了Kasiski猜测中最后一步之后返回的数据。
Kasiski学习移步至该链接→ ❀Kasiski知识点学习❀
最后一步的0.055 <= num:可以自定义参数人为介入修改。
def getIc(self, ch_num):
ciphertext = self.input_text.toPlainText()
length = 0
maybeKeylen = []
for ch in ciphertext:
if ord('A') <= ord(ch) <= ord('Z') or ord('a') <= ord(ch) <= ord('z'):
length += 1
self.outPut_text.clear()
copytext = ''
save_Ic = []
# [['CHR', 5], ['HR', 5]]
for item in ch_num:
dit_A_Z = {} # 保存本行每一个字母出现的次数
Ic = {} # 存放单个字母的重合指数,用密文分组后对应的哪一组的凯撒密码的序号作为键
Ic_p = 0 # 保存最后的重合指数
newdit = {}
for i in range(item[1]):
newdit[i] = []
for i in range(26):
dit_A_Z[i] = 0 # 第一次必须初始化
copytext = self.messGroupByN(ciphertext, item[1]) # 分组,但还没生成一行的凯撒密码
for i in range(len(copytext)): # 将分好组的c密文抽出每一行对应一个加密字母,变成一行的单行凯撒加密
for j in range(item[1]):
if j < len(copytext[i]):
# len(copytext[i])不能修改,因为每次有可能是len(copytext[i])不等于item所以按照len(copytext[i])的长度来防止超出下标
newdit[j].append(ord(copytext[i][j]) - ord('A'))
# 开始统计概率
for row in range(item[1]):
for column in range(len(newdit[row])):
dit_A_Z[newdit[row][column]] += 1
for index in range(26):
p = dit_A_Z[index] / len(newdit[row]) # len(newdit[row])表示row这一行的所有字符长度
Ic_p += p * p
dit_A_Z[index] = 0 # 省掉一次循环,直接用完就回归0,下row计算每个字母的次数
Ic[row] = Ic_p
Ic_p = 0
# 求每组的平均概率,不能以一组来衡量是否是该密钥长度
# 挑出一个复合条件的密钥长度作为参考
num = self.loseTailNum((sum(i for i in Ic.values()) / item[1]), 3) # 只取小数点后三位
if 0.055 <= num:
maybeKeylen.append(item[1]) # 将每一个接近0.065可能的密钥存进去
save_Ic.append(Ic.copy())
return (save_Ic, maybeKeylen)
密码学—重合指数法Python程序的更多相关文章
- 给大家一些改善 Python 程序的 91 个建议
读了一本还不错的书「编写高质量代码改善 Python 程序的 91 个建议」,大多数的建议是真心不错,我虽然写python也有3年多了,但是有些地方确实没去注意过,特地整理了一下,给大家参考. 我已经 ...
- Python程序数据溢出问题或出现 NAN 问题
[数据溢出问题] overflow:溢出 overflow:上溢 underflow:下溢 数据溢出包括上溢和下溢. 上溢可以理解为:你想用一个int类型来保存一个非常非常大的数,而这个超出了int类 ...
- python简介、第一个python程序、变量、字符编码、用户交互程序、if...else、while、for
也愿大家永葆初心-- 已识乾坤大,犹怜草木青. 一.python简介 首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个MP3,编写一个文档等等,而计算 ...
- 编写高质量代码–改善python程序的建议(二)
原文发表在我的博客主页,转载请注明出处! 建议七:利用assert语句来发现问题断言(assert)在很多语言中都存在,它主要为调试程序服务,能够快速方便地检查程序的异常或者发现不恰当的输入等,可防止 ...
- 运行第一个python程序,python 变量,常量,注释
一.运行第一个python程序: print('Hello,world') 保存为.py文件 在cmd窗口: python3x:python py文件路径 回车 python2x:python p ...
- 运行python程序
1 在windows下运行python程序 1)从DOS命令行运行python脚本 用python解释器来执行python脚本,在windows下面python解释器是python.exe,我的pyt ...
- 【python之路2】CMD中执行python程序中文显示乱码
在IDLE中执行下面代码,中文显示正常: # -*- coding:utf-8 -*- st=raw_input("请输入内容")print st 但在CMD中执行e:\hello ...
- Python程序高效地调试
现在我在debug python程序就只是简单在有可能错误的地方print出来看一下,不知道python有没像c++的一些IDE一样有单步调试这类的工具?或者说各位python大神一般是怎么debug ...
- python学习笔记-python程序运行
小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...
- python程序一直在后台运行的解决办法
刚写了个python程序,要一直在后台运行,即使断开ssh进程也在,下面是解决办法: 假如Python程序为test.py 编写shell脚本start.sh #!/bin/bash python t ...
随机推荐
- #排列组合,背包#CF232B Table
题目 有一个 \(n\times m\) 的矩阵,求使得每个 \(n\times n\) 的矩阵中都有正好 \(k\) 个点的方案数. 分析 考虑到如果确定了前 \(n\) 列的选点个数,那么对于一列 ...
- #树形dp#C 树上排列
分析 设\(dp[x][i]\)表示以\(x\)为根的子树中\(x\)的排名为\(i\)的方案数, 然后枚举子节点转移即可,Talk is cheap,Show me the code 代码 #inc ...
- C++ While 和 For 循环:流程控制全解析
C++ Switch 语句 使用 switch 语句选择要执行的多个代码块之一. 语法 switch(expression) { case x: // 代码块 break; case y: // 代码 ...
- Numpy的数组对象
数组对象 NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,从0 开始进行集合中元素的索引:ndarray 对象是用于存放同类型元素的多维数组,其中的每个元 ...
- Cert Manager 申请SSL证书流程及相关概念-二
中英文对照表 英文 英文 - K8S CRD 中文 备注 certificates Certificate 证书 certificates.cert-manager.io/v1 certificate ...
- HDC技术分论坛:ArkCompiler(方舟编译器)原理解析
作者:xianyuqiang 编译器首席架构师 ArkCompiler(方舟编译器)是组件化.可配置的多语言编译和运行平台,它既能支撑单一语言运行环境,也能支撑多种语言组合的运行环境.它目前主要支持的 ...
- 【直播预告】HarmonyOS 极客松赋能直播第六期:产品创新从哪里来?
- GAN的实现和一些问题
GAN的学习是一个二人博弈问题,最终目标是达到纳什平衡.对抗指的是生成网络和判别网络的互相对抗.生成网络尽可能生成逼真样本,判别网络则尽可能去判别该样本是真实样本,还是生成的假样本.示意图如下: 生成 ...
- c# 如何在一般处理程序中返回json
前言 迁移以前的笔记. 正文 无论是一般处理程序,还是其他程序,处理事项,肯定在于HttpResponse. 这种情况就可以操作,至于字符是自己转换还是由HttpResponse中的信息默认转换,都没 ...
- 重新整理数据结构与算法(c#)——算法套路k克鲁斯算法[三十]
前言 这个和前面一节有关系,是这样子的,前面是用顶点作为参照条件,这个是用边作为参照条件. 正文 图解如下: 每次选择最小的边. 但是会遇到一个小问题,就是会构成回路. 比如说第四步中,最小边是CE, ...