title:Polybius
description: 2020 | BJDCTF | Crypto | Polybius
做題平台:[ctfhub](https://www.ctfhub.com/#/challenge "ctfhub")
題目考點
- 棋盤密碼-波利比奧斯密碼
解題思路
一、題目描述
下載解壓后得到一.txt文件:
密文:ouauuuoooeeaaiaeauieuooeeiea hint:VGhlIGxlbmd0aCBvZiB0aGlzIHBsYWludGV4dDogMTQ= flag:解出明文后,請加上BJD{}
二、解題
首先題目描述為“Polybius”,最直接想到的應該是“波利比奧斯矩陣”或“波利比奧斯棋盤”即棋盤密碼。再對應給出的密文是“a,e,i,o,u”這五個字母的重復,那就肯定了這個應該是棋盤密碼。
話說給出的hint為base64編碼,解碼后為“The length of this plaintext: 14”,而密文長度剛好為14*2=28,更加確定了這是棋盤加密。
雖然已知為棋盤加密,但這道題並沒有那么簡單。在我第一次解題時,使用的棋盤密碼(ADFGX密碼/Polybius密碼)解密加密! (xiao84.com)網站的在線工具,我簡單的認為只要將上邊欄和左邊欄的索引按照順序換為“a,e,i,o,u”即可,但這樣子解密出來的明文是沒有意義的字母組合並不是flag。
於是我開始了百度,看了大佬的分析后,我意識到:誰說索引順序就必須是“a,e,i,o,u”呢?看來是我思維定式了(233333333),那么就需要寫一個腳本去窮舉這5!=120種可能。
三、腳本編輯
key=[['a','b','c','d','e'],\
['f','g','h','i/j','k'],\
['l','m','n','o','p'],\
['q','r','s','t','u'],\
['v','w','x','y','z']] #字母棋盤的生成
ordstr = ''
c = 'ouauuuoooeeaaiaeauieuooeeiea'
import itertools
num = ['a','e','i','o','u']
for num in itertools.permutations(num, 5): #python內置庫itertools中指定元素全排列函數的使用
order = list(num)
for i in c :
a = str(order.index(i))
ordstr = ordstr + a
ordstrList = list(map(int,list(ordstr))) #將密文中的aeiou轉化為對應數字並存入列表
ordstr = ''
i = 0
mstr2 = ''
while (i!=28):
mstr1 = key[ordstrList[i]][ordstrList[i+1]] #兩兩一組獲取對應明文
mstr2 = mstr2 + mstr1
i = i+2
print(mstr2) #輸出解密結果
運行結果:
在結果中查找“flag”:
Flag
BJD{flagispolybius}
總結
1.編寫了棋盤密碼窮舉的腳本
2.了解到了指定元素全排列函數itertools.permutations(list,int)
的用法
3.不能定式思維誰說的“aeiou”順序必須按照字母表來?
作者:ta0tie(轉載請注明作者與來源)
作者編程功力不足,腳本變量命名混亂還請見諒
歡迎大家批評指正