CTF竞赛-古典密码

本文为CTF Crypto加解密方向,主要记录古典密码的解题过程

Posted by Yewbs on April 7, 2018

Title: Sunlight and Shadow
painter: Albert Bierstadt
Creator Lifespan: 1830 - 1902
Creator Nationality: American
Creator Gender: male
Creator Death Place: New York, NY
Creator Birth Place: Solingen, Germany
Date Created: 1862
Location: United States
Physical Dimensions: w901.7 x h1054.1 in
Type: Painting
credit line source: Museum
Credit Line: Gift of Mr. and Mrs. John D. Rockefeller

CTF竞赛题目类型主要包含 Web 网络攻防Reverse 逆向工程Pwn 二进制漏洞利用Crypto 密码攻击Mobile 移动安全 以及 Misc 安全杂项 这六个类别。

本文为Crypto加解密方向。

赛题

初始来源

#第三届上海市大学生网络安全大赛# #classical#

赛题传送门

i春秋CTF大本营

【赛题类型】—>【CTF训练】

【比赛名称】—>【全部】

【题目类型】—>【Crypto】

选择价值 50pt,类型为 Crypto,名称为【classical】的题目:

ctf-20180407210853034

解题过程

题目内容为: 下载文件打开后为一段编码:

1
Ld hcrakewcfaxr, f hofjjlhfo hlaxuc lj f krau ev hlaxuc kxfk zfj tjui xljkeclhfoor gtk dez xfj vfooud, vec kxu pejk afck, ldke iljtju. Ld hedkcfjk ke peiucd hcrakewcfaxlh foweclkxpj, pejk hofjjlhfo hlaxucj hfd gu acfhklhfoor hepatkui fdi jeoyui gr xfdi. Xezuyuc, OrmkO3vydJCoe2qyNLmcN2qlpJXnM3SxM2Xke3q9 kxur fcu foje tjtfoor yucr jlpaou ke gcufn zlkx peiucd kuhxdeoewr. Kxu kucp ldhotiuj kxu jlpaou jrjkupj tjui jldhu Wcuun fdi Cepfd klpuj, kxu uofgecfku Cudfljjfdhu hlaxucj, Zecoi Zfc LL hcrakewcfaxr jthx fj kxu Udlwpf pfhxldu fdi guredi. F btlhn gcezd veq mtpa eyuc kxu ofsr iew.

这段编码看着有正常的空格作为分隔符,还有标点符号,可以猜测为一段正常段落经过了某种编码。

且发现存在单个字符的转化,第一想法应该是使用了字符统计来做编码转换。

  • 先用常用的字符统计在线工具quip试试:

    ctf-20180407211413755

  • 明显第一个答案比较符合正常语言的语法,于是在第一个答案中找到特殊段落:

    LyjtL3fvnSRlo2xvKIjrK2ximSHkJ3ZhJ2Hto3x9

    下面就需要破解上述编码。

    先后尝试了base系列编码转换,md5碰撞等。均没有合适的结果。这里卡了一下。

    再回头来看题目为classical,这段文字里面也介绍了古典密码学的相关内容,而我们到这里为止还没有用到古典密码学的任何知识,突破口会不会在这呢?

  • 古典密码中最常用的也就是凯撒密码了,这里会不会是做了凯撒位移后再做了base系列的加密呢?写段代码试一试:

import base64

upperDict=['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']
lowerDict=['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']

def cesarWithLetter(ciphertext,offset):
    '''
    凯撒密码 :
        只转换字母(包括大写小写)
    参数 : 
        ciphertext : 明文
        offset : 偏移量
    '''
    result = ""
    for ch in ciphertext:
        if ch.isupper():
            result=result+upperDict[((upperDict.index(ch)+offset)%26)]
        elif ch.islower():
            result=result+lowerDict[((lowerDict.index(ch)+offset)%26)]
        elif ch.isdigit():
            result=result+ch
        else:
            result=result+ch
    return result

strs = "LyjtL3fvnSRlo2xvKIjrK2ximSHkJ3ZhJ2Hto3x9"

res1 = []
for i in range(25):
    res1.append(cesarWithLetter(strs, i+1))

res2 = []
for i in res1:
    res2.append(base64.b64decode(i))
print(res2)

运行输出为:

1
[b'39.3x0\xa14\xa6\xa7l\xb0,\x99,/l\xa3\x9d2%+p"+b.\xa7|\xbd', b'5\xa9o7xq\xa5D\xe7\xabl\xf10\xa9m3l\xe4\xa1Bf/pc/bo\xab|\xfd', b'9\xb9\xb0;x\xb2\xa9U(\xaff\xb24\xb9\xae7f\xa5\xa5R\xa73p\xa43b\xb0\xafv\xbd', b'=\xc9\xf1?x\xf3\xadei\xb3f\xf38\xc9\xef;f\xe6\xa9b\xe87p\xe57b\xf1\xb3v\xfd', b"A\xda2Cy\x1a\xb1u\xaa\xb7g\x1a<\xda0?g'\xads);q&;c2\xb7w=", b'E\xeasGy[\xb5\x85\xeb\xbbg[@\xeaqCgh\xb1\x83j?qg?cs\xbbw}', b'I\xfa\x9aKy\x9c\xb9\x96,\xbfg\x9cD\xfa\xb2Gg\xa9\xb5\x93\xabCq\xa8Cc\x9a\xbfw\xbd', b'N\n\xdbOy\xdd\xbc\x06m\xc3g\xddI\n\xf3Kg\xea\xb8\x03\xecGq\xe9Gc\xdb\xc3w\xfd', b'R\x1b\x1cSz\x1e\xc0\x10.\xc7h\x1eM\x1b\x1aOh+\xbc\x14-Kr*Kd\x1c\xc7x=', b'V+]Wz_\xc4 o\xcbh_Q+[Shl\xc0$nOrkOd]\xcbx}', b'Z;\x9e[z\xa0\xc80\xb0\xcfh\xa0U;\x9cWh\xad\xc44\xafSr\xacSd\x9e\xcfx\xbd', b'^K\xdf_z\xe1\xcc@\xf1kh\xe1YK\xdd[h\xee\xc8D\xf0Wr\xedWd\xdfkx\xfd', b'b\\ c{"hQ2oi"]\\\x1e_i/\xccU1[s.[e oy=', b'flag{classical_cipher_so_easy}', b'\x02|\xa2\x03{\xa4pq\x9awi\xa4e|\xa0gi\xb1lu\xb3cs\xb0ce\xa2wy\xbd', b'\x06\x8c\xe3\x07{\xe5t\x81\xdb{i\xe5\x01\x8c\xe1\x03i\xf2p\x85\xdags\xf1ge\xe3{y\xfd', b'\n\x96\xa4\x0b|&x\x92\x1c\x7fj&\x05\x96\xa2\x07j3t\x96\x1b\x03t2\x03f$\x7fz=', b'\x0e\xa6\xe5\x0f|g|\xa2]\x83jg\x08\x06\xe3\x0bjZx\xa6\\\x07ts\x07fe\x83z}', b'\x12\xb7&\x13|\xa8\x80\xb2\x9e\x87j\xa8\x0c\x17$\x0fj\x9b|\xb0\x1d\x0bt\x9a\x0b`&\x87z\xbd', b"\x16\xc7g\x17|\xe9\x84\xc2\xdf\x8bj\xe9\x10'e\x13j\xdc\x80\xc0^\x0ft\xdb\x0f`g\x8bz\xfd", b'\x1a\xd7\xa8\x1bv\xaa\x88\xd3 \x8fk*\x147\xa6\x17k\x1d\x84\xd0\x9f\x13u\x1c\x13`\xa8\x8f{=', b'\x1e\xe7\xe9\x1fv\xeb\x8c\xe3a\x93kk\x18G\xe7\x1bk^\x88\xe0\xe0\x17u]\x17`\xe9\x93{}', b'"\xf8*#w,\x90\xf3\xa2\x97k\xac\x1cX(\x1fk\x9f\x8c\xf1!\x1bu\x9e\x1ba*\x97{\xbd', b"'\x08k'wm\x95\x03\xe3\x9bk\xed hi#k\xe0\x91\x01b\x1fu\xdf\x1fak\x9b{\xfd", b"+\x18\xac+w\xae\x99\x14$\x9fl.$x\xaa'l!\x95\x11\xa3#v #a\xac\x9f|="]

搜索flag,得到:

flag{classical_cipher_so_easy}

至此,得到flag。

总结

古典密码也是Crypto常见的类型。

这里主要介绍多种加解密和编码的融合题目,需要脑洞大一点,也需要多练习,形成肌肉记忆。