今天,在攻防世界做了一道密码题,需要用到杰斐逊转轮密码,特此记录一下。
我们看一下原题
杰斐逊转轮密码原理:托马斯-杰弗逊转轮加密由三串字符串组成,第一部分为加密表,第二部分为密钥,第三部分为密文。加密表就是我们需要利用密钥和密文来进行加密,具体的过程如下: 首先查看密钥第一个字符为2,因此我们需要到加密表中去查找第2行的数据 2: < KPBELNACZDTRXMJQOYHGVSFUWI < 。再利用密文的第一个字符N进行旋转,N在这里的作用就是旋转过后的第一个字符即为N,在这里的旋转为循环(即字母z后面为a)。同理,对之后的秘钥进行相同操作。这里放上大佬写的脚本:
1 -*- coding:utf-8 -*- 2 import re 3 text="" 4 with open("wheelcipher.txt","r",encoding="utf-8") as f: 5 text=f.read() 6 #print (text) 查看是否读取完整 7 code=[]#将字符提取出来放在这里 8 code=re.findall(r"<(.*)<",text) 9 for i in range(len(code)): 10 code[i]=code[i].strip() 11 print(code) 12 codetext="NFQKSEVOQOFNP" 13 codenum="2,3,7,5,13,12,9,1,8,10,4,11,6" 14 codenum=codenum.split(",")#把这些数字都弄到一个里面去 15 #print(codenum) 16 a=0 17 print("解密后的:") 18 for i in codenum: 19 index=code[int(i)-1].index(codetext[a]) 20 a=a+1 21 code[int(i)-1]=code[int(i)-1][index:]+code[int(i)-1][:index] 22 print(code[int(i)-1]) 23 24 #完成了变形了 25 26 print("下面是每一列的") 27 for i in range(len(code[0])): 28 str="" 29 print("第{}列的是:".format(i),end="") 30 for j in codenum: 31 str+=code[int(j)-1][i] 32 print(str.lower())
然后执行后为
其中每一列的意思是将解密后的所有行字母一列一列输出的,最后的难题就是flag在哪,我看了别人的解析,他们说是第17列的是,答案确实正确,但我没找到为什么,难道要一列一列试吗?望哪位大佬知道的话能够告知,万分感谢!