转轮密码机是由一个输入键盘和一组转轮组成的,每个转轮上标有26个字母,字母的顺序随意,转轮之间由齿轮进行连接,当一个转轮转动时,可以讲一个字母转化为另一个字母。

工作原理:

转轮机由多个转轮构成,每个转轮旋转的速度都不一样,比如说有3个转轮,分别标号为1,2,3,其中1号转轮转动26个字母以后,2号转轮就转动一个字母,当2号转轮转动26个字母后,3号转轮就转动一个字母,因此,当转轮密码机转动26*26*26次后,所有转轮恢复到初始状态,即三个转轮的转轮机的一个周期长度为26*26*26的多表代换密码。

例子:

例题:

附件内容如下:

加密表:
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

起初在网上没有找到这种加密的具体原理,对源码以及最后的代码分析过后,发现这种古典密码其实很简单,下面我来阐释它的解密原理 首先托马斯-杰弗逊转轮加密由三串字符串组成,第一部分为加密表,第二部分为密钥,第三部分为密文 加密表就是我们需要利用密钥和密文来进行加密,具体的过程如下: 首先查看密钥第一个字符为2,因此我们需要到加密表中去查找第2行的数据

2: < KPBELNACZDTRXMJQOYHGVSFUWI <

这里我们再利用密文的第一个字符N进行旋转,N在这里的作用就是旋转过后的第一个字符即为N,在这里的旋转为循环,不为补0 因此我们可以来对加密表中的第一段密文进行解密: 原先:KPBELNACZDTRXMJQOYHGVSFUWI 旋转:NACZDTRXMJQOYHGVSFUWIKPBEL 同理下面的字符串也可以利用同样的方式进行解密 最终的解密为:

观察题意,与二战有关,则需要有实际意义,观察得到的字母串,fireinthehole(小心手雷)符合题意,此即为flag。

这篇博客也写的比较详细,可以参考:https://www.freesion.com/article/2890547950/

代码脚本如下:

import re

table=[2,3,7,5,13,12,9,1,8,10,4,11,6]
Ciphertext='NFQKSEVOQOFNP'
with open(r'F:\桌面\tmp\6.txt','r') as f:
data=f.read() #转轮机根据table重新排列
def wheel_decode(data,table):
resultList=[]
pattern = re.compile('[A-Z]{26}')
result = pattern.findall(data) for i in table:
resultList.append(result[i-1])
return resultList resultList = wheel_decode(data,table) #根据密文重新排列
def rearrange(List,Ciphertext):
resultList=[]
for i in range(0,13):
resultList.append(List[i][List[i].find(Ciphertext[i]):]+List[i][:List[i].find(Ciphertext[i])])
return resultList
resultList= rearrange(resultList,Ciphertext) 选取每一列,列出结果
def rearrange2(List):
resultList=[]
s=''
for i in range(0,26):
for j in List:
s += j[i] resultList.append(s)
s=''
return resultList resultList = rearrange2(resultList)
for i in resultList:
print(i)

运行脚本也可以得到所有的字符串结果。

XCTF-crypto---转轮机加密的更多相关文章

  1. 前端使用crypto.js进行加密

    前端使用crypto.js进行加密 https://www.cnblogs.com/lz2017/p/8046816.html   最近我在前端使用Cookies保存密码的时候需要前端来进行加密工作, ...

  2. XCTF crypto 不仅仅是Mors

    一. 题目暗示摩斯码,打开文件发现里面有反斜杠的.不管它直接拿来解密 二. 发现一句话是句英文,还有其他的加密方式,后面那串只有两种字符A和B,手抓饼A套餐,b套餐 培根加密,拿来解密后,得到flag

  3. Crypto API加密通信流程

    应用程序使用Crypto API进行加密通信的一般步骤如下: 1,include wincrypt.h 2,调用CryptAcquireContext()获得某个CSP模块中的密钥容器(key con ...

  4. Crypto加密解密

    crypto 模块提供了加密功能,包含对 OpenSSL 的哈希.HMAC.加密.解密.签名.以及验证功能的一整套封装.我们这里讲crypto AES算法加密 一.使用步骤 1.引入Crypto 1. ...

  5. java常用加密和解密工具类EncryptUtil.java

    package cn.util; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; im ...

  6. JAVA实现DES加密实现详解

    package util; import java.security.SecureRandom; import javax.crypto.spec.DESKeySpec; import javax.c ...

  7. Java的加密与解密

    package com.wangbo.util; import java.security.Key; import java.security.Security; import javax.crypt ...

  8. 【Java】通过DES加密和解密工具,对字符串进行加密和解密操作

    分享一个非常不错的字符串加密和解密的程序. 可以指定不同的密钥对同一字符串进行不同的加密操作,增强加密性能. Java代码如下: package com.app; import java.securi ...

  9. 加密解密工具类(Java,DES)

    一个Java版的DES加密工具类,能够用来进行网络传输数据加密,保存password的时候进行加密. import java.security.Key; import java.security.sp ...

随机推荐

  1. FastJson解析Json,封装JavaBean对象

    获取到前端的Json,后台对应封装JavaBean对象,对其解析赋值 获取到前端的json,对其进行分析 1.获取最外层前端json对应得JavaBean (1)未分析格式的json串 (2)初步格式 ...

  2. SpringBoot+单机redis

    spring boot-redis集成 看教程来的,看起来很简单,但是集成后发现启动失败? WARN 2556 --- [ restartedMain] ationConfigEmbeddedWebA ...

  3. 多测师讲解jmeter _接口请求_(003)高级讲师肖sir

    1.简单接口的请求 2. 3. 正则查看: 正则提取:在后置处理器中正则请求 设置:正则表达式 JSESSIONID提取器: Debug  sampler 总结:

  4. 多测试_常用linux命令_002

    linux 介绍 常用的操作系统(os): windows .dos.android.ios.unix.linux linux系统:是一个免费.开源的操作系统 支持多cpu,多用户,多线程的操作系统, ...

  5. JVM系列【2】Class文件结构

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 如何查看class字节码文件 在idea中可以通过插件BinEd来查看二进 ...

  6. MeteoInfoLab脚本示例:加载地图图层

    应用最广泛的的地图数据应该是shape格式,网络上有很多免费下载资源.MeteoInfoLab中读取shape文件的函数是shaperead,参数即文件名,返回数据包含图形和属性信息的图层对象.矢量图 ...

  7. windows.h头文件中改变光标位置的函数——SetConsoleCursorPosition

    COORD 具体为 typedef struct COORD{ short X; short Y; } COORD,*PCOORD;     可以用来记录坐标. #include <iostre ...

  8. 【C语言】这种求结构体成员大小的方法,你可能需要了解一下~

    在C语言编程中,有时候需要知道某结构体中某成员的大小,比如使用堆内存来存储结构体中的某成员时,需要知道该成员的大小,才好确定所需申请的空间大小.求某结构体中某成员的大小,你会怎么做? 例子: type ...

  9. trade可撤销贪心正确性证明

    鉴于tarde这道题正解过于好写,导致我对这个诡异的贪心的正确性产生了疑问,所以花了2h的时间与同机房神犇M-Blanca,Midoria7,goote~进行讨论,最后与goote~犇犇各得出了一个正 ...

  10. linux-查看内核

    [root@localhost vagrant]# uname -r 3.10.0-1127.19.1.el7.x86_64   [root@localhost vagrant]# cat /etc/ ...