转轮密码机是由一个输入键盘和一组转轮组成的,每个转轮上标有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. HTTPS证书知识扫盲

    1. 前言 现在搞网站域名不加个HTTPS就显得不专业,特别在使用JWT进行认证的接口一定要加HTTPS为你的接口增加一层安全屏障.今天就来聊聊配置HTTPS的关键SSL证书,也被称为CA证书. 2. ...

  2. 手把手教你AspNetCore WebApi:缓存(MemoryCache和Redis)

    前言 这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,马老板很生气,叫小明一定要解决这个问题.性能问题一般用什么来解决呢?小明第一时间想到了缓存. 什么是缓存 缓存是实际工作中非常常用的 ...

  3. 多测师讲解selenium _a标签定位()_高级讲师肖sir

    shift+ctrl+c 快捷键  调出元素

  4. 使用Python学习win32库进行内存读写

    前言: 上一周,在52的精华帖中,看到有位大佬用Python制作了鬼泣5的修改器,看完才知道,原来Python也可以对内存进行操作,出于对技术的好奇,看完以后,决定自己也尝试一下. 要用到的工具: C ...

  5. MeteoInfo家族的新产品:MeteoInfoLab

    为了更方便地处理各种数据并绘图,尝试开发了一个新的软件产品MeteoInfoLab,软件设计上参考了MatLab和Spider.软件以脚本程序和命令行交互为主,基于MeteoInfo库并利用Jytho ...

  6. 用 C 语言游戏编程开发!果然最担心的事又发生了!

    30了.我要怎么办,老了.人就像一头小毛驴,方向都是牵着的人定的. 这个项目从去年开始的,一个手机游戏,当时接这个项目的时候其实没有太多考虑,我一向都喜欢打肿脸充胖子的,好面子,人家找上门来,不能不给 ...

  7. selenium--基础学习

    from selenium import webdriver from selenium.common.exceptions import TimeoutException, NoSuchElemen ...

  8. 第二十二章 Nginx性能优化

    一.性能优化概述 1.我们需要了解 1.首先需要了解我们当前系统的结构和瓶颈,了解当前使用的是什么,运行的是什么业务,都有哪些服务,了解每个服务最大能支撑多少并发.比如nginx作为静态资源服务并发是 ...

  9. 第六章 类(Class) 和对象(Object)

    一.笔记导图 二.实例代码: public class PrintCarStatus{ public static void main(String[] args){ int speed; Strin ...

  10. 51nod 最大M子段和系列(1052、1053、1115)

    51nod1052 数据量小,可使用O(N*M)的DPAC,递推公式: dp[i][j]=max(dp[i-1][j-1], dp[i][j-1])+a[j]; dp[i][j]表示前j个数取 i 段 ...