花卷
上期我們講到,文藝復(fù)興時(shí)期,意大利一位著名的不務(wù)正業(yè)的建筑師阿爾伯蒂,居然在15世紀(jì)就設(shè)計(jì)出了一種劃時(shí)代的“密碼盤”,就連之后兩百年出現(xiàn)的密碼學(xué)家跟他相比都顯得黯然失色了。上期我們還演示了如何用阿爾伯蒂的密碼盤來進(jìn)行加密和解密,那么接下來的問題就是,這種密碼盤到底先進(jìn)在哪里,又有什么弱點(diǎn)呢?
密鑰輪換的秘密
阿爾伯蒂的密碼盤到底先進(jìn)在哪里呢?讓我們先回憶一下之前加密過的內(nèi)容。之前我們把“TI AMO, TU MI AMI”這句話加密成了“Bivg&yCqiztezt”,而要把這段密文進(jìn)行解密,需要具備兩個(gè)條件:一個(gè)是和加密者一模一樣的密碼盤,二是加密者設(shè)定的基準(zhǔn)字母(在這個(gè)例子中是k)。為了讓大家看得更清楚一些,我們把原文和明文做成一張對(duì)應(yīng)表:
1. 原文: T I A M O T U M I A M I
2. 密文: B i v g & y C q i z t e z t
這里要提醒一下,密文中的兩個(gè)大寫字母(B和C)代表密碼盤的位置設(shè)定,所以它們不對(duì)應(yīng)原文中的任何字母。我們之前講過,傳統(tǒng)的單表密碼最大的弱點(diǎn)就是原文的字母和密文的字母之間存在“一對(duì)一”或者“一對(duì)多”的確定的對(duì)應(yīng)關(guān)系,利用這種關(guān)系,破譯者就可以使出頻率分析大法,抽絲剝繭般地干掉你的密碼。那么,這種確定的對(duì)應(yīng)關(guān)系,在阿爾伯蒂的密碼中是不是真的被消除了呢?別著急,我們一步一步地來分析。
首先,原文中一些重復(fù)出現(xiàn)的字母,比如T和A各出現(xiàn)了2次,I和M各出現(xiàn)了3次。拿T為例,我們可以看出,兩個(gè)T都分別被加密成了不同的字母(i和q),其他幾個(gè)字母的情況也差不多,這說明阿爾伯蒂的密碼至少擺脫了“一 一對(duì)應(yīng)”的關(guān)系。
這里你可能要問了,單表密碼通過“一字多碼”的方法,也能做到這一點(diǎn)啊?這話在理,但我們前面也講過,一字多碼只能實(shí)現(xiàn)“一對(duì)多”的對(duì)應(yīng)關(guān)系,也就是說,一個(gè)原文字母能對(duì)應(yīng)多個(gè)不同的密文字母,但一個(gè)密文字母還是只能對(duì)應(yīng)一個(gè)確定的原文字母。我們來看看阿爾伯蒂的密碼,密文中也有一些重復(fù)出現(xiàn)的字母,比如i就出現(xiàn)了2次,但是你看出來了沒,這兩個(gè)i對(duì)應(yīng)的原文字母卻是不同的(T和U),這才是阿爾伯蒂密碼盤的精髓(畫重點(diǎn)!)。
如果破譯者不知道密碼盤的結(jié)構(gòu)和用法,僅憑頻率分析的話是肯定要抓瞎的,因?yàn)橐坏┐蚱屏舜_定的對(duì)應(yīng)關(guān)系,就意味著所有字母的頻率都被混合在了一起,攪成了一鍋粥,很難各歸各位,整體上也就無法體現(xiàn)固有的頻率分布規(guī)律了。阿爾伯蒂的密碼盤之所以能夠?qū)崿F(xiàn)這一點(diǎn),靠的其實(shí)就是“密鑰輪換”。換句話說,每次遇到大寫字母時(shí),都要改變密碼盤中內(nèi)圈和外圈的位置關(guān)系,也就意味著每次遇到大寫字母都會(huì)“換”一張新的密碼表——這也正是“多表置換密碼”(Polyalphabetic substitution cipher)這個(gè)名字的由來。
密碼盤的弱點(diǎn)
由以上看來,阿爾伯蒂的密碼盤確實(shí)是該得個(gè)科技進(jìn)步一等獎(jiǎng),不過,這玩意兒真的完全干翻了頻率分析嗎?真的就無懈可擊了嗎?答案就算我不說你也知道,肯定沒那么好的事兒,下面我們來找找這個(gè)密碼盤的弱點(diǎn)吧。其實(shí),這個(gè)密碼盤的最大弱點(diǎn)就是密碼盤本身。還記得我們之前說的嗎——這種密碼要確保安全,有一個(gè)很重要的前提,即“破譯者不知道密碼盤的結(jié)構(gòu)和用法”。換句話說,如果我知道了這個(gè)密碼盤是如何輪換密鑰的,那破譯它也就不難了吧?
現(xiàn)在我們假設(shè)破譯者手里也有一個(gè)密碼盤,這個(gè)密碼盤有可能是和加密者手上的一模一樣,也有可能不是一模一樣。如果是一模一樣的,那事情就簡(jiǎn)單了,因?yàn)橹灰懒思用苷哂玫幕鶞?zhǔn)字母,那破譯者和解密者不就擁有完全一樣的信息了嘛?,F(xiàn)在的問題是,怎么才能知道基準(zhǔn)字母呢?這也不難,因?yàn)閮?nèi)圈和外圈的位置組合只有24種可能性,一個(gè)一個(gè)試唄!
當(dāng)然,上面這種情況好像有點(diǎn)太理想化了,你可以投訴破譯者“作弊”。那么假設(shè)破譯者手上的密碼盤和加密者手上的不一樣,也就是內(nèi)外圈字母的排列順序都不一樣,但是破譯者知道密碼盤是怎么用的,這樣的條件下,破譯者要怎么玩呢?如果破譯者知道密碼盤的用法,那么他肯定知道大寫字母代表密鑰輪換,而在同一個(gè)輪換周期之中,這個(gè)密碼盤也就相當(dāng)于一個(gè)簡(jiǎn)單的單表密碼。拿我們那個(gè)例子來說,C后面的密文都屬于同一個(gè)輪換周期,里面的原文字母和密文字母也就都是簡(jiǎn)單的一對(duì)一關(guān)系,你看這段原文里面有兩個(gè)字母I,加密之后的密文也就變成了兩個(gè)一樣的字母t。而且,如果兩段密文前面的大寫字母相同,也就意味著它們所用的置換表(內(nèi)外圈位置關(guān)系)也相同,如果把整篇密文按照所用的置換表做個(gè)分組,那么對(duì)于其中的每一組我們都可以用頻率分析來搞定,因?yàn)樗鼈兌贾皇呛?jiǎn)單的、一對(duì)一的單表置換而已,隨便找一個(gè)略懂頻率分析的菜鳥都能秒殺之。
多表密碼的進(jìn)化
其實(shí),阿爾伯蒂在他的專著里描述了兩種密碼盤的用法,我們之前演示的只是其中一種。這種用法有個(gè)明顯的弱點(diǎn),那就是把密鑰輪換擺在了明處,因?yàn)榇砻荑€輪換的是大寫字母,破譯者一眼就能看出來它們跟別的字母不一樣,這不是此地?zé)o銀三百兩嘛。阿爾伯蒂描述的另一種用法似乎解決了這個(gè)問題,在這種用法當(dāng)中,輪換密鑰的標(biāo)記也是用密文字母(小寫字母)來表示——還記得密碼盤的外圈上有4個(gè)數(shù)字對(duì)吧?如果解密者發(fā)現(xiàn)某個(gè)密文字母解密之后是1~4其中的某個(gè)數(shù)字,那么就代表在對(duì)接下來的密文進(jìn)行解密之前,需要先按照數(shù)字來進(jìn)行密鑰輪換。
第二種用法看起來比第一種要靠譜一點(diǎn)嗎?其實(shí)也未必,在第一種用法中,我們總共可以搭配出24種不同的置換表,但在第二種用法中,置換表的種類被迫縮減到了4種,這樣一來,對(duì)頻率分布的掩蓋效果就差了很多。更何況,那幾個(gè)數(shù)字本來的設(shè)計(jì)是為了搭配密碼字典來用的,如果把它們征用了做密鑰輪換,那也就相當(dāng)于把字典這個(gè)用法給腰斬了。
講到這里大家應(yīng)該已經(jīng)看出來了,阿爾伯蒂是個(gè)密碼學(xué)天才,這一點(diǎn)沒毛病,他設(shè)計(jì)的密碼盤可以算是多表置換密碼的老祖宗,對(duì)后世的密碼影響也是相當(dāng)大。然而,密碼盤的弱點(diǎn)也同樣非常明顯,它的弱點(diǎn)可以概括成下面這兩方面。
第一個(gè)弱點(diǎn)是它的密鑰輪換頻率太低。想想看,在什么時(shí)候進(jìn)行密鑰輪換是加密者人工選擇的,實(shí)際使用中往往是一句話一換,甚至是幾句話一換。盡管從整體上來看,頻率分布確實(shí)被打亂了,但其實(shí)每一個(gè)輪換周期中連續(xù)的文字都是用同一張置換表來加密的,這就很容易被那些眼尖的破譯者抓住小辮子。
第二個(gè)弱點(diǎn)是它的安全性極大地依賴于密碼盤的結(jié)構(gòu)不被破譯者知道。我們之前分析過了,一旦破譯者知道了密碼盤的結(jié)構(gòu)和用法,那么這種密碼的安全性就會(huì)大大降低,甚至可以說,安全性完全不如設(shè)計(jì)得稍微像樣一點(diǎn)的單表置換密碼。這種弱點(diǎn),現(xiàn)代密碼學(xué)里還給它專門起了一個(gè)名字,叫做“隱匿式安全”(Security through obscurity),意思就是說通過隱匿密碼方案上的一些細(xì)節(jié)(比如這個(gè)密碼盤的結(jié)構(gòu))來確保安全性。
毋庸置疑,這必須是個(gè)反面教材,隱匿式安全那是徹頭徹尾的自欺欺人、掩耳盜鈴—— 一個(gè)密碼方案,就不應(yīng)該有什么藏著掖著的,哪怕我把所有的技術(shù)細(xì)節(jié)都公開給你看,你照樣破解不了我的密碼,這才是貨真價(jià)實(shí)的安全吶!上面這句話,其實(shí)是密碼學(xué)中一條非常重要的原則,它還有個(gè)名字叫做“柯克霍夫原則”(Kerckhoffss principle),而且偉大的信息學(xué)宗師克勞德·香農(nóng)(Claude Shannon)也曾經(jīng)說過一句名言:“敵人了解系統(tǒng)”,意思就是說,在設(shè)計(jì)一個(gè)系統(tǒng)時(shí)應(yīng)當(dāng)假設(shè)敵人有能力完全了解該系統(tǒng)的全部細(xì)節(jié)。實(shí)際上,我們現(xiàn)在用的最主流的那些密碼算法,比如AES、RSA之類的,都遵循柯克霍夫原則。也就是說,它們的所有細(xì)節(jié),無論是設(shè)計(jì)原理還是源代碼,全都是公開的,你想看就能看(只要你能看得懂),但這絲毫不會(huì)影響它們的安全性——只要你不知道密鑰,要破解這些密碼依然是極其困難的。
上面這兩個(gè)弱點(diǎn),不務(wù)正業(yè)的阿爾伯蒂到最后也都沒能解決,估計(jì)是忙著蓋樓沒空管這攤子事兒吧。那么后人有沒有解決這兩個(gè)問題,設(shè)計(jì)出更先進(jìn)的多表置換密碼呢?答案當(dāng)然是肯定的,只不過事情得一步一步來,問題也得一個(gè)一個(gè)解決。
1508年,有一位名叫約翰尼斯·特里特米烏斯(Johannes Trithemius)的德國人寫了一部叫Polygraphia的著作,這個(gè)詞現(xiàn)在的意思已經(jīng)變了,那個(gè)時(shí)候的意思類似于“多重密碼”(poly-代表“多”,-graphia代表“記錄”)。這個(gè)特里特米烏斯挺有意思的,他是個(gè)修道士,經(jīng)常寫一些神秘兮兮的書,比如講占星術(shù)啦、通靈啦什么的。除此之外,他還負(fù)責(zé)編纂過一部編年史,但是這貨的業(yè)務(wù)水平實(shí)在不咋地,寫個(gè)歷史書居然也能開腦洞,各種胡編亂造夾帶私貨,都快把歷史寫成小說了。
除了上面說的這本Polygraphia,他在更早的1499年還寫過另外一本更奇葩的書叫做Stegnographia。如果你看過本專欄之前的連載,肯定對(duì)這個(gè)詞有點(diǎn)印象,它就是我們講希波戰(zhàn)爭(zhēng)的時(shí)候提到的“隱寫術(shù)”(Stegnography)嘛——沒錯(cuò),而且更重要的是,這個(gè)詞還就是特里特米烏斯在這本書里“首創(chuàng)”的。為啥說這本書奇葩呢?因?yàn)檫@本書的內(nèi)容看起來都是講魔法和通靈的,但其實(shí)里面另有玄機(jī),在他去世100年之后,這本書才正式印刷出版,其中給出了一部分解密用的“密鑰”,用這些密鑰解密之后,人們才恍然大悟——原來這本書是講隱寫術(shù)和密碼術(shù)的!
那么,這本Polygraphia又是講啥的呢?特里特米烏斯在這本書里面介紹了一種新的多表置換密碼,還給它起了個(gè)名字叫“方表”(Tabula recta)。方表方表,顧名思義,就是一張方形的表唄,這有什么稀奇的呢?其實(shí),特里特米烏斯的方表在多表密碼的發(fā)展史上具有非常重要的意義,因?yàn)樗亲钪囊环N多表密碼——“維熱納爾方表”的原型,而圍繞維熱納爾方表,還曾上演過一場(chǎng)精彩的攻防戰(zhàn)。
(特里特米烏斯的方表到底是什么樣的呢?它解決了阿爾伯蒂密碼盤的哪些問題呢?關(guān)于維熱納爾方表的攻防戰(zhàn)又是怎么一回事?我們下期繼續(xù)講。)