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中变量交换的例子
Aug 25 Python
Python内置函数dir详解
Apr 14 Python
Python实现根据IP地址和子网掩码算出网段的方法
Jul 30 Python
opencv-python 读取图像并转换颜色空间实例
Dec 09 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 Python
python实现UDP协议下的文件传输
Mar 20 Python
浅析python 定时拆分备份 nginx 日志的方法
Apr 27 Python
Python 跨.py文件调用自定义函数说明
Jun 01 Python
django restframework serializer 增加自定义字段操作
Jul 15 Python
详解Pandas 处理缺失值指令大全
Jul 30 Python
selenium自动化测试入门实战
Dec 21 Python
使用Python爬虫爬取小红书完完整整的全过程
Jan 19 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
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
PHP中文分词的简单实现代码分享
2011/07/17 PHP
PHP实现的购物车类实例
2015/06/17 PHP
php集成动态口令认证
2016/07/21 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
PHP实现微信退款功能
2018/10/02 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
ppk谈JavaScript style属性
2008/10/10 Javascript
JSON为什么那样红为什么要用json(另有洞天)
2012/12/26 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
Vue中的基础过渡动画及实现原理解析
2018/12/04 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
ligerUI的ligerDialog关闭刷新的方法
2019/09/27 Javascript
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
Python异常学习笔记
2015/02/03 Python
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
Python+tkinter模拟“记住我”自动登录实例代码
2018/01/16 Python
Python发送邮件测试报告操作实例详解
2018/12/08 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
什么是SCM(软件配置管理)
2014/08/16 面试题
商务英语专业毕业生自荐信
2013/11/05 职场文书
银行求职信个人范文
2013/12/16 职场文书
法制宣传日活动总结
2014/04/29 职场文书
访谈节目策划方案
2014/05/15 职场文书
文案策划专业自荐信
2014/07/07 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
上课迟到检讨书范文
2015/05/06 职场文书