前言:

   杰弗逊转轮加密,可以自己手动排列完成但是繁琐而且容易弄错,还是建议使用编程,我在手动弄得时候就是复制粘贴少了一个字母,弄了很久才发现,如果编程得话,就不会这样拉

转轮机加密:

题目如下:  

1:   < ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2: < KPBELNACZDTRXMJQOYHGVSFUWI <
3: < BDMAIZVRNSJUWFHTEQGYXPLOCK <
4: < RPLNDVHGFCUKTEBSXQYIZMJWAO <
5: < IHFRLABEUOTSGJVDKCPMNZQWXY <
6: < AMKGHIWPNYCJBFZDRUSLOQXVET <
7: < GWTHSPYBXIZULVKMRAFDCEONJQ <
8: < NOZUTWDCVRJLXKISEFAPMYGHBQ <
9: < XPLTDSRFHENYVUBMCQWAOIKZGJ <
10: < UDNAJFBOWTGVRSCZQKELMXYIHP <
11: < MNBVCXZQWERTPOIUYALSKDJFHG <
12: < LVNCMXZPQOWEIURYTASBKJDFHG <
13: < JZQAWSXCDERFVBGTYHNUMKILOP < 密钥为:2,3,7,5,13,12,9,1,8,10,4,11,6
密文为:NFQKSEVOQOFNP

先搜搜看什么是转轮机吧,https://academy.binance.com/zh/security/history-of-cryptography,这篇文章讲到了:

加密学技术在几个世纪中不断地发展。托马斯杰斐逊,在17世纪末时,描述发表了一个在加密学中一个重大突破,但理论当时并没有实质建立过。他的发表,称为加密轮,由移动轮上的36个字母环组成,可用于实现复杂的编码上。这个概念是如此的先进,以至于它可以在第二次世界大战末期时,作为美国军事编码的基础。

我讲讲它得原理,

1.首先我们根据密钥来进行重新排列轮子

2.密钥得数字就代表第几个轮子,如2,3,7,5...代表第一行换成原来第二行得,第二行换成原来第三行得,依次类推

3.排好后根据密文,进行行内排列,如 KPBELNACZDTRXMJQOYHGVSFUWI 进行重新排列后,找到N所在位置,然后重新拼接 'NACZDTRXMJQOYHGVSFUWI'+'KPBEL'

4.对所有行排好后按照列取

5.

下面给出代码:

 1 import re
2
3 table=[2,3,7,5,13,12,9,1,8,10,4,11,6]
4 Ciphertext='NFQKSEVOQOFNP'
5 with open(r'F:\桌面\tmp\6.txt','r') as f:
6 data=f.read()
7
8 #转轮机根据table重新排列
9 def wheel_decode(data,table):
10 resultList=[]
11 pattern = re.compile('[A-Z]{26}')
12 result = pattern.findall(data)
13
14 for i in table:
15 resultList.append(result[i-1])
16 return resultList
17
18 resultList = wheel_decode(data,table)
19
20
21
22 #根据密文重新排列
23 def rearrange(List,Ciphertext):
24 resultList=[]
25 for i in range(0,13):
26 resultList.append(List[i][List[i].find(Ciphertext[i]):]+List[i][:List[i].find(Ciphertext[i])])
27 return resultList
28 resultList= rearrange(resultList,Ciphertext)
29
30 选取每一列,列出结果
31 def rearrange2(List):
32 resultList=[]
33 s=''
34 for i in range(0,26):
35 for j in List:
36 s += j[i]
37
38 resultList.append(s)
39 s=''
40 return resultList
41
42 resultList = rearrange2(resultList)
43 for i in resultList:
44 print(i)

代码运行结果如下所示:

 1 NFQKSEVOQOFNP
2 AHGCXIUSNWCBN
3 CTWPCUBFOTUVY
4 ZETMDRMEZGKCC
5 DQHNEYCZUVTXJ
6 TGSZRTQWTREZB
7 RYPQFAWAWSBQF
8 XXYWVSAXDCSWZ
9 MPBXBBOJCZXED
10 JLXYGKIGVQQRR
11 QOIITJKDRKYTU
12 OCZHYDZLJEIPS
13 YKUFHFGULLZOL
14 HBLRNHJBXMMIO
15 GDVLUGXVKXJUQ
16 VMKAMLPIIYWYX
17 SAMBKVLQSIAAV
18 FIREINTHEHOLE
19 UZAULCDKFPRST
20 WVFOOMSYAUPKA
21 IRDTPXRPPDLDM
22 KNCSJZFNMNNJK
23 PSEGZPHTYADFG
24 BJOJQQECGJVHH
25 EUNVAONRHFHGI
26 LWJDWWYMBBGMW

然后我们发现第18行 fire in the hole有语义所以这个是正确答案

参考链接:

http://foreversong.cn/archives/138

Crypto入门 (十二)转轮机加密的更多相关文章

  1. Android入门(十二)SQLite事务、升级数据库

    原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...

  2. java加密算法入门(二)-对称加密详解

    1.简单介绍 什么是对称加密算法? 对称加密算法即,加密和解密使用相同密钥的算法. 优缺点: 优点:算法公开.计算量小.加密速度快.加密效率高. 缺点: (1)交易双方都使用同样钥匙,安全性得不到保证 ...

  3. ES6入门十二:Module(模块化)

    webpack4打包配置babel7转码ES6 Module语法与API的使用 import() Module加载实现原理 Commonjs规范的模块与ES6模块的差异 ES6模块与Nodejs模块相 ...

  4. SpringBoot入门 (十二) 定时任务

    本文记录在SpringBoot中使用定时任务. 在我们的项目中,经常需要用到定时任务去帮我们做一些事情,比如服务状态监控,业务数据状态的更改等,SpringBoot中实现定时任务有2中方案,一种是自带 ...

  5. java web开发入门十二(idea创建maven SSM项目需要解决的问题)基于intellig idea(2019-11-09 11:23)

    一.spring mvc action返回string带双引号问题 解决方法: 在springmvc.xml中添加字符串解析器 <!-- 注册string和json解析适配器 --> &l ...

  6. Hibernate入门(十二)离线条件检索

    Hibernate——离线条件检索DetachedCriteria DetachedCriteria翻译为离线条件查询,因为它是可以脱离Session来使用的一种条件查询对象,我们都知道Criteri ...

  7. [WebGL入门]十二,模型数据和顶点属性

    注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外.鄙人webgl研究还不够深入,一些专业词语.假设翻译有误.欢迎大家指 ...

  8. Spring入门(十二):Spring MVC使用讲解

    1. Spring MVC介绍 提到MVC,参与过Web应用程序开发的同学都很熟悉,它是展现层(也可以理解成直接展现给用户的那一层)开发的一种架构模式,M全称是Model,指的是数据模型,V全称是Vi ...

  9. java加密算法入门(三)-非对称加密详解

    1.简单介绍 这几天一直在看非对称的加密,相比之前的两篇内容,这次看了两倍多的时间还云里雾里的,所以这篇文章相对之前的两篇,概念性的东西多了些,另外是代码的每一步我都做了介绍,方便自己以后翻阅,也方便 ...

  10. Spring入门(十四):Spring MVC控制器的2种测试方法

    作为一名研发人员,不管你愿不愿意对自己的代码进行测试,都得承认测试对于研发质量保证的重要性,这也就是为什么每个公司的技术部都需要质量控制部的原因,因为越早的发现代码的bug,成本越低,比如说,Dev环 ...

随机推荐

  1. ObjectARX2016-1打印HelloWolrd

    首先把Objectarx2016和VS2012安装好,安装好之后,如果在VS2012创建项目的过程中出现创建项目失败的情况,可以查看我的第一篇随笔https://www.cnblogs.com/Arc ...

  2. 看K线学炒股(0803)

    高位板块的高位个股要回避,即便走反抽行情也要慎重.像容捷股份. 同是房地产行业的荣盛发展和西藏城投,差别怎么这么大?荣盛发展市净率0.4,西藏城投是4.8,市盈率更是一个天上一个地下,但股价呢?所以股 ...

  3. 指针和指针运算符一起时的运算规则(比如*p++和*++p的区别)

    接下来,通过示例彻底理解自增运算符的两种用法(自减的用法与之类似,只不过是加1变成了减1). 1.++i和i++的区别 如清单1(注意代码中的注释): #include <stdio.h> ...

  4. 35.Linux 性能监控常用命令

    内存 top CPU yum install -y sysstat mpstat 网络 netstat //参数说明 //-n:拒绝显示别卖,能显示数字的全部转化数字 //-l:仅列出Listen(监 ...

  5. 什么时候用多线程什么时候用多进程呢?GUL

    那么在 Python 中什么时候用多线程什么时候用多进程呢?当在CPU-bound(计算密集型:绝大多数时间在计算) 时最好用 - 多进程, 而在 I/O bound(I/O密集型 : IO 处理 并 ...

  6. 几个Shell脚本的例子

    [例子:001]判断输入为数字,字符或其他 #!/bin/bash read -p "Enter a number or string here:" input case $inp ...

  7. Linux服务器时间校准

    当发现系统时间不正确时可以通过 date 命令查看Linux系统的当前时间 最简便的修改方法,我们可以通过 date -s "20190917 22:04:00" 来直接修改Lin ...

  8. 记事本默认编码改为UTF-8

    前端时间发现用记事本直接创建的记录目标信息的TXT文本再用sublime打开变成了乱码,才发现编码有问题,记事本直接创建的文本编码竟然是ANSI编码. 于是动手将记事本默认编码改为UTF-8. 记事本 ...

  9. Leetcode48 旋转图像

    48. 旋转图像 难度中等432 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵 ...

  10. 如何保证RabbitMQ的消息按照顺序执行???

    可以采用单线程的消费保证消息的顺序性.对消息进行编号,1,2,3,4--消费时按照编号的顺序去消费消息.这样就可以保证消息 按照一定顺序执行.