python实现Virginia无密钥解密


Posted in Python onMarch 20, 2019

本文实例为大家分享了Virginia无密钥解密的具体代码,供大家参考,具体内容如下

加密

virginia加密是一种多表替换加密方法,通过这种方法,可以有效的解决单表替换中无法应对的字母频度攻击。这种加密方法最重要的就是选取合适的密钥,一旦密钥被公开,保密性也就无从谈起。结合virginia加密原理,给出使用python实现的代码

plainText = "whenigotthethemeithoughtofgooglesartificialintelligencealphagothisprogramoverthebestofhumanplayeriwanttoaskwhenscienceandtechnologycontinuetodevelopwehumanbeingswillbewhatpositionweshouldrealizethatthedevelopmentofscienceandtechnologyisirreversibleanditconstituteaprimaryprductiveforcebutmanmustkeeppacewiththetimestoenhancetheablitytocontrol" # 密文
alphabet = "abcdefghijklmnopqrstuvwxyz" # 26个字母
cipherText = "";
key = "helloworld" # 密钥
keyLen = len(key)
plainTextLen = len(plainText)
j = 0
for i in range(0,plainTextLen):
 j = i%keyLen
 keyNum = alphabet.index(key[j])
 plainNum = alphabet.index(plainText[i])
 plainTemp = alphabet[(keyNum*plainNum)%26] # 密钥对明文作用
 cipherText += plainTemp
print(cipherText)

解密

重点谈谈解密部分。这里的解密主要分为获取密钥长度,根据密钥长度获取密钥,根据密钥获取明文三个部分。

获取密钥长度

使用暴力破解密钥长度的方法,循环遍历可能的密钥长度。每次循环中,记录在这种密钥长度下重复相隔密钥长度密文的次数,从理论上来讲,次数最多的那个密钥长度,最有可能正确。当密文长度足够长时,正确的可能性很高。给出获取密钥长度的python函数代码:

def getKeyLen(cipherText): # 获取密钥长度
 keylength = 1
 maxCount = 0
 for step in range(3,18): # 循环密钥长度
  count = 0
  for i in range(step,len(cipherText)-step):
   if cipherText[i] == cipherText[i+step]: 
     count += 1
  if count>maxCount: # 每次保存最大次数的密钥长度
   maxCount = count 
   keylength = step
 return keylength # 返回密钥长度

获取密钥

当已经获取密钥长度之后,我们可以通过分组将相同密钥作用下的密文进行分组,在每一组中,都是一个简单的单表替换加密。在这种情况下,我们通过重合指数法破解密钥,给出获取密钥部分的python函数代码:

def getKey(text,length): # 获取密钥
 key = [] # 定义空白列表用来存密钥
 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] #获取每组密文
  li = countList(w) 
  powLi = [] #算乘积
  for j in range(26):
   Sum = 0.0
   for k in range(26):
    Sum += alphaRate[k]*li[k]
   powLi.append(Sum)
   li = li[1:]+li[:1]#循环移位
  Abs = 100
  ch = ''
  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

 破解明文

在已知密钥和明文的基础上,我们很容易就可以得到明文,给出python代码:

def virginiaCrack(cipherText): # 解密函数
 length = getKeyLen(cipherText) #得到密钥长度
 key = getKey(cipherText,length) #找到密钥
 keyStr = ''
 for k in key:
  keyStr+=k
 print('the Key is:',keyStr)
 plainText = ''
 index = 0
 for ch in cipherText:
  c = chr((ord(ch)-ord(key[index%length]))%26+97)
  plainText += c
  index+=1
 return plainText # 返回明文

代码

这是解密部分的全部代码,注意需要自己添加密文文件的位置

def virginiaCrack(cipherText): # 解密函数
 length = getKeyLen(cipherText) #得到密钥长度
 key = getKey(cipherText,length) #找到密钥
 keyStr = ''
 for k in key:
  keyStr+=k
 print('the key:',keyStr)
 plainText = ''
 index = 0
 for ch in cipherText:
  c = chr((ord(ch)-ord(key[index%length]))%26+97)
  plainText += c
  index+=1
 return plainText
def openfile(fileName): # 读文件
 file = open(fileName,'r')
 text = file.read()
 file.close();
 text = text.replace('\n','')
 return text

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

def getKey(text,length): # 获取密钥
 key = [] # 定义空白列表用来存密钥
 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] #获取每组密文
  li = countList(w) 
  powLi = [] #算乘积
  for j in range(26):
   Sum = 0.0
   for k in range(26):
    Sum += alphaRate[k]*li[k]
   powLi.append(Sum)
   li = li[1:]+li[:1]#循环移位
  Abs = 100
  ch = ''
  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:
  count = 0
  for ch in lis:
   if ch == c:
    count+=1
  li.append(count/len(lis))
 return li

def textToList(text,length): # 根据密钥长度将密文分组
 textMatrix = []
 row = []
 index = 0
 for ch in text:
  row.append(ch)
  index += 1
  if index % length ==0:
   textMatrix.append(row)
   row = []
 return textMatrix

if __name__ == '__main__':
 cipherText = openfile(r'') # 这里要根据文档目录的不同而改变
 plainText= virginiaCrack(cipherText)
 print('the plainText:\n',plainText)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
python2.7删除文件夹和删除文件代码实例
Dec 18 Python
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 Python
django云端留言板实例详解
Jul 22 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
Oct 14 Python
python模拟哔哩哔哩滑块登入验证的实现
Apr 24 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
详解anaconda安装步骤
Nov 23 Python
PyTorch dropout设置训练和测试模式的实现
May 27 Python
Python OpenCV超详细讲解基本功能
Apr 02 Python
python实现维吉尼亚加密法
Mar 20 #Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 #Python
python实现对输入的密文加密
Mar 20 #Python
python实现字符串加密成纯数字
Mar 19 #Python
python实现简单加密解密机制
Mar 19 #Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 #Python
python异步存储数据详解
Mar 19 #Python
You might like
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
2016/05/17 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
基于python的图片修复程序(实现水印去除)
2018/06/04 Python
pandas带有重复索引操作方法
2018/06/08 Python
python算法题 链表反转详解
2019/07/02 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
python中的测试框架
2020/11/13 Python
C语言开发工程师测试题
2016/12/20 面试题
幼儿园中秋节活动方案2013
2014/01/29 职场文书
书法大赛策划方案
2014/06/04 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
关于运动会的广播稿
2014/09/22 职场文书
整改通知书
2015/04/20 职场文书
工作经历证明范本
2015/06/15 职场文书
2016年端午节寄语
2015/12/04 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技
python套接字socket通信
2022/04/01 Python