花卷
前情提要
上期我們講到,在法國朝廷圍攻胡格諾派的幾次戰役中,一個叫安托萬·羅西諾爾的年輕人用他的天才幫助朝廷軍破譯了胡格諾派的一些密信,為戰役的勝利立下了不小的功勞,因此被國王路易十三看中,任命他為國王顧問,專門負責破譯各種密碼。
沉默的孤狼
作為國王的心腹,羅西諾爾的仕途可以說是“一步登天”,讓多少人羨慕嫉妒恨呢。但破譯密碼這種工作天生自帶地下黨屬性,更何況凡是用密碼加密過的內容,也都是那些見不得光的事情。而羅西諾爾整天負責破譯密碼,這些“國家機密”都得從他眼前過,他不想看也得看。
如果一個人知道了太多的機密會怎么樣?電視劇里面很多人被干掉的理由都是“你知道的太多了”,看來知道得太多真不是什么好事兒。從史料上來看,羅西諾爾大概算是個聰明人,他懂得玩沉默和低調,據說他從來不跟別人議論自己破譯出來的那些機密情報,對外假裝自己啥都不知道。你還別說,這一招還真騙過了不少人,據說當時外面的貴族們都猜測,羅西諾爾的那些光輝事跡全是黎塞留首相編出來的,黎塞留把羅西諾爾包裝成一個破譯高手嚇唬人,這樣大家就不敢上課沒事傳小紙條啦,沒準羅西諾爾其實沒什么真本事,根本不會破譯密碼。對于這種嚼舌根子的話,羅西諾爾表示笑而不語——呵呵,就算我有本事,也用不著讓你們知道。
羅西諾爾就這樣躲開了洶涌的政治漩渦,在他的豪宅里一心一意地做他的“開鎖匠”。1642年和1643年,首相黎塞留和國王路易十三相繼去世,羅西諾爾似乎遇到了一點危機。幸運的是,首相和國王真的十分信任羅西諾爾,他們在臨終前交代后事的時候,都提到一定要重用羅西諾爾,因為他是“國家最需要的人才之一”。新國王路易十四(Louis XIV)繼位之后,1645年,新任首相儒勒·馬扎然(Jules Mazarin)任命羅西諾爾為王室財務總管以及國家顧問,這算是給了他一個正式的國家公務員頭銜——不過為啥是財務總管呢?因為當時財務部門也是負責管檔案的啦。
密碼大改造
羅西諾爾上任之后,除了發揮他專業的破譯才能幫助國王破譯各種密信之外,還有一項重要的任務,那就是把自家的密碼體系搞得更牛一些。想想看,羅西諾爾破譯過那么多密碼,他肯定對那些密碼的弱點了如指掌。羅西諾爾把法國自家用的密碼整理了一遍,發現這些跟當初胡格諾派用的那些玩意兒也都差不多啊,破譯起來其實也不難啊!好家伙,原來咱們自己用的密碼這么弱,還讓不讓人家有秘密了!別人犯過的錯自己可不能再犯了,于是羅西諾爾開始親自操刀,準備把自己家的密碼升級一下。
我們在瑪麗女王的故事中已經盤點過,當時歐洲主要使用的密碼系統叫做Nomenclator,這個詞沒有什么統一的中文譯法,我們暫且就管它叫“密碼表”好了。當時歐洲常見的密碼表,其結構大體上由兩部分組成,其中之一是一套單表置換密碼——簡單說,就是定義了一套字母的替換規則,比如A替換成P,B替換成G,替換的對象也不僅限于字母,像瑪麗女王的密碼表就是將字母替換成特定的符號。單表置換密碼有它的天敵,那就是阿拉伯人發明的頻率分析法。這是因為從一篇文章的整體來看,每個字母的出現頻率都遵循一定的特征,而單表置換的過程并沒有改變這一頻率特征,有經驗的破譯者可以通過頻率分析,像玩填字游戲一樣一個字母一個字母地破譯出來。后來,為了進一步提高強度,密碼學家又對單表密碼做了一些升級,比如加入干擾碼(空碼)、一個字母對應多個置換碼(Homophonic Cipher)等,不過這些手段并不能從根本上抵御頻率分析。
密碼表的另一個部分是一個字典,對于一些常用的單詞,比如說國名、人名、數字、月份等等,給它們分別弄一個特定的編碼來代替,比如30代表法國、31代表英國。這樣做有什么好處呢?一來,這些單詞出現的頻率很高,用編碼可以縮短密信的長度,負責加密的人也可以省點事,畢竟查個編碼比一個字母一個字母拼要快多了;二來,越是重復出現的單詞,越容易成為破譯者的線索,如果用單表置換密碼直接拼寫這些單詞的話,破譯了這些單詞也就等于幫助破譯了整個密碼的其他一些部分,因此用特定編碼替代這些常用詞也有助于隱藏高頻字母組合的特征,讓密碼更難被破譯。
像羅西諾爾這樣的大牛,頻率分析什么的早就滾瓜爛熟了,所以他肯定知道單表置換密碼是不靠譜的,而字典相對來說就更靠譜一些。于是,羅西諾爾提出了一條重要的方針,那就是應該擴大字典的單詞量,從而盡量減少用字母置換拼寫的機會。如果一篇文章中所有的詞都能用編碼來替代,那么針對單個字母的頻率分析不就完全不管用了嗎?不過,現實當然沒有那么完美,對于任何一種歐洲語言,要想覆蓋常用的語境,需要的單詞數量都不會少。比如說,現在美國高中生的英文詞匯量大概是1萬個左右,作為一個密碼字典,幾千個單詞總要有的吧。單詞數量越多,字典就越厚,編寫和傳播起來也就越來越不方便,而且目標太大也容易被敵人給偷了去,這些都是字典的弊病——但無論如何,在安全性上,字典確實比單表置換要強多了。
另一套索引
話說回來,字典作為密碼表的一部分,并不是羅西諾爾發明的,他只是強調字典更安全,所以應該放在主要地位而已。不過,羅西諾爾還發現,常見的密碼表中的字典還存在一個弱點,那就是單詞的排列順序。我們身邊也有很多字典,隨便翻開一本就會發現,里面的單詞都是按照字母順序排列的,這當然是為了用的時候好查。不過密碼表中的字典跟一般的字典還有一點不一樣,那就是一套字典有兩種用法——加密的時候得根據單詞查編碼,解密的時候得根據編碼反查單詞。那么怎樣才能“一箭雙雕”呢?最省事的辦法當然是單詞按字母排,對應的編碼按數字從小到大排,比如說abandon→0001、ability→0002、able→0003……這樣一來,無論是正著查還是反著查都很方便,而當時流行的大部分字典也都是這樣做的。
問題是,這樣的排列有什么弱點呢?聰明如你一定也發現了吧,那就是編碼的順序和單詞的順序是相關的!比如說,如果我知道2040代表fast,2250代表for,當我遇到一個沒見過的編碼,比如2100,我就可以推測出,這個單詞肯定是以字母f開頭的,而且位于fast和for之間,再根據上下文的意思,猜出這個詞就容易多了——換句話說,破譯者可以通過這一線索縮小未知單詞的猜測范圍,這還不算弱點嗎?
那么,這個弱點有沒有辦法解決呢?嗯,當然有。不知道大家還記不記得《新華字典》是怎么查的,一般的漢語字典都是按照拼音順序排列的,但同時還會提供另一套索引,可以根據部首和筆畫來查字。同樣地,如果要打破密碼字典中單詞順序和編碼順序的相關性,就必須把編碼改成隨機排列,但這樣一來通過編碼反查單詞就會很困難。為了解決這個問題,只要再提供另一套按照編碼查單詞的索引不就行了嗎?
這個主意靠譜,事實上,羅西諾爾也是這么想的。不過密碼字典跟我們用的《新華字典》不一樣,它本身只有一個索引,沒有什么釋義、例句之類的東西,所以增加一套索引就相當于重寫了一套字典,換句話說,字典就變成了原來的兩倍厚。不過仔細想想看,這些弊病也只不過是“不方便”而已,畢竟打破了單詞順序和編碼順序的相關性之后,字典的安全性提升了不止一個臺階,犧牲一點方便也是值得的。
不過,隨著字典里的單詞量越來越多,編寫兩套索引也變得越來越累人,再加上一套字典不可能用一輩子,也不可能所有人都用同一套字典,于是編寫字典的工作量就成倍成倍地增長起來。據說到了17世紀末,密碼字典的單詞量已經高達2 000到3 000個,這可真不是個小數目。對于這么龐大的字典,編寫兩套索引不太現實,于是又出現了一種“縮水版”的解決方案——既然不能把順序完全打亂,那我可以把單詞分成若干個“編碼組”,在每個組的內部,單詞和編碼都是按順序排列的,但組和組之間的順序是打亂的。舉個例子,A開頭的單詞從800號開始排,B開頭的單詞從300號開始排,但A或B開頭的單詞本身則是按順序排列和編碼的。這種“縮水版”方案的安全性實際上低了不少,因此這算是向實用性的一種妥協吧,畢竟在還沒有計算機的年代,這種妥協也還是可以理解的。
羅西諾爾發明的這種“兩部式”密碼表逐步在法國普及開來,不過不知道是不是法國的保密工作做得實在太差,讓歐洲其他國家也都偷師了去,于是“擴充字典的單詞量”,以及“兩部式設計”逐漸傳遍了整個歐洲,在長達差不多200年的時間里都成了歐洲密碼系統的主流方式。不僅如此,其他國家聽說法國居然是找一個破譯密碼的人來改進自己的密碼表,也覺著這主意實在是新鮮。因為那時候人們大多覺得加密者和破譯者是一對水火不容的冤家,所以破譯者都是當“雇傭兵”來使的,有需要的時候花錢找來干一票而已——殊不知加密和破譯的技術本身就是一脈相承的,破譯高手自然有能力來設計出更安全的密碼。所謂知己知彼,百戰不殆,就像現在我們會請電腦黑客來改善網絡安全,其實也是一樣的道理。
(說了半天,還是沒說偉大密碼是啥!好吧,我錯了,下期一定說……)