zoukankan      html  css  js  c++  java
  • Poem Codes

    ⭐Poem Codes

    Poem Code 最显著的特点就是一首诗歌。 详情请戳这里


    让我们一起来过滤一遍这个神奇的加密过程~

    ① 给出一首诗歌

    for my purpose holds to sail beyond the sunset, and the baths of all the western stars until I die.

    ② 给出5个关键单词。

    “for”, “sail”, “all”, “stars”, “die.”

    对其进行拆散:

    f o r s a i l a l l s t a r s d i e

    接下来按照 字母表顺序 进行编号,若遇相同字母,则继续 +1

    f o r s a i l a
    6 12 13 15 1 7 9 2
    l l s t a r s d
    10 11 16 18 3 14 17 4
    i e
    8 5

    ③ 将要传递的消息进行加密。

    We have run out of cigars, situation desperate。

    先对对其进行编码。因为给出的5个关键词,其长度为18.所以以18为一组。

    若一组长度不满18,则用abc(不要求有序)进行补充。



    将排好的消息,按照之前给出的诗歌字母编号写下密文。

    for my purpose holds to sail beyond the sunset, and the baths of all the western stars until I die.

    如, for --> eud tdk oek 那么得到的又可以按照5个(适当个数)为一组进行重新分组,得到最后密文。


    ⭐例题

    接下来我们来看一题。 【攻防世界】题目链接 【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


    解题脚本


    已知原理,我们可以运用网上大佬的 解密工具 ,解密脚本如下:

    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 encrypt(code, poem, msg):
    	# Load all words of the poem into a temporary list
    	twords = loadlist(poem)
    
    	# Select only those words specified in the code in a new list
    	pwords = ''
    	for c in code: pwords += twords[c].lower()
    	plen = len(pwords)
    
    	# We can only support encoding all alphabetical letters, a key length greater len(abc) is not reasonable here
    	if plen > len(abc): sys.exit(3)
    
    	# Assign an index for each letter in the key based on the alphabet
    	pcode = [None] * plen
    	count = 0
    	while(count<plen):
    		for al in abc:
    			for pc, pl in enumerate(pwords):
    				if al!=pl: continue
    				pcode[pc]=count
    				count+=1
    
    	# Load all words of the message into a string
    	mwords = ''
    	for line in open(msg, 'r'):
    		for w in line.split(): mwords+=w.lower()
    	mlen = len(mwords)
    
    	# Split message into chunks of size plen, append random (here alphabet) characters to fill the last chunk, if necessary
    	cpairs = []
    	curlen = plen
    	while(curlen<mlen):
    		cpairs.append(mwords[curlen-plen:curlen])
    		curlen+=plen
    	rword = mwords[curlen-plen:curlen]
    	rlen = len(rword)
    	if rlen < plen: rword += abc[:plen-rlen]
    	cpairs.append(rword)
    
    	# Encrypt the message according to the key
    	cip = ''
    	for i in code: cip+=abc[i]
    	cip+=' '
    	for i in pcode:
    		for pair in cpairs:
    			cip += pair[i]
    		cip+=' '
    	return cip
    
    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
    
    # first argument = poem
    # second argument = ciphertxt or msg
    if len(sys.argv) != 3: sys.exit(2)
    
    #print encrypt([0, 5, 13, 16, 19], sys.argv[1], sys.argv[2])
    decrypt(sys.argv[1], sys.argv[2])
    

    【注意】 该脚本是python2哦!把诗歌命名为 poem 信息命名为 msg

    python poemcode.py poem msg
    

    或者直接下载整份github源文件:执行如下命令:

    python poemcode.py examples/2/ctfpoem  examples/2/ctfcip
    


    最终找到flag

    ifyouthinkcryptographyistheanswertoyourproblemthenyoudonotknowwhatyourproblemisabcdefghijklmnopqrstu
    

    【侵权删】【参考链接】:https://blog.csdn.net/dchua123/article/details/105470394/


    【转载请放链接】:https://www.cnblogs.com/Jlay/p/Poem_Codes.html

  • 相关阅读:
    图解设计模式-Visitor模式
    图解设计模式-Decorator模式
    图解设计模式-Strategy模式
    图解设计模式-Bridge模式
    HashMap源码
    LinkedList源码
    Vector源码
    ArrayList源码
    图解设计模式-Abstract Factory模式
    图解设计模式-Builder模式
  • 原文地址:https://www.cnblogs.com/Jlay/p/Poem_Codes.html
Copyright © 2011-2022 走看看