news 2026/6/14 3:16:28

CTF新手也能懂:手把手带你复现‘羊城杯’那道Toy Cipher签到题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CTF新手也能懂:手把手带你复现‘羊城杯’那道Toy Cipher签到题

CTF新手也能懂:手把手带你复现‘羊城杯’那道Toy Cipher签到题

第一次参加CTF比赛时,看到满屏的加密字符串和陌生的术语,我完全不知道从何下手。直到遇到这道"羊城杯"的签到题,才真正理解了什么是"逆向思维"。今天我们就用最直白的语言,拆解这道看似复杂实则精巧的Toy Cipher题目,让你也能体验破解密码的快感。

1. 题目初探与文件分析

打开BUUCTF平台,找到这道名为"signin"的题目,首先看到两个关键信息:

  1. 一个名为signin.txt的文件,内容如下:

    BCEHACEIBDEIBDEHBDEHADEIACEGACFIBDFHACEGBCEHBCFIBDEGBDEGADFGBDEHBDEGBDFHBCEGACFIBCFGADEIADEIADFH
  2. 一篇名为《Toy Cipher》的论文链接,指向密码学学术网站IACR

签到题的特点:通常考察基础知识和工具使用,不会涉及复杂算法。这道题给出的提示非常明确——需要先理解论文中的"四个一组对照表转换"方法。

我们先下载论文快速浏览,发现第二页有个关键对照表:

字母编码字母编码
MACEGRADEG
......YBDFI

这个表格就是我们的解密钥匙。每个字母对应一个4字符编码,这正是题目提示的"四个一组"的含义。

2. 解密第一阶段:编码转字母

观察signin.txt文件内容,确实是由ACEG等4字符组合连续排列而成。我们需要编写Python脚本将其转换为字母:

# 建立编码到字母的字典映射 cipher_dict = { 'ACEG':'M', 'ADEG':'R', 'BCEG':'K', 'BDEG':'S', 'ACEH':'A', 'ADEH':'B', 'BCEH':'L', 'BDEH':'U', 'ACEI':'D', 'ADEI':'C', 'BCEI':'N', 'BDEI':'V', 'ACFG':'H', 'ADFG':'F', 'BCFG':'O', 'BDFG':'W', 'ACFH':'T', 'ADFH':'G', 'BCFH':'P', 'BDFH':'X', 'ACFI':'E', 'ADFI':'I', 'BCFI':'Q', 'BDFI':'Y' } # 读取密文文件 with open('signin.txt', 'r') as f: ciphertext = f.read().strip() # 每4个字符为一组进行转换 plaintext = '' for i in range(0, len(ciphertext), 4): block = ciphertext[i:i+4] plaintext += cipher_dict.get(block, '?') # 找不到对应字母时用?代替 print("第一阶段解密结果:", plaintext)

运行后会输出:

LDVUUCMEXMLQSSFUSXKEOCCG

提示:如果遇到编码错误,可以尝试在open()中加入encoding='utf-8'参数

3. 解密第二阶段:字母替换

根据论文提示,我们需要将对照表倒序排列后再进行一次替换。原始字母列表和倒序后的列表对应关系如下:

original = ['M','R','K','S','A','B','L','U','D','C','N','V','H','F','O','W','T','G','P','X','E','I','Q','Y'] reversed = original[::-1] # 倒序排列

用表格更直观展示对应关系:

原始字母MRK...QY
倒序字母YQI...RM

现在对第一阶段结果进行替换:

first_stage = 'LDVUUCMEXMLQSSFUSXKEOCCG' flag = '' for char in first_stage: if char in original: index = original.index(char) flag += reversed[index] else: flag += char # 处理可能的不在列表中的字符 print("第二阶段解密结果:", flag)

此时输出为:

TOYSAYGREENTEAISGWHTCOOL

4. 最终Flag格式化

CTF比赛中flag通常有固定格式,比如用{}包裹。观察输出结果,发现"GWHT"和"COOL"正好可以转换为标准flag格式:

final_flag = flag.replace('GWHT', 'GWHT{').replace('COOL', 'COOL}') print("最终Flag:", final_flag)

得到正确flag:

TOYSAYGREENTEAISGWHT{COOL}

在BUUCTF平台提交时,需要将GWHT替换为flag(根据题目描述判断):

flag{TOYSAYGREENTEAISCOOL}

5. 解题思路总结与技巧

通过这道题,我总结了CTF密码学签到题的几个常见套路:

  1. 编码替换:将一种字符形式转换为另一种

    • 可能是字母与数字/符号的相互转换
    • 也可能是像本题这样的字母到字母组的映射
  2. 多层加密

    • 第一层:四个一组编码转换
    • 第二层:字母倒序替换
    • 第三层:格式调整
  3. 论文线索

    • 密码学题目常会引用学术论文
    • 关键信息通常在论文前几页的图表中

实用调试技巧

  • 在每步转换后打印中间结果
  • 使用try-except捕获可能的错误
  • 对边界情况做检查(如文件末尾不足4字符时)

第一次成功解出CTF题目时,那种"啊哈时刻"的兴奋感至今难忘。这道题教会我:看似复杂的密码系统,拆解后可能只是几个简单步骤的组合。下次遇到类似题目,不妨先找找有没有对照表或替换规则。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 3:16:29

GP2Y1014AU0F粉尘传感器数据不准?可能是这5个坑你没注意

GP2Y1014AU0F粉尘传感器精度优化实战指南在嵌入式环境监测项目中,粉尘传感器的数据稳定性直接关系到整个系统的可靠性。GP2Y1014AU0F作为一款性价比较高的光学粉尘传感器,其实际应用中常出现数据跳变、基准漂移等问题。本文将结合硬件设计、信号处理和算…

作者头像 李华
网站建设 2026/6/14 4:08:04

鸣潮自动化终极指南:5分钟掌握后台自动战斗全功能

鸣潮自动化终极指南:5分钟掌握后台自动战斗全功能 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 鸣潮自动化工具ok-ww…

作者头像 李华
网站建设 2026/6/14 3:28:37

Redis 5.0 Stream消息队列实战:手把手教你处理消费失败、死信和内存清理

Redis Stream消息队列生产级解决方案:消费失败处理与系统健壮性设计在分布式系统架构中,消息队列作为解耦生产者和消费者的关键组件,其可靠性和稳定性直接影响着整个系统的服务质量。Redis 5.0引入的Stream数据结构,凭借其轻量级、…

作者头像 李华
网站建设 2026/6/13 14:15:45

CSDN AI看板关键词排名功能上线倒计时?内部信流出:V2.3.7将开放SERP模拟引擎,仅限首批500家认证企业白名单接入

更多请点击: https://kaifayun.com 第一章:CSDN AI 数字营销的数据看板能查看文章关键词排名数据吗? CSDN AI 数字营销平台的数据看板目前**不直接提供第三方搜索引擎(如百度、360、搜狗)中文章关键词的实时自然排名数…

作者头像 李华
网站建设 2026/6/14 3:16:45

MCprep终极指南:专业级Minecraft动画制作效率革命

MCprep终极指南:专业级Minecraft动画制作效率革命 【免费下载链接】MCprep Blender python addon to increase workflow for creating minecraft renders and animations 项目地址: https://gitcode.com/gh_mirrors/mc/MCprep 在Minecraft动画创作的世界中&a…

作者头像 李华