重合指数(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. #网络流,dinic,最小割#洛谷 3227 [HNOI2013]切糕

    题目传送门 题目大意 \(P\)行\(Q\)列的楼房高度均为\(R\),每一层改造要花费一定的金钱, 每个楼房都要挑选有且仅有一层进行改造,并且相邻两个楼房改造位置的相对高度不能超过\(D\), 问最 ...

  2. Lustre架构介绍的阅读笔记-基础知识

    本文是在阅读Introduction to Lustre* Architecture的如下章节时的笔记. Lustre – Fast, Scalable Storage for HPC Lustre ...

  3. JDK 14的新特性:switch表达式

    目录 简介 写在前面 连写case switch返回值 yield 总结 简介 switch的新特性可是源远流长,早在JDK 12就以预览功能被引入了,最终在JDK 14成为了正式版本的功能:JEP ...

  4. OpenHarmony技术挑战课题征集

    OpenHarmony技术挑战课题征集 OpenAtom OpenHarmony(以下简称"OpenHarmony")是由开放原子开源基金会(OpenAtom Foundation ...

  5. IDEA Tab键设置为4个空格

    在不同的编辑器里 Tab 的长度可能会不一致,这会导致有 Tab 的代码,用不同的编辑器打开时,格式可能会乱. 而且代码压缩时,空格会有更好的压缩率. 所以建议将 IDEA 的 Tab 键设置为 4 ...

  6. 【FAQ】调用应用内支付SDK时报错,如何用tag对问题进行排查和分析

    华为应用内支付服务(In-App Purchases,IAP)为开发者提供便捷的应用内支付体验和简便的接入流程.开发者的应用集成IAP SDK后,调用IAP SDK接口,启动IAP收银台,即可实现应用 ...

  7. Linux:vscode扩展无法下载,报错:Error while fetching extensions : XHR failed

    在Linux系统上下载安装好vscode以后,发现扩展里面无法下载安装,报错:Error while fetching extensions : XHR failed 解决办法:修改 hosts 文件 ...

  8. Qt调用系统DLL,判断网络连接状态

    *: Win32 网络连接 dll 文件名叫:wininet.dll,位置在 C:\WINDOWS\system32 目录下,将 其拷贝到项目工程下. #include <QLibrary> ...

  9. 鸿蒙智联生态产品《接入智慧生活App开发指导》(官方更新版)

    原文:https://mp.weixin.qq.com/s/BDC-12aiZz2EhtjYLR7QIg,点击链接查看更多技术内容. 在HarmonyOS Connect生态产品应用开发过程中,很多开 ...

  10. pid算法函数实现,c语言版

    #include <stdio.h> float pid(float setpoint, float process_variable, float kp, float ki, float ...