题目分析
从题目到描述都很清楚的指明了加密算法——转轮机加密,又叫杰斐逊盘。背景介绍如下(从寻梦小生那里搬运的):
杰斐逊盘,一种生僻的古典密码,最早由托马斯·杰斐逊(Thomas Jefferson)于1795年发明的,这个密码并没有成为众所周知的,而是由一个世纪之后的伟大的密码的征服者艾蒂安·巴泽尔司令独立发明的。
加密原理很简单,首先需要一组带有标号的轮(从1号轮,2号轮...,n号轮),然后在这些轮的边缘刻有随机化的26个英文字母。最后在解密时,先要根据密钥将这组轮按顺序由上到下排列,再根据密文从上到下转动轮,直到可以从这个轮转机中读出密文,那么这时候明文一定也解密出来了,我们只需要一列一列的寻找可能的明文。
解题过程
原理比较简单,但是要想手动解密还是比较耗时耗力的,于是我就写了一个很糙的python脚本。
original_wheel = ['ZWAXJGDLUBVIQHKYPNTCRMOSFE',
'PBELNACZDTRXMJQOYHGVSFUWI',
'BDMAIZVRNSJUWFHTEQGYXPLOCK',
'RPLNDVHGFCUKTEBSXQYIZMJWAO',
'IHFRLABEUOTSGJVDKCPMNZQWXY',
'AMKGHIWPNYCJBFZDRUSLOQXVET',
'GWTHSPYBXIZULVKMRAFDCEONJQ',
'NOZUTWDCVRJLXKISEFAPMYGHBQ',
'XPLTDSRFHENYVUBMCQWAOIKZGJ',
'UDNAJFBOWTGVRSCZQKELMXYIHP',
'MNBVCXZQWERTPOIUYALSKDJFHG',
'LVNCMXZPQOWEIURYTASBKJDFHG',
'JZQAWSXCDERFVBGTYHNUMKILOP ']#所给初始状态的轮转机
shifted_wheel = []
key = [2,3,7,5,13,12,9,1,8,10,4,11,6] #所给密钥
ciphertext = 'NFQKSEVOQOFNP' #所给密文
#按照密钥顺序对轮排序
for i in key:
shifted_wheel.append(original_wheel[i-1])
print('按照密钥重新排序后的轮转机:\n',shifted_wheel)
#按照密文顺序转动轮
for i in range(len(shifted_wheel)):
index = shifted_wheel[i].index(ciphertext[i])
shifted_wheel[i] = shifted_wheel[i][index:]+shifted_wheel[i][0:index]
print('按照密文重新排序后的轮转机:\n',shifted_wheel)
#读取所有恢复的明文
print('输出所有可能的明文:')
for i in range(1,len(shifted_wheel[0])):
for j in range(len(shifted_wheel)):
print(shifted_wheel[j][i],end='')
print('\n')
然后从输出的所有可能的明文中,寻找flag就好啦。