CTF-Crypto题目Decrypt-the-Message的WriteUp
Decrypt-the-Message
题目信息:
解密这段信息!
附件:
The life that I have
Is all that I have
And the life that I have
Is yours.
The love that I have
Of the life that I have
Is yours and yours and yours.
A sleep I shall have
A rest I shall have
Yet death will be but a pause.
For the peace of my years
In the long green grass
Will be yours and yours and yours.
decrypted message: emzcf sebt yuwi ytrr ortl rbon aluo konf ihye cyog rowh prhj feom ihos perp twnb tpak heoc yaui usoa irtd tnlu ntke onds goym hmpq
涉及知识点:
peom codes(诗歌加密)
诗歌密码在第二次世界大战中被广泛使用,它的工作方式如下:
首先,你需要先记住一首诗歌,它不需要太长,也不需要完整。比如下面这句截取自尤利西斯诗歌的片段就可以。
for my purpose holds to sail beyond the sunset, and the baths of all the western stars until I die.
然后,从中选择五个词作为关键字:比如“ for”,“ sail”,“ all”,“ stars”,“ die”。
接着,将它们串在一起,然后给字母编号,以“ a”开头为1,第二个“ a”开头为2,依此类推;如果没有第二个“ a”,则“ b”的编号为2;或者 如果没有“ b”,则“ c”被标记为2,依此类推,直到我们为所有字母编号。结果:
现在,假设我们要对下面这个消息进行加密:We have run out of cigars, situation desperate.
由于我们在诗歌中选中了18个字母,因此我们以18个字母为一组写出该消息,并用无用的字母填充结尾,如下所示:
注意,在第一个表格(关键字表格)中,第一个字母“f”,它的下面是6;第二个字母是“o”,下面是12。
相对应地,在第二个表格(我们填充的分组的消息)中,第六列字母是“eud”,而第12列是“tdk”。
我们一般按照五个字母为一组发送加密消息,这样可以减少(但当然不能消除)传输错误。
因此,我们信息的第一部分将是eudtd koekc pmwrt
尝试手动加密整个消息!您会发现这很容易做到,您还将看到错误在何处以及如何产生。
当然,我们还必须告诉接收方,我们选择了哪五个词作为关键字,分别是第1个,第6个,第14个,第17个和第20个。最简单的方法是替换字母,因此:“afnqt”将被附加到加密的消息上。然后,接收者可以(大致)遵循相反的步骤来解密消息。
当然,在以上的简短讨论中我们忽略了所有的细微差别。但要知道,用诗歌密码加密的短消息是很难破解的,尤其是当诗歌很少被用于加密或仅用其加密一次。如果这首诗是经常使用的,或者是众所周知的,那么破解用它加密的消息就不难了。另外,诗歌密码具有易用性和易记性的优点,并且不需要任何计算设备。
link: http://wmbriggs.com/post/1001/?doing_wp_cron=1626104322.6441810131072998046875
解题思路:
1.观察附件,发现有一段诗歌以及密文,考虑诗歌加密。
2.由于诗歌加密解密较为复杂,使用现成脚本poemcode.py
3.将诗歌复制到名为peom的文件,将密文复制到cip的文件,删除标点符号
4.运行脚本,从输出中寻找一个最自然的句子,即为flag
附件:
#poemcode.py
#参考:https://github.com/abpolym/crypto-tools/tree/master/poemcode
import sys
import itertools
from os import listdir
from os.path import isfile, join
abc = 'abcdefghijklmnopqrstuvwxyz'
def loadlist(infile):
tlist = []
for line in open(infile, 'r'):
for w in line.split():
tlist.append(w.lower())
return tlist
def decrypt(poem, cip):
# Load all words of the poem into a temporary list
twords = loadlist(poem)
# Load all cipher chunks of the ciphertext into a list
cwords = loadlist(cip)
# Get the code rom the first chunk and remove it from the ciphertext list
code = []
for i in cwords.pop(0):
code.append(abc.index(i))
# Select only those words specified in the code in a new multi-arrayed list
xwords = [[] for x in range(len(code))]
for xcount, c in enumerate(code):
tlen = c
while(c < len(twords)):
xwords[xcount].append(twords[c].lower())
c += 26
# Get all possible combinations
for comb in itertools.product(*xwords):
pwords = ''
for c in comb:
pwords += c
plen = len(pwords)
# Rearrange the chunks according to the key
pcode = [None] * plen
count = 0
while(count < plen):
for al in abc:
for pc, pl in enumerate(pwords):
if al != pl:
continue
pcode[count] = cwords[pc]
count += 1
# Decrypt the ciphertext
msg = ''
wlen = len(pcode[0])
for c in range(0, wlen):
for word in pcode:
msg += word[c]
print(msg)
decrypt("poem", "cip")
FLAG
ifyouthinkcryptographyistheanswertoyourproblemthenyoudonotknowwhatyourproblemisabcdefghijklmnopqrstu
参考:
作者:damedane-qiuqiu