摘自《數學之美》,作者:吳軍
2007年,我看了電視劇《暗算》,很喜歡它的構思和裡面的表演。其中有一個故事提到了密碼學,故事本身不錯,但是有點故弄玄虛。不過有一點是對的,就是當今的密碼學是以數學為基礎的。(沒有看過《暗算》的讀者可以看一下網上的介紹,因為後面會多次提到這部電視劇。)
密碼學的歷史大致可以追溯到兩千年前,相傳古羅馬名將愷撒為了防止敵方截獲情報,用密碼傳送情報。愷撒的做法很簡單,就是對二十幾個羅馬字母建立一張對應表,如下表所示。
這樣,如果不知道密碼本,即使截獲一段信息也看不懂,比如收到一個的消息是ABKTBP,那麼在敵人看來是毫無意義的字,通過密碼本破解出來就是CAESAR一詞,即愷撒的名字。這種編碼方法史稱愷撒大帝,現在市場上還有這一類的玩具賣,見下圖。
當然,學過資訊理論的人都知道,只要多截獲一些情報(即使是加密的),統計一下字母的頻率,就可以破解出這種密碼。柯南·道爾在他的《福爾摩斯探案集》中「跳舞的小人」的故事裡已經介紹了這種小技巧(見下圖)。近年來在很多諜報題材的電視劇中,編劇還在經常使用這種蹩腳的密碼,比如用菜價(一組數字)傳遞信息,這些數字對應康熙字典的頁碼和字的次序。對於學過資訊理論的人來說,破譯這種密碼根本不需要密碼本,只要多收集幾次情報就可以破譯出來。
從愷撒大帝到20世紀初很長的時間裡,密碼的設計者們在非常緩慢地改進技術,因為他們的工作基本上靠經驗,沒有自覺地應用數學原理(當然當時還沒有資訊理論)。人們漸漸意識到一個好的編碼方法會使得解密者無法從密碼中統計出明碼的統計信息。有經驗的編碼者會把常用的詞對應成多個密碼,使得破譯者很難統計出任何規律。比如,如果將漢語中的「是」一詞對應於唯一一個編碼0543,那麼破譯者就會發現0543出現的特別多。但如果將它對應成0543、373、2947等等10個密碼,每次隨機地選用一個,每個密碼出現的次數就不會太多,而且破譯者也無從知道這些密碼其實對應一個字。這裡面已經包含著樸素的機率論的原理。
好的密碼必須做到不能根據已知的明文和密文的對應推斷出新的密文的內容。從數學的角度上講,加密的過程可以看作是一個函數的運算F,解密的過程是反函數的運算。明碼是自變量,密碼是函數值。好的(加密)函數不應該通過幾個自變量和函數值就能推出函數。這一點在第二次世界大戰前做得很不好。歷史上有很多在這方面設計得不周到的密碼的例子。
比如在第二次世界大戰中,日本軍方的密碼設計就很成問題。美軍破獲了日本很多碼。在中途島海戰前,美軍截獲的日軍密電經常出現AF這樣一個地名,應該是太平洋的某個島嶼,但是美軍無從知道是哪個。於是,美軍就逐個發布自己控制的島嶼有關的假新聞。當美軍發出「中途島供水系統壞了」這條假新聞後,從截獲的日軍情報中又看到含有AF的電文(日軍情報內容是AF供水出了問題),美軍就斷定中途島就是AF。事實證明判斷正確,美軍在那裡成功地伏擊了日本聯合艦隊。
已故的美國情報專家雅德利二戰時曾經在重慶幫助中國政府破解日本的密碼。他在重慶的兩年里做得最成功的一件事,就是破解了日軍和重慶間諜的通信密碼,並因此破譯了幾千份日軍和間諜之間通信的電文,從而破獲了國民黨內奸「獨臂海盜」為日軍提供重慶氣象信息的間諜案。雅德利(及一位中國女子徐貞)的工作,大大減輕了日軍對重慶轟炸造成的傷害。雅德利回到美國後寫了本書《中國黑室》介紹這段經歷,但是該書直到1983年才被獲准解密並出版。從書中的內容可以了解到,當時日本在密碼設計上有嚴重的缺陷。日軍和重慶間諜約定的密碼本就是美國著名作家賽珍珠獲得1938年諾貝爾文學獎的《大地》一書。
這本書很容易找到,解密時只要接密碼電報的人拿著這本書就能解開密碼。密碼所在的頁數就是一個非常簡單的公式:發報日期的月數加上天數,再加上10。比如3月11日發報,密碼就在3+11+10=24頁。這樣的密碼設計違背了我們前面介紹的「加密函數不應該通過幾個自變量和函數值就能推出函數本身」這個原則,這樣的密碼,破譯一篇密文就可能破譯以後全部的密文。
該書中還提到日軍對保密的技術原理所知甚少。有一次日本的馬尼拉使館向外發報時,發到一半機器卡死,然後居然就照單重發一遍了事,這種同文密電在密碼學上是大忌(和我們現在VPN登錄用的安全密鑰一樣,密碼機加密時,每次應該自動轉一輪,以防同一密鑰重複使用,因此即使是同一電文,兩次發送的密文也應該是不一樣的)。
另外,日本外交部在更換新一代密碼機時,有些距離遠的國家的使館因為新機器到位較晚,他們居然還使用老機器發送。這樣就出現新老機器混用的情況,同樣的內容美國會收到新老兩套密文,由於日本舊的密碼很多已被破解,這樣會導致新的密碼一出台就毫無機密可言。總的來講,日本在第二次世界大戰中情報經常被美國人破譯,他們的海軍名將山本五十六(他爸爸56歲時生的他,所以起名五十六)地因此喪命'。我們常講落後是要挨打的,其實不會使用數學也是要挨打的。