重合指数(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程序的更多相关文章

  1. 给大家一些改善 Python 程序的 91 个建议

    读了一本还不错的书「编写高质量代码改善 Python 程序的 91 个建议」,大多数的建议是真心不错,我虽然写python也有3年多了,但是有些地方确实没去注意过,特地整理了一下,给大家参考. 我已经 ...

  2. Python程序数据溢出问题或出现 NAN 问题

    [数据溢出问题] overflow:溢出 overflow:上溢 underflow:下溢 数据溢出包括上溢和下溢. 上溢可以理解为:你想用一个int类型来保存一个非常非常大的数,而这个超出了int类 ...

  3. python简介、第一个python程序、变量、字符编码、用户交互程序、if...else、while、for

    也愿大家永葆初心-- 已识乾坤大,犹怜草木青. 一.python简介 首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个MP3,编写一个文档等等,而计算 ...

  4. 编写高质量代码–改善python程序的建议(二)

    原文发表在我的博客主页,转载请注明出处! 建议七:利用assert语句来发现问题断言(assert)在很多语言中都存在,它主要为调试程序服务,能够快速方便地检查程序的异常或者发现不恰当的输入等,可防止 ...

  5. 运行第一个python程序,python 变量,常量,注释

    一.运行第一个python程序: print('Hello,world') 保存为.py文件 在cmd窗口: python3x:python  py文件路径 回车 python2x:python  p ...

  6. 运行python程序

    1 在windows下运行python程序 1)从DOS命令行运行python脚本 用python解释器来执行python脚本,在windows下面python解释器是python.exe,我的pyt ...

  7. 【python之路2】CMD中执行python程序中文显示乱码

    在IDLE中执行下面代码,中文显示正常: # -*- coding:utf-8 -*- st=raw_input("请输入内容")print st 但在CMD中执行e:\hello ...

  8. Python程序高效地调试

    现在我在debug python程序就只是简单在有可能错误的地方print出来看一下,不知道python有没像c++的一些IDE一样有单步调试这类的工具?或者说各位python大神一般是怎么debug ...

  9. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  10. python程序一直在后台运行的解决办法

    刚写了个python程序,要一直在后台运行,即使断开ssh进程也在,下面是解决办法: 假如Python程序为test.py 编写shell脚本start.sh #!/bin/bash python t ...

随机推荐

  1. vue element序号翻页连续排序

    type="index" :index="indexMethod" // 序号翻页连续排序 indexMethod(index) { return (this. ...

  2. openGauss中如何管理表空间

    openGauss 中如何管理表空间 在 openGauss 中,表空间是一个目录,在物理数据和逻辑数据间提供了抽象的一层,为所有的数据库对象分配存储空间,里面存储的是它所包含的数据库的各种物理文件. ...

  3. SQL 转置计算

    转置即旋转数据表的横纵方向,常用来改变数据布局,以便用新的角度观察.有些转置算法比较简单,比如行转列.列转行.双向转置:有些算法变化较多,比如动态转置.转置时跨行计算.关联转置等.这些转置算法对日常工 ...

  4. 操作流程分享:HDMI输入SIL9293C配套NR-9 2AR-18的国产GOWIN开发板

    1. 产品概述 HDMI 输入配套板是用于 GOWIN NR-9 和 2AR-18 的开发板配套的 HDMI 输出板子.最 大分辨率支持 1920*1080P,60Hz 刷新率,24 位 RGB 色彩 ...

  5. Faiss 向量库编译安装

    Faiss 是 Facebook 开源的一套高效相似性搜索以及向量聚类的开发库,支持各类相似性搜索的算法,Faiss 项目本身是使用 C++ 编写的,但是提供 Python 的绑定,可以直接使用 nu ...

  6. MyBatis 核心配置讲解(上)

    大家好,我是王有志,一个分享硬核 Java 技术的互金摸鱼侠. 前两篇的文章中我们分别介绍了 MyBatis 和 MyBaits 的应用组成,到这里基础篇的内容就结束了. 从今天开始,我们正式进入 M ...

  7. 一文搞懂传统单节点网站的 Serverless 上云

    简介: 阿里云函数计算 FC 是事件驱动的全托管计算服务,真正的无需去考虑服务器的运维管理,只需要完成开发的代码进行上传,函数计算会通过角色策略去规划计算资源,弹性的方式执行函数,最后高效的执行部署. ...

  8. 新型DDoS来袭 | 基于STUN协议的DDoS反射攻击分析

    简介: 作为新型反射类型,目前仍存绕过防御可能性. 阿里云安全近期发现利用STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)服务发起的DDoS反 ...

  9. [Docker] 假如宿主机 Nginx 代理到 Docker 的 PHP

    其实没有多少区别,同样 php 镜像启动服务暴露一个端口,nginx 的 proxy_pass 代理过去,唯一要注意的是 nginx 配置的项目路径. nginx 配置的 root 是本地项目路径,给 ...

  10. WPF 使用 ManipulationDemo 工具辅助调试设备触摸失效问题

    本文将和大家介绍我所在的团队开源的 ManipulationDemo 工具.通过 ManipulationDemo 工具可以提升调试设备触摸失效的效率 此工具在 GitHub 上完全开源,请看 htt ...