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/。

