Blog

Make it work, make it right, make it fast

Nov 25, 2021 - 1 minute read - CTF 编程

凯撒密码(Caesar cipher)

一、Introduction

今天在做 CTF题目的时候,看到给出内容有点一脸懵,题目如下,要求自然是解出flag了:

synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}

该文本的格式和flag{xxxx}答案格式非常相像,于是做了个小实验,用flag的ASCII码减去 synt 的ASCII码, python代码如下:

raw="sync"
result="flag"
for i in range(0, 3):
        print(ord(raw[i]) - ord(result[i]))

结果输入全都是13,证明了二者的字符是有固定的间隔的,答案也就呼之欲出了。

然后以13作为间隔,将题目内容给出的字符和13做差,得出给出后的ASCII码,这时候忽然发现还是有问题,后来google了以下,才知道这道题考察的是凯撒密码的知识。

凯撒密码的定义如下:

凯撒密码(英语:Caesar cipher),或称凯撒加密凯撒变换变换加密,是一种最简单且最广为人知的加密技术。凯撒密码是一种 替换加密技术,** 明文中的所有字母都在 字母表上向后(或向前)**按照一个固定数目进行偏移后被替换成 密文

凯撒密码示意图

这时候答案就明了了,仅对字母表内容做差,python代码内容如下:

import re

pattern = re.compile(r'[a-z]', re.I)
raw="synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}"
result=""

for i in raw:
        if pattern.match(i):
                result += chr(ord(i) - 13)
                continue
        result += i
print(result)

//flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}