WP-Crypto-Polybius-棋盘密码
题目考点
- 棋盘密码-波利比奥斯密码
解题思路
一、题目描述
下载解压后得到一.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(转载请注明作者与来源)
作者编程功力不足,脚本变量命名混乱还请见谅
欢迎大家批评指正