📌 题目信息
| 项目 | 内容 |
|---|---|
| 题目名称 | 传统知识+古典密码 |
| 题目来源 | BUUCTF Crypto |
| 题目类型 | 密码学 |
| 子分类 | 古典密码 + 编码 |
| 考点 | 六十甲子(天干地支)、ASCII码、栅栏密码、凯撒密码 |
| 难度 | ⭐ |
| 最终 Flag | flag{SHUANGYU} |

🛠️ 使用工具
- 六十甲子对照表(天干地支顺序)
- ASCII码表
- 栅栏密码解密工具
- 凯撒密码解密工具
📝 解题思路
题目名称中的 "传统知识" 指向天干地支(六十甲子),"古典密码" 指向栅栏密码和凯撒密码。
第 1 步:传统知识解码------天干地支转数字
先将文件添加.zip的后缀名(因为文件开头有PK,PK 是 ZIP 文件格式的固定文件头标识,即Phillip Katz的缩写),然后打开。


题目给出一串天干地支年份:
辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳
根据六十甲子表,将每个干支对应到其序号(从1开始计数):
| 天干地支 | 序号 |
|---|---|
| 辛卯 | 28 |
| 癸巳 | 30 |
| 丙戌 | 23 |
| 辛未 | 8 |
| 庚辰 | 17 |
| 癸酉 | 10 |
| 己卯 | 16 |
| 癸巳 | 30 |
得到数字序列:28, 30, 23, 8, 17, 10, 16, 30
题目背面写有 "+甲子" ,一甲子为 60年,所以每个数字都加上 60:
28+60=88,30+60=90,23+60=83,8+60=68,
17+60=77,10+60=70,16+60=76,30+60=90
得到:88, 90, 83, 68, 77, 70, 76, 90
第 2 步:ASCII码转换
将上一步得到的数字对照 ASCII码表 转换为字符:
| 数字 | ASCII字符 |
|---|---|
| 88 | X |
| 90 | Z |
| 83 | S |
| 68 | D |
| 77 | M |
| 70 | F |
| 76 | L |
| 90 | Z |
得到字符串:XZSDMFLZ
第 3 步:古典密码------栅栏密码解密
对 XZSDMFLZ 进行栅栏密码解密 (栏数为2和4尝试,因为密文 XZSDMFLZ 长度为 8,8 的因数有:1、2、4、8。排除1(等于没加密)和 8(等于原样),只剩 2 和 4 两种可能)。
解密时选择栏数为 4 ,得到结果
XMZFSLDZ(这里是要靠猜的/暴力破解的,只有栏数=4 的解密结果,在凯撒位移后能产生人类可读的拼音,所以反推栏数必然为 4。)
栅栏密码解密(栏数=4)原理:
-
将密文按4行排列(因为栏数为4),注意排列时按列排,因为加密时就是按列读取并形成密文,这里需要还原加密时的排列场景。
X M 第一行
Z F 第二行
S L
D Z -
然后再按行读取(因为明文就是先按行排列,再按列读取,并形成密文,这里要反过来)即可还原出明文顺序。
第 4 步:古典密码------凯撒密码解密
对 XMZFSLDZ 进行凯撒密码暴力枚举(尝试所有26种位移)。
位移量为 5 时,得到有意义的拼音:
XMZFSLDZ --(凯撒位移5)--> SHUANGYU

⚠️ 注意 :
SHUANGYU是拼音"霜羽"(题目来源作者名)。最终 Flag 需要大写提交。
第 5 步:验证
将 SHUANGYU 用 flag{} 包裹提交:
flag{SHUANGYU}
🏁 最终 Flag
flag{SHUANGYU}
补充:为什么做题要按照这个顺序?
在古典密码的套娃题中,"顺序"不是靠提示决定的,而是靠"尝试-排除-验证"的逻辑链条反向锁定的。
下面拆解一下"为什么一定是先栅栏后凯撒",以及"为什么不考虑其他密码"。
1. 为什么方案二(先凯撒后栅栏)被我们排除了?
我们试着按方案二来解一下,看看会得到什么结果:
密文是 XZSDMFLZ。
-
第 1 步(方案二的解密) :先对密文做凯撒暴力枚举(位移 1~25)。
比如尝试最常见的位移 5 :
XZSDMFLZ每位字母向前移 5 位,得到CEXIRKQE。再尝试位移其他值,得到的都是诸如
YATE...、D...之类的无意义字母组合。 -
第 2 步(方案二的解密) :对上一步得到的乱码做栅栏(栏数 2)解密。
拿位移 5 的结果
CEXIRKQE举例,栅栏 2 解密(分成CEXI和RKQE,交替读取)得到:CREKXQIE。
结论 :把位移 1 到 25 全部试一遍,再进行栅栏 2 或 4 的解密,没有任何一组结果能拼出 SHUANGYU 或任何有意义的拼音/英文单词。
3. 为什么方案一(先栅栏后凯撒)被我们选中了?
按方案一解密:
-
第 1 步 :先栅栏(尝试因数 2 和 4)。
栏数 2 得到
XMZFSLDZ(栏数 4 得到乱码,被淘汰)。 -
第 2 步 :对
XMZFSLDZ做凯撒暴力枚举。位移 5 时,恰好得到
SHUANGYU(拼音,有明确语义)。
结论 :在穷举了"所有可能的顺序(2种)× 所有可能的栏数(2种)× 所有可能的位移(25种)"之后,只有这一条路径产生了人类可读的语义。
💡 密码学中这叫 "明文校验(Plaintext Validation)" ------不是我们凭空选了顺序,而是唯一能跑出正确答案的那条路,反向锁定了加密时作者采用的顺序。
4. 为什么不考虑其他古典密码(如维吉尼亚、培根等)?
在实战中,我们遵循 "奥卡姆剃刀原则"(如无必要,勿增实体):
- 维吉尼亚密码 :需要密钥(Key),而题目没有给出任何密钥提示,且密文长度只有 8 位,根本无法推测密钥,强行解密只会得到无穷多种可能,不符合 CTF 出题逻辑。
- 培根密码 :需要将字母转为 A/B 组合(5 个一组),但
XZSDMFLZ长度 8,不是 5 的倍数,强行分组会剩余,无法解。 - 栅栏 + 凯撒 :题目名称"传统知识+古典密码 "明确指向最经典、最基础的几种古典密码。且在 ASCII 转出
XZSDMFLZ后,这串字符全是字母、长度短、无特殊符号,栅栏(置换)和凯撒(替换)恰好是能处理这种纯字母串的最简单、最自然的两种变换。
CTF 解题潜规则:先用最简单的变换(栅栏、凯撒、Base64)试,解出语义就收手。如果解不出,再考虑进阶算法。本题在第一个组合(栅栏→凯撒)就命中了,说明这就是出题人的意图,不需要再浪费时间去试其他无关算法。
🏁 一句话总结
顺序不是题目提示的,而是"穷举所有参数组合后,唯一能产出汉语拼音(语义)的那个结果"反向推导出来的。
如果先凯撒后栅栏能出
SHUANGYU,那我们现在用的就是先凯撒后栅栏。只可惜它出不来,所以只能选现在的顺序。这在密码分析中叫做 "暴力枚举 + 语义筛选"。