00 密钥,由他人找到
姊妹卷 Barb.lat. 6956 收有同一教廷大使任期内1628年5月至8月的七十张加密纸页(DECODE R215–R285 和 R318)。其密钥于2018年3月由 Norbert Biermann 复原,Thomas Bosbach 也独立复原了它。他们的两份密钥、一份合并密钥和一份解读样例,作为附件文档存放在 DECODE 的第一条密文记录 R215 下,而不是作为密钥记录。这就是本项目抓取元数据时从未见到它们的原因。DECODE 至今仍把 6960 的全部二十八条记录标为 “Non-decrypted”。
这套系统:
- 字母用两位同音符:a = 00、02、20;e = 09、30、90;i = 05、40、50;o = 03、07、70;依此类推。
- 音节和短词用两位码组:47 che、52 con、57 per、69 di、73 la、93 to。
- 人名和头衔用 200 到 999 的三位名码本码组:360 Duca di Mantova、460 Imperatore、670 Sua Maestà、925 Spagna。
- 单个数字 1 和 8 是虚码,多出现在词的分界处。
- 双写字母常常只写一次,所以 33 既可以表示 d,也可以表示 dd。
把这个密钥套用到 DECODE 对 6960 全部二十八条记录的转录上,用动态规划把数字流切分为一位、两位和三位单元,每条记录都能读出连贯的意大利语。R286 开头是 ho riceuto la risposta datami in scritto,正是 Kiewning Nr. 153 的开头几个词。约 2,000 个名码本码组可以用 6956 密钥解出。约 1,750 个三位码组不在其中;它们大概是1629年特有的人名和头衔,仍待解决。约有 200 个数字与任何代码都对不上,这与志愿者转录中的笔误相符。未经编辑的输出在代码库中(targets/pallotto1629/key6956/decrypt_6960.txt).
这个密钥也解释了下面每一种攻击为何失败。一个虚码或一个三位码组会使其后所有两位代码的相位发生偏移,所以任何固定宽度的对齐都撑不过几个词。初次猜词匹配正是在这里中断的: 8 位于 ho 之后,却被当成了一个两位代码的第一个数字。第 04 节报告的那些长重复数字串,就是每次都以同样方式书写的名码本码组和音节码组。
01 卷册与二十八段密文
Barb.lat. 6960 在 DigiVatLib 上,地址 digi.vatlib.it/view/MSS_Barb.lat.6960,194 页,附 IIIF manifest。它是旧的二值缩微胶片扫描,图像服务自己的 info.json 给出的每页最大尺寸是 748 × 1088 像素;服务器返回的更大尺寸都只是由此放大而来。在这个尺寸下,一个数码大约十个像素宽。不过 DECODE 在登录后可见的地方存有同一批纸叶的自制扫描,尺寸为 1491 × 2066(像素面积是前者的四倍)。任何要转录这部手稿的人,都应当用这些扫描,而不是 DigiVatLib 的。
DECODE 的 R286–R313 记录就是那二十八段加密文字;R315 是整卷,在那里被描述为“mixed ciphertext and cleartext”(密文与明文混合)。每条记录的注释给出的页码范围采用同样的 DigiVatLib 页码,所以 DECODE 的第 n 页就是第 n 个画布。范围从 pp. 5–6 到 pp. 192–193,卷册自身的标题说它收的是 Pallotto 的密码 dal 4 agosto al 29 settembre 1629,但记录所载日期最晚到11月29日。
密码纸页横跨整个页宽,写满密密麻麻、连续不断的数码,每页约三十行,每行约六十六个数码。明文页的写法截然不同:写在纸叶右侧的窄栏里,留着很宽的页边。两者在卷中交替出现。
全部二十八段的转录由志愿者于2019和2020年为 DECODE 完成,可下载为 DOC_R*.txt。它们逐个数字记录数码,因此手稿中(装饰性且不规则的)分组信息丢失了。经测量共 112,805 个数字;最短的 R308 有 854 个,最长的 R306 有 9,332 个,这里详细研究的 R286 有 3,573 个。
02 1897年刊印的内容
相关的版本是 Hans Kiewning(编),Nuntiaturberichte aus Deutschland nebst ergänzenden Aktenstücken. Vierte Abteilung: 17. Jahrhundert,Band 2:Nuntiatur des Pallotto 1628–1630,2:1629(柏林,1897)。它在 archive.org 上的条目为 4-2_20200807,有全文。
Kiewning 依据的是罗马收到的副本,即 ASV, Nunz. di Germania 119,每份加密急件都题作 dechiffr.,并注明罗马方面解读的日期:Nr. 153 是“Pallotto an Barberini, 1629 August 4, dechiffr. 22. August”。因此他刊印的是同时代的解读。实质性段落他照录意大利语原文,其余部分用德语摘要概述,所以覆盖面几乎是完整的。
有两项核对把登记簿与印本联系起来。
8月4日的急件。pp. 5–6 的密码题作 Di Vienna 4 di Agosto,即 Nr. 153。它周围的明文页是登记簿自己誊清的这份急件,与密码分开书写,而且文字一路贯穿这张密码纸页:p. 4 以 … non haver facoltà di accettar altro partito, che’l proposto in 结尾,p. 7 接着写 nome del suo Rè。这句话与 Kiewning 的 Nr. 153 逐字相同。
附件。第 13 页就是 Kiewning 作为 Nr. 153 Beilage II, Propositione P. Valeriano per Sabran 刊印的那份文件(他的来源:Bibl. Barber. LXIX 60 fol. 122)。手稿原文、也就是印本所印的是:
… il quale aggiunse di più, che fatta la pace, quando S. S.tà, come padre comune, proponga una lega et unione di questi eserciti, affine di abbatter il Turco commune nemico del nome christiano, che S. M.tà mandaria plenipotentiarii in Italia, acciò N. S.re potesse concludere così gran negotio, con che il demonio resteria ingannato e burlato.
由此可知,这些密码隐藏的是1629年下半年曼托瓦继承危机中的事务:Pallotto 通过嘉布遣会士 P. Valeriano Magno 和帝国大臣 Eggenberg(急件中写作 Echembergh),试图在皇帝与法国使节 Sabran 之间就卡萨莱和蒙费拉托问题进行斡旋,涉及对两个公国的民事而非武装占有、法军撤出苏萨和帝国军队撤出格劳宾登,以及背后的担忧——真正的目的是压服威尼斯,恢复帝国在意大利的权威。
03 密钥知晓之前的攻击
这些数码全是数字,书写时不加分隔。在全部二十八段密文中,各数字的频率不均匀(0 占 16.1%,4 占 4.8%),相邻数字之间约有 0.18 比特的互信息,所以数字流是有结构的。下面的攻击没能找出这种结构。
代码宽度显现不出来。对于固定宽度的数字代码,应当有一个相位明显区别于其他相位。可是一个也没有。把二十八段密文合起来看,两位代码的重合指数在相位 0 为 0.01462,在相位 1 为 0.01466,偶数位和奇数位上的数字分布在每个数字上都相差不到 0.2%。三位代码在三个相位上的表现也一样。
一段猜词对齐了二十七个字母,然后失败。手握 Nr. 153 的明文,R286 的开头按两位代码能精确对齐二十七个字母:
55 70 83 65 03 29 00 69 38 73 11 36 50 23 22 07 92 20 86 72 52 06 38 97 12 33 23
H O R I C E V U T A L A R I S P O S T A D A T A M I I
赋值有重复:38 出现两次,两次都是 T;23 出现两次,两次都是 I;纯属偶然的话,大约每 180 次尝试才会出现一次。第二十八个代码出现冲突,从那里开始就再也没有一致性可言。在整份急件上运行带状动态规划对齐器,允许两位代码,并允许为转录笔误做一位和三位的重新同步,再针对一份手工校正的 3,359 字母猜词反复迭代码表直至收敛,得到约 55% 的代码—字母一致率,高于错误对齐给出的 20%,又低于复原出的密钥应有的水平。
唯密文搜索失败。对一百个两位代码做固定多重集模拟退火,在 5,000 个代码的文本上运行,用专门为此从代码库中干净的意大利语语料(1,200 万字符)构建的无空格意大利语五元组模型评分,最终停在每字符 −3.54 的对数概率,而那个时期真实的意大利语约为 −1.5。同一批代码的音节模型(每个两位码组代表一到四个字母)也在已知明文上测试过,对每个有充分例证的代码都退化回单个字母,因此没有找到音节表。
那 55% 并不是部分密钥。一项留出检验说明了这一点。用 R286 的前 55% 对照猜词学习码表,将其冻结,然后把剩余的数字与剩余的猜词对齐,统计证实次数(即该代码已在表中且与之相符的情形)。与八个保留码表但在代码之间打乱字母的对照相比:
| 每字母证实次数 | DP 得分 | |
|---|---|---|
| 从前半部分学到的密钥 | 0.355 | −3266 |
| 打乱的对照(八次均值) | 0.359 | −3313 |
两者没有分开。在“两位代码加虚码、无数字笔误”模型上做同样的检验,得到 0.440,对照均值 0.431,同样没有分开。一致率只是对齐器在拟合猜词,从中读出的任何部分密钥都会是假象。
阳性对照。用一个随机的两位同音替换密钥加密同一段猜词,按选定比率对数字流做单个数字的插入和删除以制造损伤,再运行完全相同的学习程序。它复原出的真密钥比例为:
| 数字错误率 | 复原的密钥 |
|---|---|
| 0 % | 100 / 100 |
| 0.5 % | 87 / 100 |
| 1.7 % | 7 / 100 |
| 4 % | 19 / 100 |
这种方法在合成文本上有效;它要求转录的数字准确率误差小于约 0.5%。错误率超过约 1% 时,即使手握明文,也无法从这么多文本中复原两位密钥,因为每插入或漏掉一个数字,其后所有代码的相位都会翻转。这也解释了上面的统计中为何看不出相位偏好:散布在三十行中的笔误使整个语料的相位随机化了。
游程长度检验。猜词对齐器可以伪造吻合,因为新出现的代码总可以配一个新字母。伪造不了的是一段长的一致游程:在一个窗口内,重复的代码必须对应同一字母,映射必须保持为函数,所以虚假游程在第一次重复冲突时就会终止。扫描数字偏移与猜词偏移的每一种配对,并在保持一致的前提下延长每段游程:
| 最长一致游程 | |
|---|---|
| 真实密码对 Nr. 153 的明文 | 39 个字母 |
| 对照:打乱明文字母(五次) | 39, 39, 36, 38, 36 |
| 对照:倒转密文 | 39 |
| 合成两位密码,同一文本,1.7% 数字噪声 | 207 个字母 |
| 合成两位密码,干净转录 | 2705 个字母 |
真实材料落在它自己的偶然基线上,而在同样转录噪声下的两位密码能延伸五倍之远。工具是有效的:在那份带噪声的合成文本上,这种方法能复原 100 个密钥代码中的 81 个,而动态规划学习程序只复原了 7 个。又因为这里偶然游程就能达到 36 到 39 个字母,本页开头引用的二十七字母开头吻合低于基线。它不是证据,上面给出的“180 次中一次”的数字也是错的。
所以转录噪声已不足以解释。根据这些证据,这张密码纸页不是 Kiewning 刊印为 Nr. 153 的文本的固定宽度两位加密。下一项检验把范围扩大到整卷。
语料搜索。游程长度检验是把一段密文与一段猜词作比较。这项检验则一次性、精确地把四段密文与整部印本作比较。对于替换密码,相同的代码必然对应相同的字母,所以取一个密码窗口,列出窗口内所有代码相同的位置对,要求明文恰好在这些偏移处重复。这一条件对 Kiewning 全部 1,161,303 个字母只需扫描一遍即可检查,每种间隔用一个位掩码。
通过把真实明文植入语料并用随机密钥加密来校准:
| 命中真实位置的窗口 | 误报 | |
|---|---|---|
| 合成,干净转录 | 253 / 254 | 0 |
| 合成,1.7% 数字噪声 | 16 / 254 | 0 |
因此即使在真实噪声水平下,仍有约 6% 的窗口能精确命中,而且这种方法从不误报。把它用于其中四段密文,取三种代码宽度:
| 记录 | 宽度 2 | 宽度 3 | 宽度 4 |
|---|---|---|---|
| R286 | 0 / 266 | 1 / 261 | 0 / 256 |
| R292 | 0 / 460 | 0 / 456 | 0 / 452 |
| R306 | 0 / 710 | 2 / 705 | 0 / 700 |
| R311 | 0 / 510 | 1 / 505 | 0 / 500 |
宽度为三时表面上的四次命中都是假象:每一次都落在印本的罗马数字索引里(XIUXXUXXUIXXUIIXXUIII…),这是语料中一段退化的文字,任何重复模式都能匹配。没有真正的命中。按照这一假设,仅 R286 就应当产生八次左右命中,所以一次都看不到的概率约为 e−8。
剩下的可能。这些密文不是卷中任何印出文字的固定宽度替换,既不是 Nr. 153 的,也不是其他任何急件的。剩下两种可能。要么这套系统使用变长码组,无论转录多好,任何固定宽度的对齐都匹配不上(没有相位偏好也指向这一点);要么这些纸页加密的文本不在印本中:Kiewning 用意大利语刊印要点,但把其余部分写成德语摘要,那部分意大利语原文从未付印。密钥(第 00 节)后来证实了第一种。两者都可以检验:前者用同一工具的变长版本,后者把一段密文的长度与其急件中印本只作摘要的部分相比较。
转录质量如何?对照 DECODE 较大的扫描件检查,p. 5 第 1 行与 DECODE 转录在七十四个数字中有两个不同,都是替换,没有长度差异(转录作 93 处扫描件为 73,转录作 30 处扫描件为 38)。第 2 行相差一两个数字,长度可能也不同。所以转录相当接近,在对齐中断的地方没有发现长度错误,那里的中断并非转录造成的假象。因此仍有两种解释,而且仅凭这些材料无法区分:要么转录在别处有足够多的长度错误,以致无法复原;要么这种密码根本不是这段明文的固定宽度替换。
04 这是什么密码
上面每项检验都是阴性。这一项不是,而且它对系统构成了约束。统计全部二十八段密文(112,805 个数字)中重复的数字子串,并与一个数字频率相同的独立对照相比:
| 子串长度 | 密文中的重复数 | 独立对照 | 比值 |
|---|---|---|---|
| 4 | 105,170 | 102,865 | 1.0× |
| 6 | 64,083 | 9,590 | 6.7× |
| 8 | 28,519 | 91 | 313× |
| 10 | 12,109 | 1 | 12,000× |
| 16 | 966 | 0 | — |
| 24 | 39 | 0 | — |
三十九个重复的二十四位数字串,而偶然情况下一个也不会有。谨慎使用的同音替换密码不会这样,因为同音符的存在就是为了打破重复,而这位书写者却不断重复长串。会这样重复的是代码:一种名码本,其中某个词或音节每次都以同样方式书写。密钥(第 00 节)两者兼有:字母用同音符,音节、词和人名用固定码组。长度不一的固定码组解释了上面每一种固定宽度攻击为何失败。用 BPE 对语料分段,得到 44,816 个词元、266 种词元类型,平均 2.5 个数字,长度分布在一到七之间:属于音节级别,而不是固定宽度。
另外两个假设经检验也不成立。第一份急件的重复谱与其猜词的重复谱在大约每字母一个数字的比例上吻合(3,570 个数字对 3,359 个字母),而用十个数字表示二十一个字母,就意味着这是多音替换密码;那样的话约束就反过来了,相同的字母必然对应相同的数字。最长一致的字母—数字游程:17 个字母,打乱的对照为 18、19 和 18,属于偶然水平。再者,由于加密保持顺序,重复的 BPE 词元每次都应落在同一个明文词上;74 种词元类型中有 16 种如此,对照为 13、12 和 13。不显著。
一处更正。上文第 03 节报告宽度二和三都没有相位偏好。我起初把这当作反对固定宽度代码的证据,那说得太重了:按观测到的数字错误率,一份急件就有约六十处笔误,每处都会翻转该行余下部分的相位,光这一点就足以冲掉真实的相位信号。相位检验没有定论。经过校准的语料搜索才是这一论断的可靠版本,它依然成立。
05 DECODE 转录中的批注
DECODE 的转录是带批注的,而我当初只粗看了第一份的开头。在二十八个文件中共有约 640 个 <CLEARTEXT> 标记,另有五条记录含有 <PLAINTEXT> 行,这是 DECODE 用来表示写在文档本身上的解读的记法。
| 记录 | 明文标记 | 页面上的解读 |
|---|---|---|
| R298 | 68 | |
| R296 | 63 | |
| R305 | 54 | In un lungo discorso |
| R307 | 53 | |
| R292 | 51 | |
| R309 | 35 | Con l’ord(ina)rio passato intendo che fu scritto da S. M.tà à… |
| R308 | 22 | restati più contenti della risolutione |
| R313 | 14 | Nel particolare |
这些急件大多是混合信件:简短的加密片段逐句夹在意大利语明文中。R308 的纸叶上写着:
数码上方写着:restati più contenti della risolutione
这是一个边界已知、语域合适的精确猜词,而 Kiewning 书中没有它。这也解释了为什么从印本中取的猜词无法匹配这样的记录:加密段落只是一个分句,而印本刊印的是整封信的大意。
这个猜词也对不上。四十一个数字对三十四个字母,数码和注释都已对照 DECODE 的 1523 × 2088 扫描件核对过。在第 04 节所暗示的确定性约束下做穷举搜索,再在允许同音符的条件下搜索一遍:
| 模型 | 结果 |
|---|---|
| 固定宽度 1、2 或 3 | 不吻合(41 不能被 2 整除) |
| 确定性字母代码,码组 1–2 位数字 | 0 个解(精确) |
| 确定性字母代码,码组 1–3 位数字 | 0 个解(精确) |
| 2 位码组,音节 1–3 个字母 | 0 个解(穷举,400 万个节点) |
| 同上,允许同音符 | 0 个解(穷举,730 万个节点) |
所以,要么解读者的注释与那段数字串并不精确对齐(他可能只注了一部分,或者一直注到了下一段),要么这套系统比上述任何一种都复杂。这就是9月20日时工作的进展。
06 仍未解决的部分
- 密钥是 Biermann 和 Bosbach 的(2018),由 George Lasry 认定适用于 6960。本项目并没有复原它。尚待解决的是 6960 中 6956 密钥里缺少的约 1,750 个三位码组。Kiewning 印出的意大利语可以通过对齐填补其中大部分,但这项工作还没有做。
- R286 开头的二十七字母对齐不是证据:这批材料上一致游程的偶然基线是 36 到 39 个字母,所以它只是一段短于平均水平的运气。
- Kiewning 的覆盖面接近完整,但并非逐字:凡是他用德语摘要而不录意大利语原文的地方,确切措辞只存在于密码之中。在密钥知晓之前,这看起来是主要困难。卷中的明文页不含加密段落(pp. 3–4 和 7–9 连贯地跨过了那张密码纸页),所以 pp. 5–6 所加密内容的意大利语原文可能只保存在 ASV, Nunz. di Germania 119 中,而它没有数字化。从印本中取的猜词无法确定那些词句。
- 姊妹卷,即总目第 236 条(BAV Barb.lat. 6956,DECODE R215–R285 和 R318),已由他人用 Biermann 和 Bosbach 的密钥解读,并已从总目中移除。
- 下一次尝试应当从这里开始:在全部二十八条记录中,提取每一条明文批注和解读批注及其两侧的数字串。这样可以得到数百个简短的加密分句及其意大利语上下文,其中五个附有同时代的解读。在相信每条注释的范围之前,先对照图像核查;R308 的注释是记录最完善的一条,却仍然对不上,这很可能意味着它的范围并不像看上去那样。
07 来源
- 梵蒂冈城,Biblioteca Apostolica Vaticana,Barb.lat. 6960 — DigiVatLib,194 页。密码纸页位于 pp. 5–6, 10–12, 35–37, 40–42, 46–47, 55–57, 62–64, 68–70, 75–76, 80, 83–84, 90–91, 97–99, 105, 109–110, 113–114, 119–120, 124–125, 130–131, 135–136, 140–142, 146–147, 152, 155–156, 163–165, 174–176, 181–183, 192–193。图像 © Biblioteca Apostolica Vaticana。
- DECODE 记录 R215(Barb.lat. 6956):Norbert Biermann 和 Thomas Bosbach 的密钥(2018年3月)、他们的合并密钥和一份解读,作为文档 D1505–D1508。George Lasry 经由 Daniel Bourdeau 的私人通信,2026年9月21日:6960 用的是同一个密钥。
- DECODE 记录 R286–R313(密文,附2019–20年的转录)和 R315(整卷)。
- Hans Kiewning(编),Nuntiaturberichte aus Deutschland nebst ergänzenden Aktenstücken. Vierte Abteilung: 17. Jahrhundert,Band 2:Nuntiatur des Pallotto 1628–1630,2:1629(柏林,1897)— archive.org,条目 4-2_20200807。Band 1(1628)于1895年出版。
- Kiewning 所据急件手稿来源:ASV, Nunz. di Germania 119(罗马收到的已解读副本),以及 Barberini 一方的 Bibl. Barber. LXIX–LXX。
工作文件、DECODE 转录、猜词、对齐器和求解器:targets/pallotto1629/。

