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 相关文章推荐
推荐下python/ironpython:从入门到精通
Oct 02 Python
Python通过select实现异步IO的方法
Jun 04 Python
python爬虫入门教程--正则表达式完全指南(五)
May 25 Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 Python
numpy中实现二维数组按照某列、某行排序的方法
Apr 04 Python
python调用OpenCV实现人脸识别功能
May 25 Python
python获取地震信息 微信实时推送
Jun 18 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
Jul 22 Python
Python使用Pandas读写Excel实例解析
Nov 19 Python
wxPython之wx.DC绘制形状
Nov 19 Python
pandas中read_csv、rolling、expanding用法详解
Apr 21 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 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
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
2015/11/18 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
文件上传,iframe跨域数据提交的实现
2016/11/18 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
2020/02/10 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
JS实现简易贪吃蛇游戏
2020/08/24 Javascript
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
python实现简易动态时钟
2018/11/19 Python
Django QuerySet查询集原理及代码实例
2020/06/13 Python
PyCharm 2020.2 安装详细教程
2020/09/25 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
用python-webdriver实现自动填表的示例代码
2021/01/13 Python
香港礼品网站:GiftU eshop
2017/09/01 全球购物
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
厨师岗位职责
2013/11/12 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
2015年路政工作总结
2015/05/22 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
三好学生主要事迹材料
2015/11/03 职场文书
高二语文教学反思
2016/02/16 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS