第二篇 · 技術報告

破解文密:從字母結構到兩把無參數的密鑰

如何從「fazihipego wezelucuna」走到「報傳取消日人態度遽變」:轉寫、三十次計算(大多以失敗告終)、一個改變全局的簡單統計檢驗,以及兩把各用一行就能寫完的密鑰。

加點線底線的內容為尚未證實的推測。

1916年日本電報局的想像場景。真實的「文密」電報單上寫的是拉丁字母密語(見首頁掃描件)。
1916年日本電報局的想像場景。真實的「文密」電報單上寫的是拉丁字母密語(見首頁掃描件)。 AI生成的歷史重構插畫。

同為拉丁字母,密碼系統卻不同

公開中文電碼是一種編碼步驟,本身並非秘密。1916年的文密採用兩張特定的表,將數字轉換為音節。

  1. Rosamonde · 1915–1916

    英文字母互易替換

    you ↔ hea

    一個字母替換另一個字母;同一張表既用於加密,也用於解密。

  2. 中文電碼

    漢字公開的四位數字碼表

    文 → 2429

    碼表是公開的,單憑這一步無法隱藏內容。

  3. 壓縮電碼 · 多張碼表

    四位中文電碼兩組兩位數字 → 音節

    00–99 → CV

    不同系統使用不同碼表。CV表示子音加母音。

  4. 文密 1916 · G0 / Y0

    四位中文電碼兩張不同的音節表

    報 → 1032 → fa | zi

    僅為G0示例。Y0使用另一張表,不能互換。

概要:加密系統

35秒看懂破譯:從日本電報紙到中文原文,包括改正唯一一個錯字母。動畫由程式生成;字幕有五種語言。

1916年的兩條通道都依五步加密,沒有現代意義上的秘密密鑰。以東京 → 肇慶一路(1916年6月至9月)為例:

中文原文報
公開的中文電碼1032
拆成兩半10 | 32
每半 → 一個音節(G0 表)fa | zi
音節相連,十字母一組fazihipego

G0 表為 00 到 99 的每個數指定一個「子音+母音」音節。子音從 h 開始依字母倒序排列(h g f d c b z y x w v t s r q p n m l k),每個十位兩個子音;母音 a e i o u 表示個位,第一個子音依升序、第二個依降序(蛇形排列):

於是 ha = 00,hu = 04,gu = 05,ga = 09,fa = 10……ka = 99。以 Python 撰寫:

ORDER, V = "hgfdcbzyxwvtsrqpnmlk", "aeiou"
G0 = {c + v: 10 * (i // 2) + (j if i % 2 == 0 else 9 - j)
      for i, c in enumerate(ORDER) for j, v in enumerate(V)}

def decode(letters):          # "fazihipego..." -> ["1032", "0278", ...]
    s = [letters[k:k+2] for k in range(0, len(letters), 2)]
    return ["%02d%02d" % (G0[a], G0[b]) for a, b in zip(s[::2], s[1::2])]

每封電報以署名「伸」(heyu = 0135)結尾,有時為「伸令」,其後是日期,或用韻目代日(巧 十八日、漾 二十三日、元 十三日……),或用數字(卅 三十日)。

動手試試

選擇一封電報,點擊任一漢字或開始逐字演示:對應的兩個音節會在密文以及電報下方顯示的密鑰表格中標亮。兩條通道均可選擇(G0 與 Y0)。橙色虛線框的字為存疑字(電報紙字跡不確定或為罕用字)。

每格依次為:音節 · 電碼 · 漢字。

起點:已發表的研究

起點是〈Sun Yat-sen's circle on the wire, 1916–17〉[1]及程式庫 dbourdeau/cyphersolver[2]:其中公開了電報紙的轉寫,以及孫中山周圍人物約六十封電報的破譯。這些電報使用的「壓縮表」與 S. Tomokiyo 在 Cryptiana 上公布的山田純三郎壓縮表一脈相承[8]:20個子音與5個母音,共100個音節,00—99 每個數對應一個。

趙伸的密電與之不同:十字母一詞,看不出加數;文中曾將其列為尚未解決的問題[1]。軍務院一路的電報多以明碼前綴 2429 1378 開頭,讀作「文密」,即這套密碼的名稱;他發往雲南的電報構造相同但有六個母音,開頭是標記「Cg」。我們從已確認的檔案與轉寫出發,並沿用「半個電碼對應一個音節」的思路。下文將說明:東京發出的電報所用的表其實遵循一條簡單規則——字母倒序,每十個數兩個子音,母音蛇形排列。

規則

歷史破譯是自欺的理想溫床:參數夠多時,任何雜訊裡都能「讀出」中文。因此我們在事先確定的規則下工作,並記錄於只增不改的日誌中(近1,400行,共31次研究):

第一步 —— 讀出職員寫下的字母

從電報單到含義:一個真實例子

Rosamonde,上海 → 東京,1915年7月7日。這裡使用英文替換密碼,而非文密的G0表。

  1. 1 · 原始史料

    JACAR所藏日方抄件:B03050087700,圖像50。點擊放大。

    JACAR所藏日方抄件:B03050087700,圖像50。點擊放大。

  2. 2 · 轉錄字母組

    gowoisrjat
  3. 3 · 應用替換表

    g o w o i s r j a t
    ↕
    b e m e r c i f u l
  4. 4 · 劃分單詞並翻譯

    be merciful

    「請憐憫我。」

密文只以日本職員的手抄件形式存在。g 與 q、x 與 d、u 與 n 很容易混淆;錯一個字母就會錯一個字,漏一個字母則會讓整封電報其後的部分全部錯位。

有一處讀法細節起了決定性作用:很長時間裡,q 被當作 g 的異寫。人工閱讀把兩者區分開來,於是字母表恰好有20個子音(b c d f g h k l m n p q r s t v w x y z,沒有 j)。在當時最好的模型下,僅此一區分就使得分從681升到829。

已聲明的偏差

我有兩批閱讀(「輔助閱讀」以及對16個存疑電碼的複讀)不是盲讀:我知道模型的建議。為降低風險,每封電報最後四個單位(署名與日期)一律不得據此修改,留出電報0406從未改動,且每條建議都必須在影像上確認(接受18條,否決27條)。

第二步 —— 哪些方法失敗了,為什麼

在三十次研究中,我們採用的是破解未知替換密碼的經典路線:

這些搜尋全部失敗,而對照告訴了我們原因。求解器能找回正對照文本的密鑰(例如267個電碼中找回258個):它是有能力的。但在檔案上,最佳得分(約900)遠低於真實文本(1,200—1,350),同時又明顯高於打亂的資料(約670)。以任意密碼本加密的文本得分在810—940之間:檔案看起來就是這樣。

假設中藏著兩個錯誤:

  1. 錨點有誤。對於十六日到三十日,韻目代日使用的聲調系列與最初假設的不同(已在出版的孫中山原電中核實[11])。因此有幾個錨點是錯的。
  2. 密鑰空間過大。一張可任意排列的100格表有足夠的自由度,在900分左右製造出雜訊的最佳解。反向實驗證實了這一點:放鬆最終找到的結構(實驗 E21),擬合得分上升,但留出電報變得無法閱讀。這就是過度擬合。

與此同時,一條文獻線索被追查到底。日本駐漢口總領事館的報告(1916年5月9日與11日)[5][6]記載了「加111」以及「四位倒序後加111」的再加密方法。報告所附的4月電報確實可以這樣解開(算術進位,結尾為韻目)。但在東京一路上,所有 ±111 的變體——不論是否倒序,也包括它在音節表下造成的殘餘偏移——全部為否定結果(實驗 E13、E15、E16)。結論:7月的電報沒有加數密鑰。

第三步 —— 無密鑰檢驗:子音代表十位

轉機來自一個根本不尋找密鑰的檢驗。中文電碼的形狀很特別:千位數字高度集中(常用電碼大多在 0000 到 7999 之間,幾乎沒有 8xxx 或 9xxx),而個位數字大致均勻。如果半個電碼(兩位數)變成一個音節,問題就是:音節中哪一部分承載十位?

於是依字母在電報中的位置分別計數(實驗 S3)。在承載電碼前半(千位與百位)的位置上,子音的分布極不均衡(z ≈ 22):h 與 g 佔絕對多數,l、p、m 從不出現;而母音的分布則很均勻(z ≈ 1)。模擬(S4)顯示,隨機表從不產生這種模式(400次中0次),而座標表——子音表示十位、母音表示個位——則能重現它。

這一假設(H9)大幅縮小了搜尋空間:不再是任意擺放100個音節,而是把每個子音分配給一個十位、每個母音分配給一個數字。它也顯示某些日期錨點組合是不可能的:在 H9 之下,某些假定的韻目會要求同一個子音對應兩個十位。

第四步 —— 帶約束的求解器與留出電報

新的求解器(anchor_coord)只搜尋座標表。沒有錨點時,它連正對照都解不開;有十個正確錨點時,它能找回完整密鑰。於是我們列舉出與 H9 相容的錨點組合(324組中的97組),測試其中最合理的幾組。只有一組脫穎而出:D = {6月23日 漾、7月18日 巧、7月19日 皓、9月13日 元}。

指標(錨點組 D)檔案打亂(零對照)正對照
得分,語料 v47053491,203
得分,語料 v5(q ≠ g)8293321,216
可重複性(3個種子)最佳解相同(誤差 0.001 以內),96/96 個單位一致

評判者是留出的 0406號電報。我們計算在語言模型下、相對於平均字的每字平均對數概似增益:解出的文字像中文則為正,否則為負。表 D 在語料 v4 上的結果是每字 +1.9,在語料 v5 上是 +3.47;而其他所有候選表都在 0 或以下,零對照表則為 −1 到 −2.5。在交叉驗證中(S7:以五封電報求解,以第六封評判),該表在 6 封中的 6 封上都能遷移。文字開始可以逐句讀出:三十式槍、萬一千、軍用品已到門司、年息一割、無擔保、第二批械、軍務院、豫定計畫……

第五步 —— G0 表

逐格查看擬合出的表,一個規律一目了然:子音依字母倒序排列,每個十位兩個,母音先升後降。少數不符合的格子,正是資料約束不足的那些。於是我們以它所近似的規則表取代擬合表:這就是 G0,它不再有任何自由參數。

結果是整個研究中最有力的檢驗:在完全不調整的情況下,G0 解讀留出電報0406的得分為每字 +3.99,高於由之導出的擬合表(+3.48)。一張被擬合「磨糊」的表,不如它所隱藏的簡單規則:如果這條規則就是真正的密鑰,結果正應如此。G0 給出七封電報全部351個電碼,電報結尾也變得一致:署名「伸」後接日期(6月23日為「漾」,7月18日為「巧」,9月13日為「元」,9月30日為「卅」,7月12日為「文」)。

曾有兩個結尾看似不正常。7月19日以 4210 結尾,而非「皓」(4110):這是一個字母的錯誤,已由第二通道解釋(第六步)。標為6月30日的電報以「卄」(二十)結尾;讀法已在影像上複核,差異仍是編碼錯誤,或二十日擬稿、三十日交發。

憑什麼相信:對照檢驗

事先確定的標準結果
同類型正對照被找回是(1,203—1,216;密鑰找回)
檔案得分明顯高於零對照是(829 對約 335;複讀後為 1,144)
不同起點得到相同最佳解是(3個種子,最佳解相同)
留出電報不經調整即可讀(每字 ≥ +2.5)是:G0 下為 +3.99
中文文句連貫,且與電報紙上的日期一致大體如此;351個字中12個存疑(另有6個罕見但已確認)
獨立的外部印證是:發報人「伸」=趙伸,在破譯之後由一篇2026年的研究[7]確認,該研究描述了同樣的軍火合同;隨後又由電報紙(趙伸的姓名與住址)證實
第二通道:留出電報在封閉密鑰下可讀是:0496a 在 Y0 下為 +4.62,報告蔡鍔八日在福岡逝世
第二通道:未用作錨點的日期結尾與電報紙一致是:4 封中 4 封

最後一點值得強調:趙伸之名、「第二批械」的交付、廣東拒絕擔保、武器在雲南與廣東之間的分配,這些內容在我們讀到承紅磊的文章之前就已出現在破譯出的電報中。這些詞沒有一個是被注入搜尋的。

局限:G0 表是從擬合表中讀出的,Y0 表是由五個錨點推出的,都不是憑空而來;最後幾批閱讀不是盲讀;譯文為工作譯文。

第六步 —— 第二通道與 Y0 表

另一組電報紙不帶「文密」之名,但出自同一發報人:1916年7月至11月間東京與雲南之間的15張電報紙,或由趙伸署名,或發給趙伸,開頭通常是明文標記「Cg」。它們的字母表不同:y 是母音,G0 在這裡毫無結果。位置檢驗顯示出同樣的座標結構(子音 z ≈ 22,母音 z ≈ 5),但四輪模擬退火搜尋(E26—E29)即使使用人工讀法與日期錨點,仍是否定結果:求解器能完美找回正對照,留出電報(0496a)卻始終停在每字 +0.9 左右,遠低於 +2.5 的門檻。

突破來自對電報抬頭與結尾的人工閱讀:

這五個值(bu = 01,ky = 35,ha = 29,ry = 60,fo = 14)恰好吻合一張線性音節表:17個子音依字母順序排列(不含 c、j、q),六個母音蛇形排列,值 = 6 × 子音序號 + 母音序號。唯一未被錨點確定的是 e 與 i 的先後,在解碼之前已依對稱原則定下(在機器讀法上,反過來的變體每字只有 +2.76,而 Y0 為 +4.23)。

CONS = "bdfghklmnprstvwxz"          # 17個子音,不含 c、j、q
Y0 = {c + v: 6 * i + r for i, c in enumerate(CONS)
      for r, v in enumerate("yuoiea" if i % 2 == 0 else "aeiouy")}
# 共102個音節:ze = 100、za = 101 不使用

在 Y0 下、不做任何調整的結果:

關於規則的兩點說明。Y0 的錨點來自同日的一封明文電報,即來自文獻,而非猜測。另一方面,我們曾嘗試一個「可能詞」(「電」),這是對「不用明文猜測」規則的公開偏離;它沒有帶來任何改進,已被否決(E29)。此外,這條通道的文字已全部由人工盲讀複核,字數處處與電報紙上的記錄相符;但它仍不如第一通道可靠,許多罕用字仍被標出。

這條通道還糾正了第一通道:7月19日發往肇慶的電報以一個不可能的電碼結尾,而同日發往雲南的「孿生」電報則規規矩矩地以「伸皓」(十九日)結尾。回到影像複核,錯的那個字母是 i 而非 e:在摩斯電碼中,e 是 ·,i 是 ··。

懸而未決:1917年的電報

1917年6月的兩封密電 0509 與 0511(孫中山 ↔ 戴季陶)仍未攻破。它們既無「文密」前綴,也無「Cg」標記,字母表又有不同(出現 c 與 j,y 既作子音也作母音,還有幾個不規則的詞組)。G0 與 Y0 都讀不出,此後試過的各類表(同類網格、任意順序的17或18 × 6表、帶錨點的座標、可能出現的詞)也都沒有顯出隨機以外的結果。盲讀、可能的混淆與全部研究方向見電報全文頁。

復原的碼表及其發現日期

本次研究(2026年10月)復原的碼表一覽,按其所讀電報的時間排列。壓縮碼的構成依次為:輔音順序/元音順序/按元音填寫(V:值 = 20 × 元音序 + 輔音序)或按輔音填寫(C:值 = 5 × 輔音序 + 元音序)/起始數。D. Bourdeau 已發表的碼表[1]不列入。

碼表電報構成發現日期見
Hong Kong香港,1914年3月y k u l o c a p i t → 0 1 2 3 4 5 6 7 8 92026年10月15日定義
「Laisaosang」1914年6月–1915年2月c…b / o a e u i / V / 012026年10月15日1915年
「New York」1914年7月–1915年2月b…z / a e i o u / C / 002026年10月15日1915年
「Hsuweilin」舊金山 →「Hsuweilin」,1914年7月b…z sans k / a e i o u / C / 012026年10月15日27/7/1914
候選 · 「Kai」長春與上海,1914年8至9月g…f / e o a u i / V / 012026年10月15日1914年(未發表)
Rosamonde英文,東京 ↔ 上海,1915–1916年a↔u b↔g c↔s e↔o f↔j h↔y i↔r k↔z l↔t m↔w n↔v q↔x (字母互換替換)2026年10月15日羅莎蒙德
「Thirtieth」上海 ↔ 東京,1915年2至3月v…t / u i e o a / V / 012026年10月15日1915年
「Thirteenth」東京 → 上海,1916年2至3月n…m / o a e i u / V / 012026年10月15日1915年
Sixteenth上海 ↔ 東京,1916年4月t…s / e u o i a / V / 012026年10月15日定義
Seventeenth上海 ↔ 東京,1916年4月p…n / i u a e o / V / 012026年10月15日定義
「Thirtyeight」東京 → 上海,1916年5月k…j / e a i u o / V / 012026年10月13日1916年5月
黃興東京 ↔ 上海(「Ylchang」),1916年5月底至6月d c b t h j f q g k n m p s r l x w z v / u i o e a / C / 012026年10月15日黃興
G0(「文密」)東京 → 軍務院,1916年6至9月h g f d c b z y x w v t s r q p n m l k / a→u, u→a2026年10月9日第五步
Y0(「Cg」)東京 ↔ 雲南,1916年7至11月17 × 6 (y) / serpentin2026年10月11日第六步

表中區分已確立碼表與候選「Kai」;後者不算已刊破譯。時段涵蓋語料中的用例,包含未刊批次。

另有兩張 D. Bourdeau 的碼表得到證實或細化:他暫定發表的第二張「馬尼拉」表,可無須訂正地讀出1915年1月6日的一封電報(2026年10月15日);他的「檀香山」表若以 w 代 v,可讀出1916年4至5月的「Aloha」電報(2026年10月13日)。

1914年:Hsuweilin與候選「Kai」

同一系列1914年7月至1915年1月的卷宗(JACAR B03050087500)中有十來封壓縮碼電報,電文前常有一個作為標記的明碼詞(「Ting」、「Kai」、「Sixth」、「Chung」)。以與1915年相同的方法(壓縮碼表全族、已知密鑰、六組打亂的對照)檢驗,2026年10月15日得到:

標記「Chung」的電報仍無法讀出。 未經佐證的候選:「Kai」最佳差值3.01 − 1.61 = 1.40,低於刊出門檻1.5。兩封均不列入公開語料;不認定指示語所指人物。

現已套用複核,Hsuweilin、Sixth、Ting刊於新增電報;兩封Kai因下述分差及可讀性原因仍未刊。

新增碼表:逐一明確定義解碼步驟

1913–1916年這一批涉及兩種不同操作。壓縮碼把輔音加元音的音節換成兩位數;香港方式則把每個字母換成一位數。四位數再依公開的中文電碼本還原漢字。原本就是數字的電文可直接查碼本,不能僅因此認定為秘密密碼。

Sixteenth與Seventeenth:按元音排列

基本輔音序列為b c d f g h j k l m n p q r s t v x y z。Sixteenth向左循環移動15位,Seventeenth向左移動11位。令i為移動後的輔音序位、j為該表元音序位,皆從0起,音節值為(20 × j + i + 1) modulo 100,寫成兩位。兩個音節連接而不相加。例如Sixteenth的xe·qu → 03·38 → 0338 → 兄,即1916年4月19日電首字。

碼表輔音順序元音順序公式
Sixteentht v x y z b c d f g h j k l m n p q r se u o i a(20 × j + i + 1) modulo 100
Seventeenthp q r s t v x y z b c d f g h j k l m ni u a e o(20 × j + i + 1) modulo 100

Hsuweilin:按輔音排列

輔音為b c d f g h j l m n p q r s t v w x y z(不含k),元音為a e i o u。公式為(5 × i + j + 1) modulo 100。gu·ca → 25·06 → 2506 → 昨即1914年7月27日電開頭。其字母表與Sixteenth不同,須逐項保留。

香港:一字母對一數字

使用y k u l o c a p i t → 0 1 2 3 4 5 6 7 8 9,把傳輸詞組接成字流後,每四字母分組。例如1914年3月13日電的kcpk → 1571 → 已。這不是壓縮碼音節。長度錯誤仍屬抄寫問題,重新對齊的提案不可變成圖像確定讀法。

對照與復原分開呈現

刊出要求每碼分數至少1.5、嚴格高於打亂對照加1.5、碼表成立、電文可理解且已套用人工複核。可讀性與分數分別判斷:1914年9月23日Kai電仍是草稿,8月9日電差距不足(3.013 − 1.613 = 1.400),兩封均未刊。來源清單分列初始分數和對齊提案,存疑與補字仍可見。

1915年新增九封不涉及新求解器。Thirtieth可讀2至5月,上海表見於6月、舊金山表見於10月(已發表碼表[1])。預填轉寫R23之後再以R24複核標記字;否定或保留不改成確認。全系列20封、446碼、53字存疑、1字無法辨讀。3月6日與7日Rosamonde增補仍用既述方式;複核的qq留在密文,英文[pp]標明1915年已見的以q代表p用法。

本節說明最初分析的史料;1914年用例見總表,1915年增補九封的R23複核見上文。

又三張碼表:1915年

同一系列1915年的兩卷(JACAR B03050087600 與 B03050087700)[17]此前從未有人打開。其中有比1916年早一年的壓縮碼電報。我們對每封電報運行整族壓縮碼表(604 800張:二十個輔音按字母順序或逆序、起點、五個元音的順序、按輔音/按元音/蛇形填充、從00或01起編),並把最高分與六個對照(同一批音節打亂)比較。有三張碼表明顯勝出,且各自能讀出多封電報:

此外,1915年1月6日東京發往「Konglipo」(馬尼拉)的一封電報,用 Daniel Bourdeau 依據1916年5月僅一封電報暫定的碼表[1]即可讀出,無需更正:無其事。文覆。可見這張碼表早在十六個月前已在使用。

字母由 Claude 依掃描件讀出,我再對存疑之處盲讀複核(77題,其中10個對照音節全部得到證實;22處提議的更正中,我在不知道預期答案的情況下讀出了15處)。電報見電報全文頁。

1916年3月東京與上海之間還使用第四張新碼表:「Thirteenth」,1916年2月28日一封電報以此字明文標出:輔音從 n 起,元音 o a e i u,按元音填充,自01起。它能讀出1916年3月12日和16日的電報(每碼4.83和4.52),以及2月28日該電本身(4.40):密文中夾有一個明文英文詞,正金銀行 bearer 票,即橫濱正金銀行的不記名票據;見1916年2—3月。

羅莎蒙德:互換替換下的英文

2026年10月15日研究的最初樣本,不含1915年3月6日、7日增補。

在同幾卷中,以及1916年5月的 B03050089000 卷[16]中,另有一些電報不像壓縮碼:十個字母的單詞沒有輔音—元音交替,有輔音連綴和重複元音。無鑰測試為陰性(不是音節表),但三項統計指明了方向:字母重合指數為0.062,與自然語言相符(隨機字母為0.038);f 和 q 從未出現;某些三字母組在不同電報中反覆出現(hea 十次)。這是自然語言文本經簡單替換的特徵。

對全部26字母替換做模擬退火,以英文四字母組模型評分,第一次嘗試就出現了英文(your letter、received my life、cable)。所得替換表幾乎是一個對合(每個字母與另一個互換);把搜索限制在互換替換上,密鑰即告確定:a↔u b↔g c↔s e↔o f↔j h↔y i↔r k↔z l↔t m↔w n↔v q↔x,d、p 不變。hea = you,teno = love。 上表是基本替換。1915年電報紙亦見以q代替p所預期密文字母的用法,例如3月6日複核的qq,英文讀本標作[pp]。此用法另行記錄,不暗中改動互換表。

三項檢驗。(1)同樣長度、以隨機表加密的英文文本,同一搜索可百分之百復原。(2)樣本外:僅從1915年電報得出的密鑰,能讀出我在發現之前盲讀轉錄的七封1916年5月電報(相對2000張隨機互換表,z = 7.5)。(3)我對1915年電報的盲讀複核(50行,既看不到 Claude 的讀法,也看不到明文)同樣可讀(z = 10.9)。另一系統的電報仍不可讀(z = 0.6)。其內容——孫中山與宋慶齡之間的情書——見羅莎蒙德電報頁。

為什麼1916年5月更正的字母這麼多?

在校訂本中,方括號內的字母是電報單上寫法不同或漏寫的字母。1916年5月的比例(611個字母中有109個,17.8%)是1915年(1061個中59個,5.6%)的三倍;5月12日那封兩頁的電報就佔了一半(234個中56個)。我對照圖像逐一核查了這些字母,核查時可以看到所期望的字母(2026年10月15日):133個中,99個在電報單上確實寫成別的字母,18個可以讀成所期望的字母,16個仍不確定。 這些統計及下列比較以2026年10月15日核查的最初樣本為限,不含1915年3月6日、7日增補。

方法上的差別幾乎說明不了什麼。1915年的校訂本結合了兩次獨立讀法,1916年的只依據我一人的讀法;但在讀者相同的條件下——只看我對1915年電報的盲讀——與預期密文的差異1915年約為7%,1916年則為18%。1916年的電報單本身較不可靠,差異集中在三對字母上:

預期字母1915年(我的盲讀)1916年5月(對照圖像核查)
v(明文 n)47次中 v 41次v 18次,n 23次
r(明文 i)51次中 r 51次r 7次,i 24次
h(明文 y)47次中 h 46次h 16次,y 7次

這些錯誤並非來自傳輸:在摩斯電碼中,n 與 v、i 與 r、h 與 y 毫無相似之處。它們產生於有人辨讀手寫草體之時——多半是櫃檯職員謄抄發報人的手寫電文——而且幾乎總是同一方向:預期的 v 變成 n,反之則無;h 變成 y,反之則無。可能的原因有兩個,目前無法斷定。其一,電報寫得匆忙:1916年5月孫中山在上海領導起義(“now very busy”),加密本身也較草率,有整詞以明文保留(know、own、iron、trunk),甚至有半個詞(anxi-ous)。其二,經手的職員不同:上海的電報員辨讀的是並非他們自己的拉丁字母手跡;不過宋慶齡從東京發出的兩封電報也有同樣的錯誤。

密鑰本身加重了這種效果:它所互換的正是外形相近的字母(a/u、c/s、e/o、h/y、i/r、l/t、n/v……),筆下稍有猶豫,寫出的字母看上去合理,對解密卻是錯的。1916年的密鑰確實就是1915年的:自動搜索最初找到的一個變體(v↔p,n、i、r 不變)只是這些錯誤造成的假象;明文中的每一個 v 都與它矛盾——電報單上寫的是 n,從來不是 p。

就我們所知,這一系統和這些文本此前均未發表:Daniel Bourdeau 的筆記[2]、Cryptiana[8]、關於孫宋婚姻的史學研究[18][19]以及 J. Chang 與 J. Halliday 的傳記[20]中都沒有(2026年10月15日核查)。

延伸:1916年5至6月,以已知密鑰解讀新電報

此處密鑰並非新發現:1916年5月東京發往上海(「Junzaburo」)的電報使用「山田」壓縮碼,已有人辨認並發表[1, 2]。新的是電報本身:已發表的轉寫止於 JACAR B03050089100(5月底);我翻閱遞信省其後幾批送件(B03050089000、B03050089200、B03050089400),找到同一系列、5月17日至6月15日的十封電報,從未有人轉寫。

方法是整個研究的反向應用:密鑰既知,關鍵全在字母的判讀。Claude 依掃描影像讀出每張電報紙;凡有不通之字,即尋找逐一改動一個字母(抄寫或莫爾斯混淆)便能通順的讀法;再由我在影像上逐一核對(V1–V6 批次,約40處:絕大多數獲證實,少數不成立,文中仍標為存疑)。與密鑰無關的獨立檢驗:韻目日期與電報紙相符,署名持(謝持)一再出現,所提人物(席正銘、趙瑾卿、廖仲愷、居正、萱野)確有其人且屬同一圈子。結果見電報全文頁。

1916年5月上旬:上海的覆電。5月上旬一批中,除東京電報外,還有上海發往東京的覆電:以同一「山田」密鑰反向使用即可讀出,其中一封署名文。同批還有一封轉發上海的馬尼拉電報,以已發表的馬尼拉→頭山密鑰讀出[1]。存疑詞已由 Brice Dudout 對照影像核對。

5月10日的「w」:既定的讀法,也是一條線索。5月10日的電報紙(0042a)上,譯電者兩次把「山田」表應為 p 之處寫成 w(「xetuwotedi」「rusidewari」),而同一張電報紙上也用 p。「山田」的字母表(二十個子音)沒有 w,這也不像筆誤。因此我們把它當作有意的選擇:w 是 p 的另一寫法(同音異寫),電報全文頁以 w = p 的「山田」表讀這封電報,字母照原樣列出。w 的二十個可能值中,p 明顯最佳,也是唯一能得出「昨日到」「乘原船」的值;表的其餘部分不變(署名「持」與韻目日期「灰」(十日)都對得上)。同一電報紙上有兩個 k 似乎也代替 p(「事」「灰」),仍列為建議。w的線索後來得到結果:無指示語的東京電與上海致「Ylchang」電報,讀出了子音次序經置換的黃興碼表。仍有不適用此表的電報,見該節。G0則遵循上文所述的倒序字母表。

檀香山:密鑰的「Aloha」變體。4月30日的檀香山電報(明文前綴「Aloha」,致「Rosamonde」即孫中山)用了壓縮碼字母表中所沒有的 w,同時也用 v。以已發表的「檀香山」密鑰[1]讀之,並讓 w 取 v 的值,即可讀出:w 是同一字母的另一寫法,正如5月10日以 w 代 p。我們把它作為該密鑰的「Aloha」變體。電報署名鐵城(吳鐵城,時在檀香山),讀作「黃轉到日,換船赴滬。鐵城」。其中三個字母按傳輸錯誤改正(兩次 r 被收成 s,一次 e 被收成 o);首字「黃」據上下文補出:黃興於5月9日抵日本(電報0042a)。

同一時期有兩條看似無法讀出:東京發出、無「Thirtyseventh」前綴的電報(彼此有重複的字母串),以及上海發往「Ylchang」(黃興)的電報。其實兩者都以同一張新碼表讀出:見黃興的碼表。

新碼表「Thirtyeight」(1916年5月)

5月上旬有兩封東京電報冠以另一明文前綴「Thirtyeight」,而非「Thirtyseven」。不依密鑰的檢驗顯示是同類碼表(兩個字母 → 兩個數字),但「山田」密鑰讀不出。在壓縮碼表族(子音起點、母音順序與方向、偏移:共57,600張表)中搜尋,有一張明顯領先(z = 6.7):子音按字母順序自 k 起,母音 e a i u o,數值 = 20 × 母音序 + 子音序 + 1(模100)。這是「山田」的構造(子音自 q 起,母音 e u i o a),只是參數不同。它不改任何一格即讀出5月12日電:「箱已交犬塚,十五日附法船來。若有要事,請電如下」,其後為明文地址;只改一個字母(d → x,他處已見的抄寫混淆)。據我們所知,此表未曾發表。它也讀出另一封「Thirtyeight」電報(5月11日):「聞張繼已回日,頗奇,是否?」,只改一個字母(o → e)。

第二張新碼表:黃興的碼表(1916年5月底至6月)

1916年5月26日至6月6日,東京發往「Junzaburo」(上海)的電報不冠「Thirtyseven」前綴。已知碼表均無法讀出[2]、[8],但有兩項觀察指引了搜尋。6月6日的電報逐碼重複6月3日電報的後半,並補回傳送中遺失的九個電碼。又有三封電報不論日期,均以相同的兩個電碼結尾:那不是日期(如謝持以「持」加韻目代日),而是結語與署名。

勿與黃興另一封電報(1916年5月25日致林虎、李根源)的三假名電碼混淆:該系統由 D. Bourdeau 識別,其對應公式由 S. Tomokiyo 找出[22][23]。

無鑰檢驗顯示這是坐標式碼表(輔音表示十位數)。於是以模擬退火搜尋:二十個輔音各佔一段連續五個數值,次序任意,元音按共同或交替的次序排列。搜尋先經校準:已讀出的電報以此族中隨機的碼表重新加密後,均被完整找回(12封中12封)。在東京發出的六封電報(140個電碼)上,六次獨立搜尋都得到同一張碼表,遠高於對照(同樣的音節打亂):每碼4.26對0.73。

碼表極為規則:輔音次序為 d c b t h j f q g k n m p s r l x w z v,各佔連續五個數值,由01編至99再到00(du = 01、di = 02 … va = 00),元音次序為 u i o e a。東京發出的電報均以覆。興結尾:黃興,5月9日抵東京。不改一格,同一碼表也讀出上海發往「Ylchang」(黃興)、署名文或孫文的電報;6月6日一封以日期魚(六日)結尾,與電報紙上的日期相符。

內容:6月3日,黃興晤田中(田中,應為參謀次長田中義一):「槍二千、砲六門不日可運」;5月31日,款二十萬、武器若干,囑胡漢民(漢民)親請青木(青木)再電當局;〔日方〕不欲孫先生急赴山東,黃興提議請張繼(溥泉)及一有資望軍人調和。已讀出九封電報;存疑字母已由 Brice Dudout 對照電報紙核對(在不知文意的情況下),這些電報已收入電報全文頁。上海發往「Ylchang」的另兩封(5月29日、6月8日)出自另一發報人(開頭與結尾電碼相同),此碼表讀不出。

據我們所知,此碼表此前未曾發表:這些電報在 Daniel Bourdeau 的筆記[2]及 Cryptiana[8]中均列為未讀(2026年10月15日查核)。

工具

求解器、兩把密鑰、閱讀資料與語言模型已發布在 GitHub 儲存庫的 solver/ 目錄中,可據此重做搜尋;完整的研究日誌隨後公布。