雷耶夫斯基設(shè)計的循環(huán)測定機(jī)示意圖(1934~1935年)
花卷
科普作者,資深技術(shù)圖書譯者,譯有《圖解密碼技術(shù)》《代碼的未來》等。
小雷使出神之一手,推算出來德國軍用版Enigma全部3個轉(zhuǎn)輪的接線方式,這真的是立了一個大功。Enigma的三個秘密——轉(zhuǎn)輪、每日密鑰、指標(biāo)組,其中轉(zhuǎn)輪的秘密已經(jīng)被完全破解,而指標(biāo)組是用每日密鑰加密的,因此只要破解了每日密鑰,指標(biāo)組也就不是秘密了。
看到這里你可能要問了,法國情報局不是有個神通廣大的“德奸”施密特潛伏在德國密碼局嗎?如果能繼續(xù)偷到每日密鑰的表格,那不就大功告成了嗎?怎么說呢,天下沒有不透風(fēng)的墻,間諜這種事情,做多了早晚會被人察覺和提防,而且施密特也并沒有那么神通廣大,之前他也只能拿到已經(jīng)過期失效的密鑰表格,那些過時的信息可以幫助小雷解開他的置換方程組,卻沒辦法幫助波蘭人破譯此時此刻正在滿天飛的德軍密電。
回到正題,每日密鑰現(xiàn)在成了唯一的秘密,小雷他們必須集中精力打敗這個最終BOSS。我們先來回憶一下,每日密鑰到底包合哪些內(nèi)容。首先,Enigma一共有3個轉(zhuǎn)輪,這3個轉(zhuǎn)輪是可以拆卸并交換位置的,因此每日密鑰需要規(guī)定3個轉(zhuǎn)輪從左至右的安裝順序(Walzenlage);其次,就是這3個轉(zhuǎn)輪各自的初始位置(Grulndstellung);第三,每個轉(zhuǎn)輪的接線方式是可以偏移的,轉(zhuǎn)輪外側(cè)有一個帶刻度的圓環(huán),轉(zhuǎn)動圓環(huán)可以讓接線方式偏移0到25個位置,因此每日密鑰還規(guī)定了圓環(huán)的位置(Ringstellung);最后,別忘了軍用版Enigma還有一個惡心的連接板,它可以將輸入的字母兩兩交換,因此每日密鑰中還需要規(guī)定連接板的接法(Steckerverbindungen)。
在此之前,小雷已經(jīng)利用群論等數(shù)學(xué)方法,將電文的前6個字母,也就是加密后的指標(biāo)組,寫成了6個置換方程,只要有足夠的電文資料,就可以計算出當(dāng)天指標(biāo)組的“特征結(jié)構(gòu)”,也就是Enigma在這6個字母位置上的置換關(guān)系。我們前面也提到過,大部分情況下,加密指標(biāo)組為6個字母時,只有最右側(cè)的轉(zhuǎn)輪會步進(jìn),左側(cè)和中間的兩個轉(zhuǎn)輪都是固定不動的,再加上反射器本來就是固定不動的,那么我們就可以認(rèn)為,“中間轉(zhuǎn)輪→左側(cè)轉(zhuǎn)輪→反射器→左側(cè)轉(zhuǎn)輪→中間轉(zhuǎn)輪”這整個一條路徑,對于加密指標(biāo)組的過程來說,都是固定不變的。
固定不變的東西,也就是可以忽略的東西了,于是小雷又推出一組方程,具體的內(nèi)容我們不寫,大致的意思是,6個字母指標(biāo)組的置換,分別與右側(cè)轉(zhuǎn)輪的置換、當(dāng)前右側(cè)轉(zhuǎn)輪所在位置,以及連接板的置換進(jìn)行運算,所得到的6組置換,應(yīng)該是完全相同的。這些條件里面,右側(cè)轉(zhuǎn)輪的置換,其實就是右側(cè)轉(zhuǎn)輪的接線方式。雖然我們不知道3個轉(zhuǎn)輪里面哪個放在右側(cè),但既然3個轉(zhuǎn)輪的接線方式都已經(jīng)知道了,無非只有3種可能性而已。而右側(cè)轉(zhuǎn)輪所在位置,也只有26種可能性而已。至于連接板,由于當(dāng)時德軍只交換6對字母,所以對結(jié)果的干擾不算太大,稍微努力一下還是可以克服的。
于是,小雷要做的,就是嘗試所有的可能性,找到一種特定的情況,使得計算出的6組置換是非常相似的(由于連接板的存在,因此6組置換不是完全相等的),這也就意味著破解了右側(cè)轉(zhuǎn)輪的編號以及它的初始位置,而最后一個未知數(shù),也就是連接板的接法,自然就隨之迎刃而解了。當(dāng)然了,這個原理說起來簡單,實際計算起來卻是非常費時費力的。于是小雷就發(fā)明了一套工具,把每個轉(zhuǎn)輪的26個位置所計算出的置換結(jié)果印在底紙上,然后將通過電文計算出來的6組指標(biāo)組置換寫在另一張紙上,并在紙上裁出6條格子,然后蓋在印有轉(zhuǎn)輪置換的底紙上。這樣一來,只要逐行移動上面一張紙的位置,就可以更快地比對出具備一定相似性的置換。
一旦破解了右側(cè)轉(zhuǎn)輪和連接板,剩下的兩個轉(zhuǎn)輪就簡單多了,因為它們的位置幾乎是固定不變的,而且也不受連接板的干擾。剩下兩個轉(zhuǎn)輪當(dāng)然也可以用小雷的格子法來搞定,但是既然它們的置換是固定的,那我事先把所有的置換都算出來做一張表不就好了嗎?所有的置換有多少種呢?3個轉(zhuǎn)輪放在2個位置上有3×2=6種可能性,每個轉(zhuǎn)輪有26種位置,那么兩個轉(zhuǎn)輪就是26×26=676種可能性,那么總共就是6×676=4056種置換——這個數(shù)字并不大!于是,小雷和同事們就日以繼夜地做了那么一張大表,剩下兩個轉(zhuǎn)輪的順序和位置,只要一查就可以分分鐘破解!
好了,每日密鑰的4大要素,我們已經(jīng)破解了其中的3個,就只剩下那個偏移圓環(huán)的位置不知道了。對于這塊硬骨頭,小雷也只能硬啃,每個轉(zhuǎn)輪的偏移圓環(huán)有26個位置,那么總共就是26×26×26=17576種可能性。這個數(shù)字說大吧,也還算可以,因為畢竟不是每次都趕上最壞的情況。但問題是,即便是要用窮舉法一個一個試過來,我怎么才能驗證試到哪一種可能性就是正確的呢?要想驗證結(jié)果對不對,我們需要一些線索,比如加密之前的一部分明文的內(nèi)容,也就是我們之前提過的“已知明文攻擊(known plain-text attack)”,這是一種非常重要的密碼攻擊方法(快拿個本子記下來)。
可是,怎么才能知道一部分明文的內(nèi)容呢?這時候德國人的循規(guī)蹈矩又幫個了大忙,根據(jù)可靠的分析,德軍的大部分電文正文開頭三個字母都是ANX。這個神秘的ANX到底是什么意思呢?AN是德語里“TO”的意思,也就是“發(fā)給×××”,用來指定電報的收件人;而后面一個×則是代表空格,因為Enigma鍵盤上只有26個字母,沒有數(shù)字、標(biāo)點和空格,因此這些東西都需要用特定的字母來替代,其中×就用來代表空格。
有了這個線索,剩下的就是用最簡單暴力的窮舉法一個一個嘗試了。波蘭人手上有復(fù)刻版的Enigma機(jī)器,還有用小雷的格子法計算出來的轉(zhuǎn)輪排列、初始位置以及連接板的接法,把這些條件都用上之后,他們就不斷改變偏移圓環(huán)的位置來嘗試解密正文,如果碰巧解出了ANX三個字母,那就說明他們成功啦!一旦找到了偏移圓環(huán)的位置,就意味著每日密鑰的所有要素都已經(jīng)被破解了,也就是說,這一天所有的德軍電文,波蘭人統(tǒng)統(tǒng)能夠輕松破譯!
盡管如此,畢竟密鑰是每天變化的,每一天對波蘭人來說都是爭分奪秒,因為越早破解每日密鑰的所有要素,就能夠越早解讀當(dāng)天的電文。在這個問題上,德國人又放松了警惕——我們之前也提到過,Enigma的轉(zhuǎn)輪排列順序不是每天換的,而是每三個月才換的。這樣一來,波蘭人就用不著每天拿著三張底紙去搜索正確的置換,而是只要拿一張就夠了,因為他們知道最右側(cè)的轉(zhuǎn)輪是哪一個,這工作效率可就大大提高了。
在破譯密電這件事上,時間就是生命,小雷對這個格子法的效率并不滿意,他認(rèn)為這個方法還是非常的“費勁”。還記得小雷之前發(fā)現(xiàn)的那個“特征結(jié)構(gòu)”嗎?簡單來說,就是電文前6個字母(加密的指標(biāo)組)可以形成一些有規(guī)律的循環(huán)序列。小雷又發(fā)現(xiàn),盡管連接板的變化可以影響循環(huán)序列中所出現(xiàn)的字母,但是卻不影響循環(huán)序列的長度特征!于是小雷靈機(jī)一動,我們?yōu)槭裁床荒苡醚h(huán)序列的長度特征作為索引,從而像查字典一樣快速查出所對應(yīng)的置換呢?
小雷通過計算發(fā)現(xiàn),對于1對指標(biāo)組置換來說,循環(huán)序列的長度總共只有101種模式,而指標(biāo)組置換共有3對,因此101的三次方總共有100多萬種組合;而3個轉(zhuǎn)輪所產(chǎn)生的置換變化總共有6×26×26×26=105 456種,它們之間是多對多的對應(yīng)關(guān)系。我們可以先計算出指標(biāo)組的循環(huán)序列長度模式,再查出這個模式對應(yīng)那些置換——通常來說,一種循環(huán)序列長度只對應(yīng)一種或者幾種置換——也就可以破解每日密鑰了,更重要的是,這個過程完全不受連接板的影響!
于是,小雷的任務(wù)就是要制作出一本包含105456種置換表的字典,然后把它們按100多萬種循環(huán)長度模式進(jìn)行索引。然而,在沒有計算機(jī)的年代,純手工制作這本字典可以說是相當(dāng)艱難,而且還容易出錯。我們的小雷同學(xué)之所以能被后人稱為破譯Enigma的第一功臣,那自然是搞出過超級神器的,這個神器就叫作“循環(huán)測定機(jī)(Cyclometer)”。
這玩意兒是干啥用的呢?當(dāng)然是用來編那本字典的。這個機(jī)器里面裝了兩套Enigma轉(zhuǎn)輪,通過特定的方式把它們連接在一起,然后通過讓轉(zhuǎn)輪按規(guī)則步進(jìn),在機(jī)器上顯示出相應(yīng)的置換和循環(huán)序列,然后再由工作人員抄在紙上。雖然這個過程還不是特別自動化,但總比一個一個手工計算要快多了,也準(zhǔn)確多了。根據(jù)小雷的回憶,他們花了將近一年的時間才編好這本字典,但是一旦有了這本字典,波蘭人只要花大約15分鐘的時間,就可以完全破譯當(dāng)天的每日密鑰!這個速度簡直是逆天了!
不知道是波蘭人的保密工作做得不好,還是德國人的嗅覺太靈敏,從1936年起,德國人開始密集地提高Enigma加密流程復(fù)雜度。比如說,Enigma的轉(zhuǎn)輪順序原本是三個月一換的,從1936年2月開始變成每月一換,到了1936年11月又變成每天一換——這給波蘭人設(shè)置了一個很大的障礙,但努努力還是可以克服的??筛愀獾氖牵?937年11月,德國人更換了所有Enigma密碼機(jī)上面的反射器,也就是說,波蘭人之前計算出的所有置換表一夜之間都變成了廢紙,他們不得不再花一年的時間做一本新的字典出來。
如果上面這兩件事還不算太糟,那下面這件事可就是毀滅性的打擊了。1938年9月,德國空軍和陸軍全面改變了指標(biāo)組的加密方式,其中最重要的改變是,一天中每封電文的指標(biāo)組不再使用同一個轉(zhuǎn)輪初始位置來加密了,這讓小雷之前發(fā)現(xiàn)的“特征結(jié)構(gòu)”也報廢了,相應(yīng)地,循環(huán)測定機(jī)也就跟著報廢了。我要是小雷,那真是要氣得一口老血噴出來。
小雷這幾年被弄得心力交瘁,這時候他的隊友齊加爾斯基給他搭了一把手。我們之前也講過,齊加爾斯基——我們還是叫“小齊”吧——跟小雷是大學(xué)同學(xué),也是一起被密碼局挑進(jìn)去的三位數(shù)學(xué)家中的一位。一開始,破譯Enigma的工作只有小雷一個人做,后來另外兩個人才被允許參加這項任務(wù)。小齊發(fā)現(xiàn),盡管德國人修改了加密流程,現(xiàn)在每條電文的指標(biāo)組都不是用統(tǒng)一的密鑰來加密了,但是有一件事沒變,那就是指標(biāo)組依然重復(fù)加密兩次,這6個字母的置換也依然是按規(guī)律步進(jìn)的。
小齊還發(fā)現(xiàn),有大約1/8的電文會出現(xiàn)一種特殊情況,那就是指標(biāo)組的第1/4或者2/5或者3/6個字母被加密成了同一個字母。我們知道,指標(biāo)組的明文本來就是重復(fù)兩遍的,比如ATXATX,但是加密之后,理論上說,相同的字母應(yīng)該會被加密成不同的字母,比如說GYKPWR,但是偶爾也會碰上特殊情況,比如說被加密成了GYKGWR,或者GYKPYR,或者GYKPWK,也就是第1/4、2/5、3/6個字母的密文也重復(fù)了。
小齊把這種情況稱為“samiczki”,翻譯過來是“女性(female)”的意思,我也不知道這里面是個什么梗,大概寄托了宅男數(shù)學(xué)家們的一些荷爾蒙沖動。反正他認(rèn)為這種情況是可以被利用的,并且發(fā)明了一套穿孔紙片。這套紙片分為6組,因為3個轉(zhuǎn)輪共有6種排列順序;每一組有26張紙片,代表最左側(cè)轉(zhuǎn)輪的26種可能的初始位置;每張紙片上印有51×51的方陣,代表中間和右側(cè)轉(zhuǎn)輪的所有可能的位置組合。這套紙片的關(guān)鍵在于上面打的密密麻麻的小孔,打孔的地方表示在這個位置組合上,可能出現(xiàn)一對“samiczki”。只要有足夠數(shù)量的包含“samiczki”的電文樣本,通過這些紙片上的孔來進(jìn)行篩選,就可以找出有限的幾個可能的組合,這也就意味著成功破譯了當(dāng)天的每日密鑰。
(正所謂道高一尺魔高一丈,盡管波蘭人如此努力,但德國人也不會善罷甘休。“二戰(zhàn)”的戰(zhàn)火即將點燃,留給波蘭人的時間不多了,面對不斷升級的Enigma,波蘭人將何去何從?我們接下來會繼續(xù)講。)
齊加爾斯基設(shè)計的穿孔紙片