WeChall - Training - Crypto - Digraphs
Challenge
Digraph substitution cipher — 每个明文字母编码为 2 个字符的 pair。密文保留原始空格分词,无换行。明文是标准英文,含大小写和标点。
密文约 290 字符,136 个 digraph pair,30 个唯一 digraph(26 字母 + 4
标点 !?.:)。映射关系和密码随 session 变化。
这是同音 cipher — 同一字母可能对应多个 digraph(例如 cv
和 xl 都映射到 c,qn 和
hc 都映射到
e)。这意味着纯频率分析无法唯一确定映射,需要结合词结构消歧。
Solution
第一步:识别标点 digraph
密文保留空格分词,标点出现在词尾。22 个词的固定结构:
1 | 词 0 "congratulations!" → 末尾 digraph = '!' |
第二步:用词结构逐步还原字母映射
词 0 "congratulations!" 是关键锚点 — 16 个 digraph 对应 16
个字符,且字母重复模式固定(a 出现 2 次、t 2
次、o 2 次、n 2 次)。对齐后直接得到 12
个字母映射。
然后用短词交叉验证:
1 | 词 19 "as" → 2 digraph,与词 20 首字母共享 |
逐步扩展到全部 30 个 digraph。
第三步:模拟退火(备选/验证)
纯频率分析 + 模拟退火也能解,但单独使用收敛较慢(同音 cipher 导致多个等价映射)。词结构推导出部分映射后,用模拟退火补全剩余未知 digraph 更实用。
1 | import random, math |
实测:20 次重启 × 100k 迭代,约 2 分钟,不一定收敛到正确明文。词结构推导秒出结果。
第四步:提取密码
明文末尾格式:enter this keyword as solution: [PASSWORD]!
密码在 solution: 后、! 前。提交时去掉末尾
!(它是明文标点,不是密码的一部分)。
注意事项: - 同音 cipher:同一字母可能对应多个 digraph,不能假设一一对应 - 密码随 session 变化,每次访问页面重新生成