python实现维吉尼亚解密
# -*-coding:UTF-8-*-
from sys import stdout
miwen = "KCCPKBGUFDPHQTYAVINRRTMVGRKDNBVFDETDGILTXRGUD DKOTFMBPVGEGLTGCKQRACQCWDNAWCRXIZAKFTLEWRPTYCQKYVXCHKFTPONCQQRHJVAJUWETMCMSPKQDYHJVDAHCTRLSVSKCGCZQQDZXGSFRLSWCWSJTBHAFSIASPRJAHKJRJUMVGKMITZHFPDISPZLVLGWTFPLKKEBDPGCEBSHCTJRWXBAFSPEZQNRWXCVYCGAONWDDKACKAWBBIKFTIOVKCGGHJVLNHIFFSQESVYCLACNVRWBBIREPBBVFEXOSCDYGZWPFDTKFQIY CWHJVLNHIQIBTKHJVNPIST"
Ix = 0.065
ziranpinlv=[0.081,0.014,0.038,0.039,0.122,0.022,0.017,0.045,0.071,0.001,0.004,0.037,0.034,0.070,0.072,0.028,0.000,0.068,0.063,0.094, 0.025,0.010,0.015,0.002,0.015,0.000]
print ziranpinlv.__len__()
huifufenzu = []
huifupianduan = ""
def keylength(miwen): #计算秘钥长度
miwen = miwen.replace(" ", "") #替换掉密文中的空格
chushimiwenlen = miwen.__len__()
fenzumiwenlen = chushimiwenlen
left = 0
right = 0
max_pinlv = 0
key_len = 0
for i in range(2,8):#安装key不同长度进行分组
while 0!=(fenzumiwenlen%i):
fenzumiwenlen=fenzumiwenlen-1
jianju = i
right = i
fenzu=[]
while(right<=fenzumiwenlen):
fenzu.append(miwen[left:right])
left = right
right = right+jianju
left = 0
right = 0
jianju = 0
mm = ""
for m in range(1, chushimiwenlen - fenzumiwenlen + 1):
mm = miwen[-m] + mm
fenzu.append(mm)
fenzumiwenlen = chushimiwenlen
mm = ""
xinfenzu = []
for q in range(i):
xinfenzu.append("")
for w in range(i):
for y in range(fenzu.__len__()):
if fenzu[y].__len__()>= w+1:
xinfenzu[w] = xinfenzu[w]+ fenzu[y][w]
pinlv = []
for pp in range(xinfenzu.__len__()):
pinlv.append(0)
fenzupinlv = []
fenzupinlv = jisuanpinlv(xinfenzu,fenzupinlv)
for ppp in range(xinfenzu.__len__()):
for pppp in range(ppp*26,(ppp+1)*26):
pinlv[ppp] = round(pinlv[ppp]+ fenzupinlv[pppp]*fenzupinlv[pppp],3)
pingjun = 0
for oo in range(pinlv.__len__()):
pingjun = pingjun + pinlv[oo]
pingjun = round(pingjun/pinlv.__len__(),5)
if pingjun > max_pinlv:
max_pinlv = pingjun
key_len = pinlv.__len__()
decrypt(miwen,chushimiwenlen,key_len)
def jisuanpinlv(xinfenzu,fenzupinlv):#
for l in range(xinfenzu.__len__()):
for a in range(65, 91):
zimuchuxiancishu = 0
for zimu in xinfenzu[l]:
if chr(a) == zimu:
zimuchuxiancishu = zimuchuxiancishu + 1
fenzupinlv.append(round(float(zimuchuxiancishu)/float(xinfenzu[l].__len__()),3))
return fenzupinlv
def decrypt(miwen,chushimiwenlen,key_len):
i = key_len #进行分组
xinfenzu = []
fenzumiwenlen = chushimiwenlen
while 0!=(fenzumiwenlen%i):
fenzumiwenlen -= 1
jianju = i
right = i
fenzu=[]
left = 0
while(right<=fenzumiwenlen):
fenzu.append(miwen[left:right])
left = right
right = right+jianju
mm = ""
for m in range(1, chushimiwenlen - fenzumiwenlen + 1):
mm = miwen[-m] + mm
fenzu.append(mm)
fenzumiwenlen = chushimiwenlen
xinfenzu = []
for q in range(i):
xinfenzu.append("")
for w in range(i):
for y in range(fenzu.__len__()):
if fenzu[y].__len__()>= w+1:
xinfenzu[w] = xinfenzu[w]+ fenzu[y][w]
print xinfenzu
plaintext(xinfenzu)
def plaintext(xinfenzu):
fenzupinlv = []
for l in range(xinfenzu.__len__()):
for a in range(65, 91):
zimuchuxiancishu = 0
for zimu in xinfenzu[l]:
if chr(a) == zimu:
zimuchuxiancishu = zimuchuxiancishu + 1
fenzupinlv.append(round(float(zimuchuxiancishu)/float(xinfenzu[l].__len__()),3))
k = shift(fenzupinlv[l*26:(l+1)*26])
mingwenpianduan = shuchumingwen(xinfenzu[l],k)
global huifufenzu
huifufenzu.append(mingwenpianduan)
print huifufenzu
huifu()
def shift(fenzupinlv):
Mg = 0
max_k = 0
fenzu_k = []
for i in range(26):
for j in range(26):
Mg = Mg + round(fenzupinlv[(j+i)%26]*ziranpinlv[j],3) fenzu_k.append(round(Mg,3))
Mg = 0
return fenzu_k.index(max(fenzu_k))
def shuchumingwen(xinfenzu,k):
global huifupianduan
huifupianduan= ""
for hh in range(xinfenzu.__len__()):
if ord(xinfenzu[hh])-k>=65:
huifupianduan = huifupianduan + chr(ord(xinfenzu[hh])-k)
if ord(xinfenzu[hh])-k<65:
huifupianduan = huifupianduan + chr((ord(xinfenzu[hh])-65-k)%91)
return huifupianduan
def huifu():
global huifufenzu
mingwen = ""
for i in range(huifufenzu.__len__()):
if i == 0:
mingwen = mingwen + huifufenzu[i][:56]
else:
mingwen = mingwen +huifufenzu[i]
for k in range(56):
for j in range(k,mingwen.__len__(),56):
stdout.write(mingwen[j])
stdout.write(huifufenzu[0][-1:])
keylength(miwen)
python实现维吉尼亚解密的更多相关文章
- Vigenère Cipher 维吉尼亚加解密算法
维吉尼亚的加解密有两种方法. 第一种是查表:第一行为明文,第一列为密钥,剩余的为对应的密文 第二种方法是转化计算法:逐个将字符转化为从零开始的数字,对数字进行加密/解密后,再转化为字符. 本文要用c+ ...
- [加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 随机练习:C#实现维吉尼亚加密与解密(解密前提为已知密匙)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 维吉尼亚密码-攻防世界(shanghai)
维吉尼亚密码 维吉尼亚密码是使用一系列 凯撒密码 组成密码字母表的加密算法,属于多表密码的一种简单形式. 加密原理 维吉尼亚密码的前身,是我们熟悉的凯撒密码. 凯撒密码的加密方式是依靠一张字母表中的每 ...
- [CTF]维吉尼亚密码(维基利亚密码)
[CTF]维吉尼亚密码(维基利亚密码) ----------------------百度百科 https://baike.baidu.com/item/维吉尼亚密码/4905472?fr=aladdi ...
- python 维吉尼亚
加密key='COMPUTER' plaintext='BLOCKCIPHERDESIGNPRINCIPLE' ascii='abcdefghijklmnopqrstuvwxyz'.upper() k ...
- 维吉尼亚密码java代码实现根据密钥长度计算IC值过程
package cn.longxuzi; import java.util.Scanner; import org.junit.Test; public class ICUtils { /** * @ ...
- 维吉尼亚密码java完整版
package cn.longxuzi; import org.junit.Test; public class Chi_SquareUtils { private static final ICUt ...
- python实现维吉利亚密码加密(Vigenère cipher)
最近有个朋友问我关于维吉利亚密码如何用python实现加密,研究之后发现这是个挺好玩的东西,遂决定写篇博文记录一下. 一.何谓维吉利亚密码 第一列是密钥字母列,第一行是明文字母行.不难看出维吉利亚密码 ...
随机推荐
- Java 多线程之哪个对象才是锁?
问题背景 在感觉正常的使用ArrayList的迭代删除的操作的时候,发现了如下的崩溃日志: Caused by: java.util.ConcurrentModificationException a ...
- 伯克利推出世界最快的KVS数据库Anna:秒杀Redis和Cassandra
天下武功,唯快不破. 伯克利 RISE 实验室推出了最新的键值存储数据库 Anna,提供了惊人的存取速度.超强的伸缩性和史无前例的一致性保证.Jeff Dean 说,当一个系统增长到十倍规模时,就需要 ...
- Eclipse Web项目配置
1.每次重开workspace都要重新配置一次 2.new web project之前配置 3.Windows-Preferences-(所有都要记得Apply) General Maven P. ...
- 如何为Web应用选择托管主机
PHP应用开发好了?恭喜你!不过,现在还没什么用,因为用户无法使用.你要把应用存储到服务器中,让预期受众能访问.一般来说,存储PHP应用有四种方式:共享服务器.虚拟私有服务器.专用服务器和平台即服务. ...
- Linux基础教程(一)——Linux系统简介
Linux的概述 Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境.Linux是由Linus Torvalds(林纳斯·托瓦兹)起初开发的,由于 ...
- AJAX跨域问题解决方法(3)——被调用方解决跨域
被调用方解决跨域是指在HTTP响应头中增加指定的字段,允许调用方调用 可以在两种地方增加1.apache/nginx(HTTP服务器)2.tomcat(应用服务器) 浏览器如何判断跨域?仔细观察可以发 ...
- java中断
理解java中断 Java中断机制是一种协作机制,即通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断.例如,当线程t1想中断线程t2,只需要在线程t1中将线程t2对象的中断标识置为tr ...
- Ubuntu上将终端安装到右键上
Ubuntu上将终端安装到右键上 author:headsen chen 2017-10-12 10:26:12 个人原创,允许转载,请注明作者和出处,否则依法追究法律责任 chen@chen ...
- 20165226 预备作业3 Linux安装及学习
20165226 预备作业3 Linux安装及学习 Linux安装 一.下载安装VirtualBox 1.首先在官网下载,点开基于VirtualBox虚拟机安装Ubuntu图文教程 找到版本进行下载安 ...
- poj-1031-fence(不是我写的,我只是想看着方便)
题目大意: 有一个光源位于(0,0)处,一个多边形的围墙.围墙是“全黑”的,不透光也不反射光.距光源r处的光强度为I0=k/r,k为常数. 一块无穷窄高为h的墙上围墙受到的照度为dI=I0*|cosα ...