Enigma:从两段密文里破译出口令
01 / 谜面
截获到的两段密文,同一套机器配置:
PJOYUTAUPLOIMJNNXNEZKPQ YPOSMKSKVSLLB
已知第一段的明文是 VORHERSAGEBEREICHSIEBEN,第二段的明文是 zfb 红包口令。
没有给机器型号、转子顺序、环设置、起始位置,也没有给插线板——只有「1940 年」这个时间线索和一段显然的德文。单个红包期望值 2.56 元。
02 / 微博
03 / 解答与复盘(含剧透)
从谜面能读出什么
两条线索就够定性了:时间「1940 年」指向 Enigma;crib 是 VORHERSAGEBEREICHSIEBEN——德语的「天气预报区域 7」,是当年德军气象报文的常用开头,正好拿来当已知明文(crib)。
于是问题变成密码分析里的标准局面:有明文、有对应的密文,求机器配置。
怎么破:模拟器 + Bombe 约束
思路是把「找密钥」换成「排除密钥」:
1. 先写一个 Enigma 模拟器。改完先拿已知向量自检——转子 I-II-III / 反射器 B / 环 AAA / 起始 AAA,输入 AAAAA 应当得到 BDZGO;如果环设置方向搞反了,这个向量会立刻失败。另一个免费的自检是对合性:E(E(x)) == x。
2. 用 crib 做约束传播(Bombe 的核心)。对每一个候选的转子顺序、反射器、起始位置,把 crib 与 C1 逐位对齐,用「同一个字母不可能既映射到自己、又被插线板重复映射」这类约束去否决——这一步的价值是把插线板从搜索空间里消掉(10²⁴ 个密钥 → 10⁶ 量级的位置假设),而不是「算得更快」。
3. 把插线板解出来,再用完整明密文对校验。
4. 最后拿解出的配置去解第二段密文 C2,得到的 13 个字母就是口令。
严格一点的实现还会检查「有没有多组配置都能还原 crib」——如果有多把,必须要求它们解 C2 得到同一个结果,否则这道题在二义性上就是不合格的。
实测(本机)
本机跑一次全空间扫描:60 种转子排列 × 2 种反射器 × 26³ 个起始位置,用时 106 秒,能把 crib 还原的密钥恰好一把,解 C2 得到 13 个字母。 作为量级对照:1940 年代真 Bombe(TNMOC 重建机的数据)跑完 17,576 个位置要 10.4 分钟,而今天同样的搜索在普通机器上是秒级——算力差了几万倍,但这道题的难点从来不在算力。
他自己怎么复盘这一期
几个观察挺有意思,值得原样记下来: 一、Agent 的用时分布拉得很开。 从转评和群内讨论看,有七八分钟解决的、有半小时的、有一小时的,也有主动或被动放弃的。谜题历时两小时才被领完,是他做过的红包里比较持久的一次。 二、几乎没人用 Python。 「这个谜题涉及到搜索脚本的编写,但我发现,几乎所有人都反馈 Agent 没有编写 Python 脚本,而是使用 C/C++ 或 JavaScript,就像商量好了一般。」有群友说这是第一次见自己的 Agent 写 C;他去问了 Codex,得到的说法是「出于性能考虑」,但 Codex 后来也承认这个计算量用 Python 完全可行。 三、模型选择在这里直接变成了成本问题。 他把期望值 2.56 元写在谜面上,就是让人自己权衡:更强的模型成功率更高但更贵,便宜的模型有「烧了钱还解不出来」的风险,而任务总耗时决定能不能赶在红包被领完之前。有群友花 3 美元的 Grok 额度领了 3 块钱红包。 四、一个模型行为上的细节。 Deepseek「并不是不知道要用 Bombe 思路,但他是直接在思维链中推理,想着想着输出就满了」——想得足够对,但没落到代码上。
第三方测试:Kimi-K3 的一小时四十分
他在 opencode 上把同一道题交给 Kimi-K3 试了两次:
- 第一轮:46 分 14 秒,烧掉 25.23 元,解不出来,Agent 宣告放弃;
- 第二轮:把某段内容当作提示词喂进去之后,23 分 28 秒,又烧掉 17.70 元,成功解出口令。
两次加起来 1 小时 9 分 42 秒、42.93 元。 这组数字比谜题本身更像一个结论:同一道题、同一个模型,差别只在有没有一句提示;而这一期最贵的部分也不是算力,是模型的思考时间。 从本站的角度说,这一期恰好是「谜题难度该定在哪」这个问题的现场样本——太容易,Agent 几分钟就领走了;太难,红包两小时没人领完,参与者烧掉的钱远超红包面值。
结果
红包历时两个小时才被领完,是持续时间比较长的一次。谜面里那句「自己决定要不要让 Agent 尝试」其实已经点明了这一期的性质:它考的不是能不能解,而是值不值得解。
04 / 口令校验
这一期的红包口令(解出 C2 得到的 13 个字母)
纯字母,大小写与空格都不影响