从题目到描述都很清楚的指明了加密算法——转轮机加密,又叫杰斐逊盘。背景介绍如下(从寻梦小生那里搬运的):
杰斐逊盘,一种生僻的古典密码,最早由托马斯·杰斐逊(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就好啦。