WP-Crypto-Polybius-棋盘密码

题目考点

  • 棋盘密码-波利比奥斯密码

解题思路

一、题目描述

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(转载请注明作者与来源)
作者编程功力不足,脚本变量命名混乱还请见谅
欢迎大家批评指正

posted @ 2021-11-03 10:32  ta0tie  阅读(1035)  评论(0编辑  收藏  举报