重合指数(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. #dp#CodeChef Little Elephant and Mouses

    LEMOUSE 分析 由于被单只老鼠吓到只能算一次,所以前两次走的位置也可能会被老鼠吓到. 设 \(dp[n][m][o][p]\) 表示走到 \((n,m)\) 上一步走的是 \(o\) 这种方式, ...

  2. C# 报错 Lc.exe已退出 代码为-1 如何解决

    完美解决方案:把项目文件夹下Properties文件夹下的licenses.licx文件删除,重新编译即可:

  3. Java:使用POI和泛型生成excel表格

    首先创建一个maven项目,导入POI依赖包 <dependency> <groupId>org.apache.poi</groupId> <artifact ...

  4. Pytorch-卷积神经网络CNN之ResNet的Pytorch代码实现

    先说一个小知识,助于理解代码中各个层之间维度是怎么变换的. 卷积函数:一般只用来改变输入数据的维度,例如3维到16维. Conv2d() Conv2d(in_channels:int,out_chan ...

  5. vue中img标签图片 加载时 与 加载失败 的处理方法

    开发过程中经常需要和图片处理打交道,看了网上很多有关图片处理的方法,都是讲解得一知半解,没有比较全面的总结.下面,将简单总结一个我们通过vue去处理img标签过程中,图片加载时,与图片加载失败时的处理 ...

  6. 【NOIP2013模拟联考8】匹配(match) 题解

    B 组都说看不懂--我也解释不清啊--只能写这么详细了 其实就是道板题 省流:f[i][s][j]表示字符串长度i,匹配情况s,ac自动机节点j Problem Description 给定k个字符串 ...

  7. 力扣598(java)-范围求和Ⅱ(简单)

    题目: 给你一个 m x n 的矩阵 M ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= ...

  8. 牛客网-SQL专项训练18

    ①在下列sql语句错误的是?B 解析: 在sql中若要取得NULL,则必须通过IS NULL或者IS NOT NULL进行获取,无法直接使用等号. 一个等号(=)表示把1赋值给变量啊 ==:称为等值符 ...

  9. 连续两年入选Gartner公共云容器,阿里云在边缘容器方面做了什么?

    最近,Gartner发布了2020年公共云容器报告,阿里云连续两年成为唯一入选的中国企业.报告显示,阿里云容器服务在中国市场表现强劲,产品形态丰富,在 Serverless 容器.服务网格.安全沙箱容 ...

  10. 居然之家:核心业务系统全面上云,采用PolarDB替代传统商业数据库

    ​简介: 国内家居零售龙头企业居然之家完成7大核心业务系统全面上云工作,并实现ERP等核心业务系统从传统商业数据库向阿里云PolarDB云数据库的替换,助力业务系统整体处理能力提升50%以上,弹性能力 ...