陳凱
上期文章提到一種叫“ROT-13”的文字游戲,按字母表的順序往右移13位,將字母明文替換為密文,如“seeyoulater”會變成“frrlbhyngre”,不過若總是移動13位,那么密碼很容易被破解,為了讓密碼更安全,可以每一次移位替換掉一個字母后,就變動一下移動的次數(shù),于是“ROT-13”就成了“ROT-n”。例如,密碼的發(fā)送方和接收方使用“14159265358”當(dāng)作ROT-n的移動次數(shù),對明文“seeyoulater”加密后“s”變成“t”,“e”變成“i”,而再后一個字母“e”則變成了“f”。其中“14159265358”這串?dāng)?shù)字被稱為密鑰。如圖1借助MS Excel里的函數(shù),可以讓替換工作變得更輕松。
為ROT-n換鑰匙
如果密碼的發(fā)送方和接收方總是用“14159265358”當(dāng)作ROT-n的移動次數(shù),那么每經(jīng)過11次移動操作后,就只能按原有的模式再重復(fù)做移動操作,有經(jīng)驗的密碼破解者就可利用這個漏洞來猜解密碼,所以文本的發(fā)送者就要定期更換“鑰匙”。不過問題是發(fā)送和接收雙方如何知道“鑰匙”究竟是什么數(shù)字呢?假設(shè)這樣的情況:發(fā)送方和接收方身處異地,而加密后的密文與鑰匙只能交由某第三方傳達(dá)——這簡直就是考驗第三方的“誘惑耐受值”。借助一些簡單的數(shù)學(xué)工具可以找到一些簡單的解決方法。
⑴發(fā)送和接收雙方預(yù)先找到某一個很大的素數(shù)A。有許多網(wǎng)絡(luò)工具可以找大素數(shù),www.numberempire.com網(wǎng)站就提供了搜尋大素數(shù)的功能,如圖2先輸入某個很大的數(shù)字如“11221123321123443211234554321”,然后選中“Findnext”,再點“Compute”
找到最接近的素數(shù)為“112211233211234
43211234554373”,發(fā)送接收雙方在分手前預(yù)先保存好這個素數(shù)。
⑵每次在傳送信息前,接收方都要再找一個大素數(shù)B當(dāng)作鑰匙,如“1415926535897932384633”,將大素數(shù)A和大素數(shù)B相乘,得到大合數(shù)C,這里仍然可以借助網(wǎng)絡(luò)工具,如defuse.ca/big-number-calculator.htm對大數(shù)字做乘法。結(jié)果得到的合數(shù)C是“15888286272961819275349957628854586099036988150109”。然后將C交由第三方傳達(dá)給發(fā)送方。將一個很大的合式作因式分解,需很長的時間,所以即便第三方對這串?dāng)?shù)字很感興趣,在相當(dāng)長一段時間內(nèi),也無法知道素數(shù)A和B究竟是什么。
⑶發(fā)送方收到大合數(shù)C,因為事先知道大素數(shù)A,所以用簡單的除法得到B,然后將大素數(shù)B“14159265358979323
84633”作為密鑰,按字母表順序移動替換進(jìn)行ROT-n加密,然后將密文經(jīng)由第三方傳送給接收方,接收方用B作為鑰匙逆向移位解碼即可。
⑷下次又有發(fā)送信息需要的時候,接收方再重新找一個大素數(shù)B當(dāng)作鑰匙,將其與素數(shù)A相乘傳給發(fā)送方即可。
上面的例子可以用來展示加密技術(shù)原理,不過現(xiàn)實世界中使用的各種加密技術(shù)要復(fù)雜得多,數(shù)學(xué)中關(guān)于素數(shù)的許多研究都被用于加密技術(shù),有興趣的朋友可以深入研究一下。
打造永遠(yuǎn)安全的ROT-n鑰匙
世界上有沒有絕對無法破解的密碼?理論上絕對安全的密碼是“一次一密”,假如所使用的密鑰與發(fā)送信息等長且沒有任何規(guī)律,那么破解者就無從下手,可是發(fā)送接收雙方如何才能記住那沒有規(guī)律的密鑰呢?其實方法也不難,以ROT-n為例,雙方先約定好某套百科全書,然后加密方按順序依次讀該書上的任何字母,每個字母都代表特定的字母表移動次數(shù),如“a”代表移動1次,“b”代表移動2次,這么一來整部百科全書就成了密鑰。當(dāng)然,前提條件是雙方都要有這么一套百科全書。盡管這個密鑰長度仍然有限,但在相當(dāng)長的一段時間里也夠用了?!耙淮我幻堋比秉c也很明顯,一是密鑰必須隨時帶著(諜戰(zhàn)影片里特工常會隨身帶著一本書當(dāng)密鑰),二是如果發(fā)送方發(fā)送了很長的信息而接收方?jīng)]有收到,雙方使用的密鑰就無法同步了,所以還需要另外引入同步密鑰的機制。