网络编程
位置:首页>> 网络编程>> Python编程>> python实现Virginia无密钥解密

python实现Virginia无密钥解密

作者:Aslani  发布时间:2023-07-25 10:56:49 

标签:python,Virginia,解密

本文实例为大家分享了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)

来源:https://blog.csdn.net/Aslani/article/details/53729804

0
投稿

猜你喜欢

  • 经过一轮的项目封闭开发,页面制作的动手能力提高了不少,用AW的话说就是被复杂的东西虐过以后很多问题都变得容易了,的确很有道理。我个人觉得技术
  • 以前在一个图书类网站看到这样一个功能:客户可以按条件搜索书目的信息,服务器会将符合条件的信息筛选出来保存为一个Excel文件供客户下载。今天
  • 正确使用字体和颜色可以让网页内容更易阅读,下面我们来看看具体的优化措施。留意颜色的对比对于视力不太好的人或者对于不太好的显示设备来说,黑地白
  • 众所周知,IE 6只支持单通道的PNG图片(即只有透明/不透明2种状态,gif图片的透明单通道透明),因此如果需要使用alpha透明的png
  • <%sql = "select *  from SMT_addt
  • 目前防采集的方法有很多种,先介绍一下常见防采集策略方法和它的弊端及采集对策: 一、判断一个IP在一定时间内对本站页面的访问次数,如果明显超过
  • 这两条是关于IE环境中的CSS的。不要使用import引入CSS,可以避免内容的无样式瞬间(FOUC)问题。不要把样式的link放到页面后(
  • 现在流行虚拟主机建站,我也有个网站,也算是个站长咯。当了近一年的站长,感到网站程序每次升级的时候颇为麻烦:先去官方看公告,然后下载升级包到本
  • 文字向下滾動,逐渐隐藏效果~ 挺好的 <!DOCTYPE html PUBLIC "-//W3C//DTD XHT
  • 如果你过分信任 Access 2000数据库的密码保护,你可能会因此而蒙受损失。这是因为Access 2000的数据库级密码并不安全,相反它
  • 是时候了—— 在大部分情况下当用户输入密码时把它们用清晰的文字显示出来。一直以来,提供反馈、把系统状态形象化是最基本的可用性原则,当用户输入
  • IE的有条件注释是一种专有的(因此是非标准的)、对常规(X)HTML注释的Miscrosoft扩展。顾名思义,有条件注释使你能够根据条件(比
  • DOM遍历基于ID、元素类型、类名查找元素非常有用,但是如果你想基于它在DOM树中的位置来查找元素该怎么办?换句话说,你有一个给定的元素,你
  • 1、mysql的limit关键字 (DAO)select * from tablename limit startPoint, number
  • 在IE比较简单,大家都知道用setHomePage来设置,懒人写法:<a href="#setHomePage"
  • 使用MySQL,安全问题不能不注意。以下是MySQL提示的23个注意事项:1.如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就
  • 前言前几天逛github发现了一个有趣的并发库-conc,其目标是:更难出现goroutine泄漏处理panic更友好并发代码可读性高从简介
  • 今天网页调试的时候在线订单出现错误:Server 对象 错误 'ASP 0178 
  • Ajax在网上已经叫喊了好几年了, 但是还是有很多像我这样的新手没掌握它, 像这样能改善交互体验的技术不会用真是很遗憾呢. 所以我就把我学到
  • 在一些情况下,MySQL可以直接使用索引来满足一个 ORDER BY 或 GROUP BY 子句而无需做额外的排序。尽管 ORDER BY
手机版 网络编程 asp之家 www.aspxhome.com