WP-Crypto-Polybius-棋盤密碼


title:Polybius
description: 2020 | BJDCTF | Crypto | Polybius
做題平台:[ctfhub](https://www.ctfhub.com/#/challenge "ctfhub")

題目考點

  • 棋盤密碼-波利比奧斯密碼

解題思路

一、題目描述

image

下載解壓后得到一.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)  #輸出解密結果

運行結果:

image

在結果中查找“flag”:

image


Flag

BJD{flagispolybius}

總結

1.編寫了棋盤密碼窮舉的腳本

2.了解到了指定元素全排列函數itertools.permutations(list,int)的用法

3.不能定式思維誰說的“aeiou”順序必須按照字母表來?

作者:ta0tie(轉載請注明作者與來源)
作者編程功力不足,腳本變量命名混亂還請見諒
歡迎大家批評指正


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM