题目链接:https://ctf.bugku.com/challenges/detail/id/56.html
题目作者: 未知
提 示:
描 述: flag格式 flag{你解密的内容}
解题思路:
(本题目中所写的解密脚本基于
python 3.9.0
)
拿到题目文件,打开后得到加密数据:
由于每行均有26个不重复的英文字母,结合密钥密文,推测其可能是变换位置后的轮转密码。
开始写python
脚本恢复密码。
首先输入乱序序列以及密钥,密文:
s = ['ZWAXJGDLUBVIQHKYPNTCRMOSFE',
'KPBELNACZDTRXMJQOYHGVSFUWI',
'BDMAIZVRNSJUWFHTEQGYXPLOCK',
'RPLNDVHGFCUKTEBSXQYIZMJWAO',
'IHFRLABEUOTSGJVDKCPMNZQWXY',
'AMKGHIWPNYCJBFZDRUSLOQXVET',
'GWTHSPYBXIZULVKMRAFDCEONJQ',
'NOZUTWDCVRJLXKISEFAPMYGHBQ',
'QWATDSRFHENYVUBMCOIKZGJXPL',
'WABMCXPLTDSRJQZGOIKFHENYVU',
'XPLTDAOIKFZGHENYSRUBMCQWVJ',
'TDSWAYXPLVUBOIKZGJRFHENMCQ',
'BMCSRFHLTDENQWAOXPYVUIKZGJ',
'XPHKZGJTDSENYVUBMLAOIRFCQW']
pri_key = [2, 5, 1, 3, 6, 4, 9, 7, 8, 14, 10, 13, 11, 12]
pri_text = 'HCBTSXWCRQGLES'
按密钥的顺序获得排序后的序列:
new_s = []
for i in range(0, 14):
new_s.append(s[pri_key[i] - 1])
将对应位置字符串的顺序按密文调整,例如:第一个字母是H
,就找到第一行中的H
,将其及其后边的字符都往前移,使H位于第一位:
for i in range(0, 14):
ans.append(new_s[i][new_s[i].index(pri_text[i]):] + new_s[i][:new_s[i].index(pri_text[i])])
输出排序后的结果得到:
HGVSFUWIKPBELNACZDTRXMJQOY
CPMNZQWXYIHFRLABEUOTSGJVDK
BVIQHKYPNTCRMOSFEZWAXJGDLU
TEQGYXPLOCKBDMAIZVRNSJUWFH
SLOQXVETAMKGHIWPNYCJBFZDRU
XQYIZMJWAORPLNDVHGFCUKTEBS
WATDSRFHENYVUBMCOIKZGJXPLQ
CEONJQGWTHSPYBXIZULVKMRAFD
RJLXKISEFAPMYGHBQNOZUTWDCV
QWXPHKZGJTDSENYVUBMLAOIRFC
GOIKFHENYVUWABMCXPLTDSRJQZ
LTDENQWAOXPYVUIKZGJBMCSRFH
ENYSRUBMCQWVJXPLTDAOIKFZGH
SWAYXPLVUBOIKZGJRFHENMCQTD
通过观察,倒数第六列疑似解出的密码
继续写,提取每行倒数第六个字符
print('flag{',end='')
for i in ans:
print(i[-6], end='')
print('}')
得到结果flag{XSXSBUGKUADMIN}
提交答案发现结果不对,尝试用小写输出,修改代码:
print('flag{',end='')
for i in ans:
print(i[-6].lower(), end='')
print('}')
最终得到flag。
flag{xsxsbugkuadmin}
完整代码:
s = ['ZWAXJGDLUBVIQHKYPNTCRMOSFE',
'KPBELNACZDTRXMJQOYHGVSFUWI',
'BDMAIZVRNSJUWFHTEQGYXPLOCK',
'RPLNDVHGFCUKTEBSXQYIZMJWAO',
'IHFRLABEUOTSGJVDKCPMNZQWXY',
'AMKGHIWPNYCJBFZDRUSLOQXVET',
'GWTHSPYBXIZULVKMRAFDCEONJQ',
'NOZUTWDCVRJLXKISEFAPMYGHBQ',
'QWATDSRFHENYVUBMCOIKZGJXPL',
'WABMCXPLTDSRJQZGOIKFHENYVU',
'XPLTDAOIKFZGHENYSRUBMCQWVJ',
'TDSWAYXPLVUBOIKZGJRFHENMCQ',
'BMCSRFHLTDENQWAOXPYVUIKZGJ',
'XPHKZGJTDSENYVUBMLAOIRFCQW']
pri_key = [2, 5, 1, 3, 6, 4, 9, 7, 8, 14, 10, 13, 11, 12]
pri_text = 'HCBTSXWCRQGLES'
new_s = []
for i in range(0, 14):
new_s.append(s[pri_key[i] - 1])
ans = []
for i in range(0, 14):
ans.append(new_s[i][new_s[i].index(pri_text[i]):] + new_s[i][:new_s[i].index(pri_text[i])])
# for i in ans:
# print(i)
print('flag{',end='')
for i in ans:
print(i[-6].lower(), end='')
print('}')