Enigma:从两段密文里破译出口令

01 / 谜面

截获到的两段密文,同一套机器配置:

PJOYUTAUPLOIMJNNXNEZKPQ
YPOSMKSKVSLLB

已知第一段的明文是 VORHERSAGEBEREICHSIEBEN,第二段的明文是 zfb 红包口令。 没有给机器型号、转子顺序、环设置、起始位置,也没有给插线板——只有「1940 年」这个时间线索和一段显然的德文。单个红包期望值 2.56 元。

02 / 微博

发布 原微博 ↗
让我们把时间拉回到 1940 年。 分享截获到的相同配置下的两段密文。 PJOYUTAUPLOIMJNNXNEZKPQ YPOSMKSKVSLLB 已知第一段的明文是 VORHERSAGEBEREICHSIEBEN。 而第二段的明文是 zfb 红包口令。 单个红包期望值:2.56元,自己决定要不要让 Agent 尝试。
复盘 原微博 ↗
简单聊聊昨晚的红包谜题。历时两个小时才被领完,算是比较持久的一次。 从谜面上看,很容易联想到 Enigma 密码机,比如时间线索“1940年”,比如 crib 很明显是德文,那么谜题就几乎指向了破译 Enigma。由于谜面没有给出 Enigma 的型号和配置,那么聪明的 Agent 会想到可以基于 Bombe 思路实现一个简化版的约束求解器。 从转评与群内讨论的情况来看,Agent 破译的时长区分度还是蛮大的。有七八分钟解决的,有半小时解决的,有一小时解决的,也有主动/被动放弃的。 从思路来看,首先需要实现一个 Enigma 模拟器,利用 crib 排除存在矛盾的转子、反射器和初始位置等配置,并推导插线板关系,最后用谜面的密文明文进行校验。严谨一些的 Agent 还会做 AAAAA → BDZGO 的自检。 我发现 Deepseek 并不是不知道要用 Bombe 思路,但他是直接在思维链中推理,想着想着输出就满了。 这个谜题涉及到搜索脚本的编写,但我发现,几乎所有人都反馈 Agent 没有编写 Python 脚本,而是使用 C/C++ 或 JavaScript,就像商量好了一般。也有群友说这是第一次见自己的 Agent 写 C。我问了下,Codex 认为这是出于“性能考虑”,但后来也表示这个计算量用 Python 也是可行的。 ———— 这个红包谜题还有个值得琢磨的点,如何判断这个谜题的难度?难度会涉及到模型选择,从而影响到最终的 Cost。这也是我在最后给出红包金额期望值的原因。 期望值 2.56元,更强的模型可能提高成功率,但费用更高。用便宜的模型就得接受骰垦烧掉但解不出口令的风险。而任务总耗时会决定能不能领到红包。 比如就有群友花了3美刀的Grok骰垦,领了3块钱红包。
测试 原微博 ↗
我把 Enigma 谜题在 opencode 上交给 Kimi-K3 来尝试。 第一轮 46 分钟 14 秒,烧掉 25.23 元。Agent 解不出来,宣告放弃。 然后我把 http://t.cn/AXWMutDz 的内容为第二轮的提示词。 第二轮 23 分钟 28 秒,烧掉 17.70 元。Agent 成功解出口令。 最终 Cost 1 小时 9 分 42 秒,42.93 元。
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 个字母)

纯字母,大小写与空格都不影响