今天,在攻防世界做了一道密碼題,需要用到傑斐遜轉輪密碼,特此記錄一下。
我們看一下原題
傑斐遜轉輪密碼原理:托馬斯-傑弗遜轉輪加密由三串字符串組成,第一部分為加密表,第二部分為密鑰,第三部分為密文。加密表就是我們需要利用密鑰和密文來進行加密,具體的過程如下: 首先查看密鑰第一個字符為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列的是,答案確實正確,但我沒找到為什么,難道要一列一列試嗎?望哪位大佬知道的話能夠告知,萬分感謝!