CTF-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”将被附加到加密的消息上。然后,接收者可以(大致)遵循相反的步骤来解密消息。

当然,在以上的简短讨论中我们忽略了所有的细微差别。但要知道,用诗歌密码加密的短消息是很难破解的,尤其是当诗歌很少被用于加密或仅用其加密一次。如果这首诗是经常使用的,或者是众所周知的,那么破解用它加密的消息就不难了。另外,诗歌密码具有易用性和易记性的优点,并且不需要任何计算设备。

解题思路:

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

参考:

https://www.cnblogs.com/zhengna/p/14763913.html

作者:damedane-qiuqiu

posted @ 2021-07-16 23:28  泠雪  阅读(331)  评论(0编辑  收藏  举报