XCTF-crypto---转轮机加密

      转轮密码机是由一个输入键盘和一组转轮组成的,每个转轮上标有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)

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

 

posted @ 2020-09-01 19:53  我是球啊  阅读(1222)  评论(0编辑  收藏  举报