加密代码如下

from random import randrange
text_list=' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\t\n'
key=[randrange(1,97) for i in range(randrange(15,30))]
print('key = '+str(key))
def encrypt(s,k):out=''for i in range(len(s)):index=text_list.index(s[i])index*=k[i%len(k)]index%=97out+=text_list[index]return out
plain=open('plain.txt','r').read() # TOEFL reading passage
cipher=encrypt(plain,key)
open('cipher.txt','w').write(cipher)

可以发现 对每个单词做了一下映射
我们需要知道秘钥的长度 解密的秘钥 手上只有密文 看起来不可读 怎么分析?

  1. 首先最关键的是要发现空格不会变 这样就可以猜测单词长度了
  2. 间隔重复秘钥 按照长度找 比如每三个长度取出来一串 最后计数 发现{gY出现的最多 猜测是the 得到秘钥对应位置的值 (解密秘钥和加密秘钥不同,长度一致)
  3. 找key长度 对每个{yG找到在ciphertext中的位置
    [3, 61, 612, 1105, 1279, 1656, 2091]
    考虑到第一个{yG出现在第一个key长度中
    那么对每个数-3
    得到
    [0, 58, 609, 1102, 1276, 1653, 2088]
    发现他们有个共同的倍数29
    linux下可以输入命令 factor 58 以此类推 或者手动gcd搞
    所以keylen=29
    还有一个关键是第一个单词长度为2
    所以可能为
    In
    By
    At
    As
    如何确定
    每29个算一下看出来的结果 ※※※※※
    不是a-zA-Z0-9,.:-基本就不是了 对每个我们猜的结果 都可以用这个验证
    上面这个解密可以自己实现一下
    就是个逆元
    ab mod 97=c mod 97
    已知a,c求b
    b = c
    (a在97意义下的逆元) %97
    哦对了
    当你找出来较多的单词 就可以百度啦!
  4. 题目做完发现可以用 ※※※※※处的方法来暴力破解= = 问题不大…

混乱的解密脚本

import gmpy2
import sys
from random import randrange
import re
from collections import Counter
text_list=' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\t\n'
cipherText = open('cipher.txt','r').read()
print sys.argv[1]
def inv(x):return gmpy2.invert(x,97)
def repeat():c = Counter()for i in range(len(cipherText)):s = cipherText[i:i+int(sys.argv[1])]c[s] = c[s] + 1print sorted(c.items(),key = lambda eachItem:eachItem[1],reverse=True)
def brute():for keylen in range(15,30):num = 0if len(cipherText)%keylen==0:num = len(cipherText)/keylenelse:num = len(cipherText)/keylen+1L = []for i in range(num):start = i*keylenend = (i+1)*keylens = cipherText[start:end]L.append(s)for start in range(keylen):for length in range(1,keylen-start):if length ==3 :c = Counter()ans = []for mylist in L:ans.append(mylist[start:start+length])Max = 0poss = ''for a in ans:c[a] = c[a] + 1if c[a] > Max:Max = c[a]poss = aprint "_______________"# print (keylen,start,length,sorted(c.items(),key = lambda eachItem:eachItem[1],reverse=True))print (keylen,start,length,poss,Max)
def findonekey(s,to):indexto=text_list.index(to)indexs=text_list.index(s)return inv(indexs)*indexto%97
def splitInto():cnt = 0fuckthistext = open('this_is_21.txt','r').read()for i in range(len(fuckthistext)):if i%29==0:print "012345678901234567890123456789here is the line {0}".format(cnt)print fuckthistext[i:i+29]cnt += 1
splitInto()

秘钥爆破 变种维吉尼亚相关推荐

  1. 维吉尼亚密码通过字符频率爆破

    题目的密文如下: qy sdrgx bswkjlpuh zmntp rv wesokk qp fcabwz gqw rdi nlufaaehp rijmntp jjvwmej oqg etz jxmk ...

  2. 维吉尼亚密码_附有链接爆破

    维吉尼亚编码 多表代替密码中最著名和最简单的是 Vigenere 密码.它的代替规则集由 26 个 Caesar 密码的代替表组成,其中每一个代替表是对明文字母表移位 0 到 25 次后得到的代替单表 ...

  3. CTF杂项之“维吉尼亚密码”

    Didi 在这次省赛上做到了一到维吉尼亚密码的题,以前没做过很懵,问了同学才知道 先上图: baby 是秘钥 glbe{pnf_njedc_js_ufjs_kmvrocz!} 是密文 在线解密 htt ...

  4. php实现维吉尼亚算法,python实现维吉尼亚算法

    本文实例为大家分享了python实现维吉尼亚算法的具体代码,供大家参考,具体内容如下 1 Virginia加密算法.解密算法 Vigenenre密码是最著名的多表代换密码,是法国著名密码学家Vigen ...

  5. 维吉尼亚密码破解(Python完整详细源码)

    维吉尼亚密码破解(Python完整详细源码) 欢迎大家访问我的GitHub博客 https://lunan0320.github.io/ 文章目录 维吉尼亚密码破解(Python完整详细源码) 1.写 ...

  6. 维吉尼亚密码的破解算法及python代码实现

    目录 1. 密文描述 1.1 密文1 1.2 密文2 2. 破解原理 2.1 重合指数法确定密钥长度 2.2 互重合指数确定子串间相对偏移 2.3 密钥字的确定 2.4 密文破解 3. 破解代码 参考 ...

  7. 维吉尼亚密码加解密与破解

    实验目的 1.进一步理解维吉尼亚密码的加解密原理 2.进一步理解维吉尼亚密码的缺陷和利用方法 3.提高编程实践能力 实验要求 1.实现维吉尼亚加解密函数 2.破解维吉尼亚加密的密文 实验步骤 1.维吉 ...

  8. 古典密码之维吉尼亚密码破解思路

    首先要说一句,这是我第一次用python coding,所以很多地方都不太懂,吐槽自己竟然用sum当变量名,之后有用sum()函数,然后报了错还不知道为什么.不知道用ascii码要做chr()转化,等 ...

  9. 【密码学原理与实践】(四)维吉尼亚密码 符java代码实现

    维吉尼亚密码(Vigenere Cipher) 转载请著明出处 无论是移位密码还是代换密码,一旦秘钥被选定,则每个字母对应的数字都被加密变换成对应的唯一数字.我们称这种为单表代换密码,而本篇讲的是一种 ...

最新文章

  1. 你有没有扔过一枚硬币选择正反面?
  2. The import com.google cannot be resolved解决方法
  3. C#修改系统环境变量,调用批处理bat
  4. ns3中调试程序------命令行、gdb和logging系统
  5. 机器人绳索英雄下载苹果手机_警察机器人绳索英雄游戏下载-警察机器人绳索英雄苹果版v1.0-FC游戏网...
  6. Tomcat6.0配置集合
  7. python opencv 直方图均衡化_Python opencv—直方图/直方图均衡化/直方图比较,pythonopencv...
  8. [转载] C++转JAVA的转换方法及约定
  9. SQL AZURE数据库创建,云计算体验之一
  10. Python自制日常办公辅助工具之:批量视频截图,子集固定尺寸截图+序列化命名
  11. 第二课 Python Web企业门户网站-框架搭建
  12. 印章仿制工具_PS仿制图章工具怎么使用?仿制图章工具使用方法图解
  13. uWSGI, Gunicorn,ngnix 服务器 详解
  14. Blowfish简介
  15. 二十世纪初的心理学时间轴制作
  16. mybatis的switch标签
  17. 6-3 定义Person类
  18. 云南移动机房介绍,昆明移动机房服务器托管、机柜、移动大带宽租用
  19. 聊聊信任:衣服掉地上会脏的
  20. 1. emqx docker安装以及持久化配置

热门文章

  1. 制作微信小程序 第三天(轮播图 导航栏 按钮 框)
  2. 微信浏览器禁止app下载链接的两种处理方法-NiceTool
  3. linux kmalloc 函数
  4. 用纯html元素实现日期选择控件
  5. nginx 配置代理和虚拟目录示例
  6. 居中为什么要使⽤transform(为什么不使⽤marginLeft/Top)
  7. H3C U200M 防火墙 bin文件丢失上传方法记录。
  8. VM系列振弦采集模块 快速测量
  9. 配置npm淘宝镜像、使用npm管理项目
  10. php无限极,PHP实现无限极分类