服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

我在看完這些內容之後,一臉茫然,只好對勒格朗說:“這些都是什麼意思啊?我是一點兒都看不懂這上面的內容是什麼啊!假如只有破解這封密碼信才能得到金銀財寶,那我只能說,自己根本沒有得到金銀財寶的命了!”

——愛倫·坡《金甲蟲》

一提到“密碼”,我們第一反應可能是,我們平時登錄淘寶或者QQ 時需要輸入的那個密碼,或者刷信用卡或者在ATM 上取錢時輸入的密碼。但是,上面這種“密碼”跟我們本文要探討的“密碼”幾乎是完全不同的兩碼事。

無論是上淘寶還是刷卡時輸入的密碼,都只是一種身份驗證的憑據,換句話說,也就是向系統證明你才是這個賬號或銀行卡的主人的一種證據——跟“天王蓋地虎!”“寶塔鎮河妖!”差不多是一回事。嚴格來說,這種“密碼”應該叫作“口令”(對應英文中的password、passcode 或者pin)。

我們要說的“密碼”是什麼呢?簡單來說,密碼(對應英文中的cryptography)是一個非常龐大而複雜的信息處理體系,涉及信息的機密性、完整性、認證等許多方面,由此衍生出的技術無時無刻不在保衛著我們生活中的各種信息的安全。

舉例來說,比如戰爭劇裡用來加密解密通信消息的技術。在戰爭劇裡,總能看到這樣的一幕:戰事特別緊張,好多人緊鑼密鼓地研究如何破譯敵方密碼......

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

《模仿遊戲》劇照

這密密麻麻的數字和字母,真的讓人望而生畏,但下面這篇文章卻讓我對密碼學有了新的認識:只要解釋得當,密碼技術也可以變得很簡單。

下面我們就將介紹歷史上幾種著名的密碼:

● 愷撒密碼

● 簡單替換密碼

● Enigma

以及兩種破譯密碼的方法(即合法接收者以外的人試圖由密文還原出明文的方法)。

● 暴力攻擊

● 頻率分析

來一起跨過密碼技術的大門!

本文介紹的密碼在現代雖然都已經不再使用了,但在尋找密碼弱點的方法、破譯密碼的思路以及密碼算法與密鑰的關係等方面,這些密碼與現代的密碼技術依然是相通的。

愷撒密碼

首先,我們來介紹一種最簡單的密碼——愷撒密碼。

一、什麼是愷撒密碼

愷撒密碼( Caesar cipher)是一種相傳尤利烏斯·愷撒曾使用過的密碼。愷撒於公元前100年左右誕生於古羅馬,是一位著名的軍事統帥。

愷撒密碼是通過將明文中所使用的字母表按照一定的字數“平移”來進行加密的。在漢語(例如漢語拼音)中也可以用同樣的思路來實現愷撒密碼,但為了簡化內容,在這裡我們只使用英文字母。

本文中,為了講解方便,我們用小寫字母(a, b, c, ...)來表示明文,用大寫字母(A, B, C, ...)來表示密文。

現在我們將字母表平移3 個字母,於是,明文中的a 在加密後就變成了與其相隔3 個字母的D,以此類推,b 變成E,c 變成F,d 變成G……v 變成Y,w 變成Z,而x 則會回到字母表的開頭而變成A,相應地,y 變成B,z 變成C。通過圖1 我們可以很容易地理解“平移”的具體工作方式。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

圖1 愷撒密碼中將字母表“平移”

二、愷撒密碼的加密

這裡,我們假設要保密的信息為yoshiko 這個女性的名字。我們暫且不管這個名字到底代表一位真實的女性,還是隻是一種暗號,只考慮將它在保密的狀態下發送給接收者。

此時,明文包含下列7 個字母。

yoshiko

接下來我們將明文中的字母逐一進行加密。

y → B

o → R

s → V

h → K

i → L

k → N

o → R

這樣,明文yoshiko 就被轉換成了密文BRVKLNR,yoshiko 這個詞我們能夠看懂,但BRVKLNR 就看不懂了。

愷撒密碼中,將字母表中的字母平移這個操作就是密碼的算法,而平移的字母數量則相當於密鑰。在上面的例子中,密鑰為3(圖2)。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

圖2 用愷撒密碼進行加密(密鑰為3)

三、愷撒密碼的解密

現在,假設接收者已經收到了密文BRVKLNR,由於密文本身是看不懂的,因此必須將它解密成明文。

愷撒密碼的解密過程是使用與加密時相同的密鑰進行反向的平移操作。用剛才的例子來說,只要反向平移3 個字母就可以解密了。

B → y

R → o

V → s

K → h

L →i

N → k

R → o

這樣我們就得到了明文yoshiko。

在這個場景中,密鑰3 必須由發送者和接收者事先約定好。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

圖3 用愷撒密碼進行解密(密鑰為3)

四、用暴力破解來破譯密碼

通過上面的講解,我們知道對於發送者用愷撒密碼加密過的密文,接收者是能夠進行解密的,因此發送者可以向接收者成功發送yoshiko 這條消息。

那麼,接收者以外的人(即不知道密鑰3 的人)在看到密文BRVKLNR 後,是否能夠猜測到明文yoshiko 呢?也就是說,愷撒密碼能夠被破譯嗎?

在愷撒密碼中,密鑰就是字母表平移的字數。由於字母表只有26 個字母,因此加密用的密鑰只有0 到25 共26 種(平移0 個字母實際上相當於沒有加密,但在這裡我們也將這種情況考慮進去)。

下面我們按順序將這26 種密鑰都嘗試一遍。

BRVKLNR → 用密鑰 0 解密 → brvklnr

BRVKLNR → 用密鑰 1 解密 → aqujkmq

BRVKLNR → 用密鑰 2 解密 → zptijlp

BRVKLNR → 用密鑰 3 解密 → yoshiko

BRVKLNR → 用密鑰 4 解密 → xnrghjn

BRVKLNR → 用密鑰 5 解密 → wmqfgim

BRVKLNR → 用密鑰 6 解密 → vlpefhl

BRVKLNR → 用密鑰 7 解密 → ukodegk

BRVKLNR → 用密鑰 8 解密 → tjncdfj

BRVKLNR → 用密鑰 9 解密 → simbcei

BRVKLNR → 用密鑰10 解密 → rhlabdh

BRVKLNR → 用密鑰11 解密 → qgkzacg

BRVKLNR → 用密鑰12 解密 → pfjyzbf

BRVKLNR → 用密鑰13 解密 → oeixyae

BRVKLNR → 用密鑰14 解密 → ndhwxzd

BRVKLNR → 用密鑰15 解密 → mcgvwyc

BRVKLNR → 用密鑰16 解密 → lbfuvxb

BRVKLNR → 用密鑰17 解密 → kaetuwa

BRVKLNR → 用密鑰18 解密 → jzdstvz

BRVKLNR → 用密鑰19 解密 → iycrsuy

BRVKLNR → 用密鑰20 解密 → hxbqrtx

BRVKLNR → 用密鑰21 解密 → gwapqsw

BRVKLNR → 用密鑰22 解密 → fvzoprv

BRVKLNR → 用密鑰23 解密 → euynoqu

BRVKLNR → 用密鑰24 解密 → dtxmnpt

BRVKLNR → 用密鑰25 解密 → cswlmos

嘗試一遍之後,我們就會發現當密鑰為3 時,可以解密出有意義的字符串yoshiko。這就意味著我們僅僅根據密文就推測出了密鑰和明文,這樣的密碼有什麼用呢?愷撒密碼實在是太脆弱了,無法保護重要的秘密。

上面介紹的這種密碼破譯方法,就是將所有可能的密鑰全部嘗試一遍,這種方法稱為暴力破解( brute-force attack)。由於這種方法的本質是從所有的密鑰中找出正確的密鑰,因此又稱為窮舉搜索( exhaustive search)。

小測驗1 破譯愷撒密碼

假設你收到了以下用愷撒密碼加密過的密文,但你不知道密鑰(平移的字母數),請破譯這段密文。PELCGBTENCUL

簡單替換密碼

一、什麼是簡單替換密碼

愷撒密碼是通過將明文中所使用的字母表平移來生成密文的。但是,如果我們將字母表中的26 個字母,分別與這26 個字母本身建立一對一的對應關係,那麼無論哪一種對應關係就都可以作為密碼來使用。這種將明文中所使用的字母表替換為另一套字母表的密碼稱為簡單替換密碼( simple substitution cipher)。愷撒密碼也可以說是簡單替換密碼的一種。

例如,圖4 就是一個簡單替換密碼的對應表(替換表)。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

圖4 簡單替換密碼的替換表(例)

二、簡單替換密碼的加密

簡單替換密碼的加密過程是依次將明文中的每一個字母按照替換表替換成另一個字母。

例如,我們可以用圖4 中的替換表,對剛才愷撒密碼例子中的明文yoshiko 進行加密。參照圖4,依次對每個字母進行替換。

y → K

o → B

s → L

h → T

i → J

k → S

o → B

就可以得到密文KBLTJSB。

三、簡單替換密碼的解密

只要使用加密時所使用的替換表進行反向替換,就可以對簡單替換密碼進行解密了。

由於在簡單替換密碼的解密中,需要用到加密時所使用的替換表,因此發送者和接收者必須事先同時擁有該替換表,而這份替換表也就相當於簡單替換密碼的密鑰。

四、簡單替換密碼的密鑰空間

yoshiko 用愷撒密碼(密鑰為3)加密後的密文是BRVKLNR,而用簡單替換密碼(密鑰為圖4)加密後的密文則是KBLTJSB。無論是BRVKLNR 還是KBLTJSB 都是無法看懂的字符串,在這一點上它們是相似的。單從密文上來看,我們無法判斷出愷撒密碼和簡單替換密碼到底哪一種更難破解。

愷撒密碼可以通過暴力破解來破譯,但簡單替換密碼很難通過暴力破解來破譯 。這是因為簡單替換密碼中可以使用的密鑰數量,比愷撒密碼要多得多。

為了確認這一點,我們來計算一下簡單替換密碼中可以使用的密鑰總數。一種密碼能夠使用的“所有密鑰的集合”稱為 密鑰空間( keyspace),所有可用密鑰的總數就是密鑰空間的大小。密鑰空間越大,暴力破解就越困難。

簡單替換密碼中,明文字母表中的a 可以對應A, B, C, ..., Z 這26 個字母中的任意一個(26種),b 可以對應除了a 所對應的字母以外的剩餘25 個字母中的任意一個(25 種)。以此類推,我們可以計算出簡單替換密碼的密鑰總數為:

26×25×24×23× … ×1 = 403291461126605635584000000

這個數字相當於4 兆的約100 兆倍,密鑰的數量如此巨大,用暴力破解進行窮舉就會非常困難。因為即便每秒能夠遍歷10 億個密鑰,要遍歷完所有的密鑰也需要花費超過120 億年的時間。

1 兆等於 1 萬億,即 10的12次方,這裡所計算的簡單替換密碼的密鑰總數約為 4×10的26次方,或者約為 2的88次方。

如果密碼破譯者的運氣足夠好,也許在第一次嘗試時就能夠找到正確的密鑰,但反過來說,如果運氣特別差,也許嘗試到最後一次才能找到正確的密鑰。因此平均來說,要找到正確的密鑰也需要花費約60 億年的時間。

五、用頻率分析來破譯密碼

雖然用暴力破解很難破譯簡單替換密碼,但使用被稱為頻率分析的密碼破譯方法,就能夠破譯簡單替換密碼 。

頻率分析利用了明文中的字母的出現頻率與密文中的字母的出現頻率一致這一特性。儘管篇幅較長,但為了讓大家體會到破譯密碼的感覺,我們還是來實際嘗試破譯一段密文吧。

假設你得到了下面一段密文,已知明文是用英語寫的,並且是通過簡單替換密碼進行的加密,但是你不知道作為密鑰的替換表。下面就讓我們來破譯這段密文。

MEYLGVIWAMEYOPINYZGWYEGMZRUUYPZAIXILGVSIZZMPGKKDWOMEPGROEIWGPCEIPAMDKKEYCIUYMGIFRWCEGLOPINYZHRZMPDNYWDWOGWITDWYSEDCEEIAFYYWMPIDWYAGTYPIKGLMXFPIWCEHRZMMEYMEDWOMGQRYWCEUXMEDPZMQRGMEEYAPISDWOFICJILYSNICYZEYMGGJIPRWIWAIHRUNIWAHRZMUDZZYAMEYFRWCEMRPWDWOPGRWAIOIDWSDMEIGWYMSGMEPYYEYHRUNYARNFRMSDMEWGOPYIMYPZRCCYZZIOIDWIWAIOIDWEYMPDYAILMYPMEYMYUNMDWOUGPZYKFRMIMKIZMEIAMGODTYDMRNIWASIKJYAISIXSDMEEDZWGZYDWMEYIDPZIXDWODIUZRPYMEYXIPYZGRPDMDZYIZXMGAYZNDZYSEIMXGRCIWWGMOYM

首先,我們來統計一下這段密文中每個字母出現的頻率。也就是說,我們要數一下每個字母各出現了多少次。結果如表1 所示。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

表1 密文中各字母出現的頻率表

為了找到破譯的線索,我們再來看一看英語文章中所使用的字母的頻率。例如,將愛倫·坡的《金甲蟲》中出現的英文字母按照出現頻率排序的結果是:e, t, a, o, i, n, s, h, r, d, l,u, c, m, f, w, g, y, p, b, v, k, j, q, z。這個順序根據所統計的文章的不同會有所變化,但一般的英語文章中出現頻率最高的字母是e,這一點基本上是不會錯的。

表1 中出現頻率最高的兩個字母是I 和Y,我們假設它們中的其中一個是e。當假設Y → e 時,我們將密文中的Y 全部替換成e,替換後的密文如下。

MEeLGVIWAMEeOPINeZGWeEGMZRUUePZAIXILGVSIZZMPGKKDWOMEPGROEIWGPCEIPAMDKKEeCIUeMGIFRWCEGLOPINeZHRZMPDNeWDWOGWITDWeSEDCEEIAFeeWMPIDWeAGTePIKGLMXFPIWCEHRZMMEeMEDWOMGQReWCEUXMEDPZMQRGMEEeAPISDWOFICJILeSNICeZEeMGGJIPRWIWAIHRUNIWAHRZMUDZZeAMEeFRWCEMRPWDWOPGRWAIOIDWSDMEIGWeMSGMEPeeEeHRUNeARNFRMSDMEWGOPeIMePZRCCeZZIOIDWIWAIOIDWEeMPDeAILMePMEeMeUNMDWOUGPZeKFRMIMKIZMEIAMGODTeDMRNIWASIKJeAISIXSDMEEDZWGZeDWMEeIDPZIXDWODIUZRPeMEeXIPeZGRPDMDZeIZXMGAeZNDZeSEIMXGRCIWWGMOeM

英語中出現最多的單詞是the,因此我們可以尋找一下以e 結尾的3 個字母的組合,結果我們發現MEe 這3 個字母的組合是最常出現的,而且MEe 出現在密文的開頭,因此MEe 很有可能就是the。

於是,我們再假設M → t,E → h。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

讓我們動員自己所有的英語詞彙,在上面的文字中繼續尋找可能的組合。我們發現中間有一個詞thPee 比較可疑,這個詞不會就是three 吧(P → r)?

theLGVIWAtheOrINeZGWehGtZRUUerZAIXILGVSIZZtrGKKDWOthrGROhIWGrChIrAtDKKheCIUetGIFRWChGLOrINeZHRZtrDNeWDWOGWITDWeShDChhIAFeeWtrIDWeAGTerIKGLtXFrIWChHRZtthethDWOtGQReWChUXthDrZtQRGthheArISDWOFICJILeSNICeZhetGGJIrRWIWAIHRUNIWAHRZtUDZZeAtheFRWChtRrWDWOrGRWAIOIDWSDthIGWetSGthreeheHRUNeARNFRtSDthWGOreIterZRCCeZZIOIDWIWAIOIDWhetrDeAILtertheteUNtDWOUGrZeKFRtItKIZthIAtGODTeDtRNIWASIKJeAISIXSDthhDZWGZeDWtheIDrZIXDWODIUZRretheXIreZGRrDtDZeIZXtGAeZNDZeShItXGRCIWWGtOet

通觀上面的文字,我們可以發現很多類似he、re、re、ter 這樣的很像是英語的拼寫,通過這些碎片信息,我們可以斷定P → r 的對應關係應該是正確的。

接下來我們來看密文的末尾,末尾出現的單詞Oet 到底是bet、get、let、set、... 這些組合中的哪一種呢?我們先假設它是最常見的單詞get(O → g)。

下面我們逐一列出所找到的組合以及假設的對應關係。

thethDWg 這個組合,有可能是the thing(D → i,W → n)。

grINe 這個組合,翻一下字典可以找到很多可能的單詞,如grace、grade、grape、grate、grave、gripe、grofe、...,這可有點為難。我們先假設I → a,然後我們可以找到greater 這樣的組合, 因此I → a 應該是正確的。但如果假設N → c, 則會出現tricening 這樣的組合,這個單詞怎麼看也不像是英語,看來N → c 是錯誤的。

英語中出現頻率較高的字母中,只有o 還沒有出現在我們的假設中。相對地,密文中出現頻率較高的字母中,還沒有找到對應關係的有G 和Z。我們先假設G → o。

使用上面所有的假設重新替換一下密文。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

噢噢,這回在末尾出現了Cannotget 這樣的組合,那麼C → c 應該是沒錯了。既然C → c,那麼剛才我們的假設N → c 就是錯誤的了。

Shich 這個組合,大概是which 吧(S → w)。

除了高頻字母以外,密文中的低頻字母Q 也可以找到一些相關的組合。

例如thethingtoQRench 這個組合,應該是the thing to QRench。查字典發現有quench 這樣一個單詞(Q → q,R → u)。quench 是“解渴”的意思,大概文章講的是關於喝水的話題吧。

接下來會發現hotZuUUer 這個組合,大概是hot summer 吧(Z → s,U → m)。U 連續出現了兩次,這是一個關鍵性的線索,而且和“解渴”的上下文也比較符合。

successagainanAagain 很明顯應該是success again and again(A → d)。

triedaLter 應該是tried after(L → f)。

whatXoucannotget 應該是what you cannot get(X → y)。

thefoVandthegraNesonehotsummersday 應該是the fox and the grapes one hot summers day(V → x,N → p)。

用上面的假設重新替換密文後,我們發現小寫字母的比例大幅增加,這說明我們已經基本上完成了破譯工作。

thefoxandthegrapesonehotsummersdayafoxwasstroKKingthroughanorchardtiKKhecametoaFunchofgrapesHustripeningonaTinewhichhadFeentrainedoTeraKoftyFranchHustthethingtoquenchmythirstquothhedrawingFacJafewpaceshetooJarunandaHumpandHustmissedtheFunchturningroundagainwithaonetwothreeheHumpedupFutwithnogreatersuccessagainandagainhetriedafterthetemptingmorseKFutatKasthadtogiTeitupandwaKJedawaywithhisnoseintheairsayingiamsuretheyaresouritiseasytodespisewhatyoucannotget

接下來我們再列舉一些線索。

foxwasstroKKing

fox was strolling

(K → l)

hetooJarunandaHumpandHustmissed

he took a run and a jump and just missed

(H → j)

(J → k)

hejumpedupFutwithnogreatersuccess

he jumped up but with no greater success

(F → b)

butatlasthadtogiTeitup

but at last had to give it up

(T → v)

沒有使用到的最後一個字母

(B → z)

這樣我們就全部破譯出來了!密鑰(替換表)如下。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

明文如下。

thefoxandthegrapesonehotsummersdayafoxwasstrollingthroughanorchardtillhecametoabunchofgrapesjustripeningonavinewhichhadbeentrainedoveraloftybranchjustthethingtoquenchmythirstquothhedrawingbackafewpaceshetookarunandajumpandjustmissedthebunchturningroundagainwithaonetwothreehejumpedupbutwithnogreatersuccessagainandagainhetriedafterthetemptingmorselbutatlasthadtogiveitupandwalkedawaywithhisnoseintheairsayingiamsuretheyaresouritiseasytodespisewhatyoucannotget

補上空格和標點符號之後,文章就變得非常易讀了。

"The Fox and the Grapes"

One hot summer's day, a Fox was strolling through an orchard till he came to a bunch of grapes just ripening on a vine which had been trained over a lofty branch. "Just the thing to quench my thirst," quoth he. Drawing back a few paces, he took a run and a jump, and just missed the bunch. Turning round again with a one, two, three, he jumped up, but with no greater success. Again and again he tried after the tempting morsel, but at last had to give it up,and walked away with his nose in the air, saying: "I am sure they are sour."

It is easy to despise what you cannot get.

原來這段文章就是《伊索寓言》中《狐狸和葡萄》的故事。

通過上面的破解過程,我們可以總結出下列結論。

● 除了高頻字母以外,低頻字母也能夠成為線索

● 搞清開頭和結尾能夠成為線索,搞清單詞之間的分隔也能夠成為線索

● 密文越長越容易破譯

● 同一個字母連續出現能夠成為線索(這是因為在簡單替換密碼中,某個字母在替換表中所對應的另一個字母是固定的)

● 破譯的速度會越來越快。

我們僅僅嘗試了一次破譯,就獲得了這麼多的知識,可想而知如果是專業破譯者,他們的知識和經驗一定是相當豐富的。

實際嘗試一次就可以看出,用頻率分析來破譯簡單替換密碼對於新手來說也並不是很困難。

從公元前開始,簡單替換密碼在幾百年的時間裡一直被用於秘密通信。然而在阿拉伯學者發明頻率分析法之後,這種密碼很容易就被破譯了。

在本文開頭,我們引用了愛倫·坡的小說《金甲蟲》中出現的一段密文,這也是一種簡單替換密碼。小說中還描寫了使用頻率分析進行破譯的情景。

小測驗2 簡單替換密碼的“改良”

在上面的例子中,我們發現存在如c → C,q → Q 這樣,明文中的字母被替換成了相同字母的密文的情況。於是Alice 就想:如果替換表中不出現這種被替換為相同字母的情況,那麼密文應該會更難被破譯吧?請問Alice 的想法正確嗎?答案見文末。

Enigma

下面我們來講解一下第二次世界大戰中德國使用的一種名為“Enigma”的密碼機。

一、什麼是Enigma

Enigma 是由德國人阿瑟·謝爾比烏斯(Arthur Sherbius)於20 世紀初發明的一種能夠進行加密和解密操作的機器。Enigma 這個名字在德語裡是“謎”的意思。謝爾比烏斯使用能夠轉動的圓盤和電路,創造出了人類手工所無法實現的高強度密碼。在剛剛發明之際,Enigma被用在了商業領域,後來到了納粹時期,德國國防軍採用了Enigma,並將其改良後用于軍事用途。

二、用Enigma 進行加密通信

Enigma 是一種由鍵盤、齒輪、電池和燈泡所組成的機器,通過這一臺機器就可以完成加密和解密兩種操作。

發送者和接收者各自擁有一臺Enigma。發送者用Enigma 將明文加密,將生成的密文通過無線電發送給接收者。接收者將接收到的密文用自己的Enigma 解密,從而得到明文。

由於發送者和接收者必須使用相同的密鑰才能夠完成加密通信,因此發送者和接收者會事先收到一份叫作國防軍密碼本的冊子。國防軍密碼本中記載了發送者和接收者所使用的每日密碼,發送者和接收者需要分別按照冊子的指示來設置Enigma。用Enigma 進行加密通信的過程如圖5 所示。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

圖5 用Enigma 進行加密通信的流程

三、Enigma 的構造

Enigma 的構造如圖6 所示。Enigma 能夠對字母表中的26 個字母進行加密和解密操作,但由於圖示覆雜,這裡將字母的數量簡化為4 個。

按下輸入鍵盤上的一個鍵後,電信號就會通過複雜的電路,最終點亮輸出用的燈泡。圖6中描繪了按下a 鍵點亮D 燈泡的情形。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

圖6 Enigma 的構造(只有4 個字母的情況)

每當按下Enigma 上的一個鍵,就會點亮一個燈泡。操作Enigma 的人可以在按鍵的同時讀出燈泡所對應的字母,然後將這個字母寫在紙上。這個操作在發送者一側是加密,在接收者一側則是解密。只要將鍵和燈泡的讀法互換一下,在Enigma 上就可以用完全相同的方法來完成加密和解密兩種操作了。大家在圖6 中沿著粗線反向走一遍就可以理解這個原理了。

接線板( plugboard)是一種通過改變接線方式來改變字母對應關係的部件。接線板上的接線方式是根據國防軍密碼本的每日密碼來決定的,在一天之中不會改變。

在電路中,我們還看到有3 個稱為 轉子( rotor)的部件。轉子是一個圓盤狀的裝置,其兩側的接觸點之間通過電線相連。儘管每個轉子內部的接線方式是無法改變的,但轉子可以在每輸入一個字母時自動旋轉。當輸入一個字母時,轉子1 就旋轉1/4 圈(當字母表中只有4 個字母時)。轉子1 每旋轉1 圈,轉子2 就旋轉1/4 圈,而轉子2 每旋轉1 圈,轉子3 就旋轉1/4圈。這3 個轉子都是可以拆卸的,在對Enigma 進行設置時可以選擇轉子的順序以及它們的初始位置。

圖7 顯示了一個轉子的放大示意圖。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

圖7 轉子

這些裝置組合起來使得Enigma 看起來很像是一個能夠動態變化的“鬼腳圖”。

鬼腳圖(ghost leg),日本稱“阿彌陀籤”,是一種基於數學原理的簡易決策遊戲,其基本原理是將一 個序列映射到元素相同但順序不同的另一個序列,具體請參見維基百科。

四、Enigma 的加密

下面我們來詳細講解一下Enigma 的加密步驟。圖8 展示了發送者將一個包含5 個字母的德語單詞nacht(夜晚)進行加密併發送的過程。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

圖8 用Enigma 加密nacht

在進行通信之前,發送者和接收者雙方都需要持有國防軍密碼本,國防軍密碼本中記載了發送者和接收者需要使用的每日密碼。

(1) 設置Enigma

發送者查閱國防軍密碼本,找到當天的 每日密碼 ,並按照該密碼來設置Enigma。具體來說,就是在接線板上接線,並將3 個轉子進行排列。

(2) 加密通信密碼

接下來,發送者需要想出3 個字母,並將其加密。這3 個字母稱為 通信密碼 。

通信密碼的加密也是通過Enigma 完成的。假設發送者選擇的通信密碼為psv,則發送者需要在Enigma 的鍵盤上輸入兩次該通信密碼,也就是說需要輸入psvpsv 這6 個字母。

發送者每輸入一個字母,轉子就會旋轉,同時燈泡亮起,發送者記下亮起的燈泡所對應的字母。輸入全部6 個字母之後,發送者就記下了它們所對應的密文,在這裡我們假設密文是ATCDVT(密文用大寫字母來表示)。

(3) 重新設置Enigma

接下來,發送者根據通信密碼重新設置Enigma。

通信密碼中的3 個字母實際上代表了3 個轉子的初始位置。每一個轉子的上面都印有字母,可以根據字母來設置轉子的初始位置。通信密碼psv 就表示需要將轉子1、2、3 分別轉到p、s、v 所對應的位置。

(4) 加密消息

接下來,發送者對消息進行加密。

發送者將消息(明文)逐字從鍵盤輸入,然後從燈泡中讀取所對應的字母並記錄下來。這裡是輸入nacht5 個字母,並記錄下所對應的5 個字母(如KXNWP)。

(5) 拼接

接下來,發送者將“加密後的通信密碼”ATCDVT 與“加密後的消息”KXNWP 進行拼接,將ATCDVTKXNWP 作為電文通過無線電發送出去。

上面就是用Enigma 進行加密的操作步驟,看來還真是挺麻煩的。

五、每日密碼與通信密碼

大家應該注意到了,在Enigma 中出現了“每日密碼”和“通信密碼”這兩種不同的密鑰。

每日密碼不是用來加密消息的,而是用來加密通信密碼的。也就是說,每日密碼是一種用來加密密鑰的密鑰。這樣的密鑰,一般稱為密鑰加密密鑰( Key Encrypting Key,KEK)。KEK在現代依然很常用。

之所以要採用兩重加密,即用通信密碼來加密消息,用每日密碼來加密通信密碼,是因為用同一個密鑰所加密的密文越多,破譯的線索也會越多,被破譯的危險性也會相應增加。

六、避免通信錯誤

在通信密碼的加密中,我們需要將通信密碼psv 連續輸入兩次,即psvpsv。這是因為在使用Enigma 的時代,無線電的質量很差,可能會發生通信錯誤。如果通信密碼沒有被正確傳送,接收者也就無法解密通信內容。而通過連續輸入兩次通信密碼(psvpsv),接收者就可以對通信密碼進行校驗,也就是檢查一下解密後得到的通信密碼是不是3 個字母重複兩次這樣的形式。

七、Enigma 的解密

下面我們來看看Enigma 是如何解密的(圖9)。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

圖9 用Enigma 解密

解密的操作步驟如下。

(1) 分解

接收者將接收到的電文分解成兩個部分,即開頭的6 個字母ATCDVT 和剩下的字母KXNWP。

(2) 設置Enigma

接收者查閱國防軍密碼本中的每日密碼,並按照該密碼設置Enigma,這一步和發送者進行的操作是相同的。

(3) 解密通信密碼

接下來,接收者將加密後的通信密碼ATCDVT 進行解密。接收者在Enigma 的鍵盤上輸入ATCDVT 這6 個字母,然後將亮起的燈泡對應的字母psvpsv 記下來。因為psvpsv 是psv 重複兩次的形式,所以接收者可以判斷在通信過程中沒有發生錯誤。

(4) 重新設置Enigma

接下來,接收者根據通信密碼psv 重新設置Enigma。

(5) 解密消息

接下來,接收者對消息進行解密。

接收者將電文的剩餘部分KXNWP 逐一用鍵盤輸入,然後從燈泡讀取結果並記下來,這樣接收者就得到了nacht 這5 個字母,也就是完成了對發送者發送的消息進行解密的過程。

上面就是解密的操作步驟。

八、Enigma 的弱點

上文中我們講解了Enigma 的構造以及加密和解密的過程。通過這些信息,我們應該已經可以找到Enigma 的一些弱點了。

Enigma 可以在每次輸入時,通過3 個轉子的旋轉來改變電路。然而,在加密通信密碼這一重要步驟(最開始的6 次輸入)中,實際上只有轉子1 會旋轉,這就是Enigma 的弱點之一。

將通信密碼連續輸入兩次並加密也是一個弱點,因為密碼破譯者可以知道,密文開頭的6個字母被解密之後的明文一定是3 個字母重複兩次的形式。

通信密碼是人為選定的也是一個弱點,因為通信密碼必須不能被密碼破譯者推測出來。然而現實中的發送者卻有可能使用aaa、bbb 這樣簡單的密碼,也經常有人用自己女朋友的名字當作密碼,不知道是因為怕麻煩,還是因為過於相信Enigma 的安全性,或者是沒有充分理解通信密碼的重要性。密碼系統中使用的密鑰不能是人為選定的,而應該使用無法預測的隨機數來生成。

必須派發國防軍密碼本也可以說是一個弱點。如果沒有國防軍密碼本,就無法使用Enigma進行通信,但如果國防軍密碼本落到敵人手裡,就會帶來大麻煩。如果現在所使用的國防軍密碼本被敵人得到,哪怕只洩露了一本,也必須重新制作新的密碼本併發放到全軍。“必須配送密鑰”這個問題,在廣泛使用計算機進行的現代密碼通信中也是非常重要的。

九、Enigma 的破譯

當時,Enigma 被認為是一種無法破譯的密碼機,為了破譯Enigma,歐洲各國的密碼破譯者們付出了巨大的努力。

首先,法國和英國的密碼破譯者通過間諜活動得到了德軍使用的Enigma 的構造。然而,即便知道了Enigma 的構造,也還是無法破解Enigma 的密碼,這是因為 Enigma 的設計並不依賴於“隱蔽式安全性”( security by obscurity)。即使密碼破譯者得到了Enigma密碼機(相當於密碼算法),只要不知道Enigma 的設置(相當於密鑰),就無法破譯密碼。

為Enigma 破譯打開新局面的是波蘭的密碼破譯專家雷耶夫斯基(Marian Rejewski)。雷耶夫斯基得到了法國提供的信息支援,並在此基礎上提出了通過密文找到每日密碼的方法。

由於每日密碼在一天之中是不會改變的,因此密碼破譯者一天內所截獲的所有通信,都是用同一個密碼進行加密的。而且,這些密文都有一個共同的特點,那就是通信密碼都會重複兩次。以ATCDVT 為例,我們可以知道第1 個字母和第4 個字母(A 和D),第2 個字母和第5 個字母(T 和V),第3 個字母和第6 個字母(C 和T)都是由相同的明文字母加密得到的。此外,我們還知道,在第1 個字母和第4 個字母的加密過程中,轉子1 旋轉了3/26 圈。通過上述事實以及大量的密文,雷耶夫斯基對密文字母的排列組合進行了深入的研究。

3 個轉子的順序共有3×2×1=6 種可能,3 個轉子的旋轉位置共有26×26×26=17576 種組合。雷耶夫斯基製作了6 臺機器,分別對這17576 種組合進行檢查。通過使用這些機器,他在大約兩小時內通過大量的密文找到了每日密碼。

由於擔心希特勒進攻波蘭導致Enigma 破譯的線索付之一炬,波蘭決定將這些情報提供給英國和法國。於是,Enigma 破譯的接力棒,就從波蘭傳給了英法。此後不久,第二次世界大戰就全面爆發了。

英國的密碼專家們在布萊切利園集中進行了Enigma 的破譯工作,其中,現代計算機之父阿蘭·圖靈(Alan Turing)也是破譯團隊的一員。圖靈根據之前所獲得的情報繼續研究,終於在1940 年研製出了用於破譯Enigma 的機器。Enigma 這一機器創造出了難以破譯的密碼,但最終戰勝Enigma 的卻是另一臺機器。

Enigma 的破譯過程十分冗長和複雜,在這裡無法詳細介紹。對此感興趣的讀者請參閱《密碼故事:人類智力的另類較量》(The Code Book: The Science of Secrecy from Ancient Egypt to Quantum Cryptography)[Singh] 以及《艾倫·圖靈傳: 如謎的解謎者》(Alan Turing: The Enigma)[Hodges]。

小測驗3 沒有L 的密文

第二次世界大戰中,英軍的密碼破譯者截獲了一段Enigma 的密文,他們發現在密文中字母L 一次都沒有出現。據說密碼破譯者根據沒有L 這一事實推測出了明文,那麼明文到底是什麼呢?

(本小測驗是根據Rudolf Kippenhahn 所著的Code Breaking: A History and Exploration 一書中的記載改編而來的)答案見文末。

思考

為什麼要將密碼算法和密鑰分開呢

我們在介紹密碼系統時,經常會說“密碼算法是○○,密鑰是△△”,也就是說,我們有意識地對密碼算法和密鑰進行了區分。下面我們來思考一下,將密碼算法和密鑰分開到底有什麼意義呢?

我們來列舉一下本文介紹過的密碼系統的“密碼算法”和“密鑰”。

愷撒密碼

密碼算法:將明文中的各個字母按照指定的字母數平移

密鑰:平移的字母數量

簡單替換密碼

密碼算法:按照替換表對字母表進行替換

密鑰:替換表

Enigma(通信密碼的加密)

密碼算法: 使用 Enigma 密碼機,通過接線板的接線方式、3 個轉子的順序、每個轉子的旋轉位置對字母進行替換

密鑰(每日密碼):接線板的接線方式、3 個轉子的順序、每個轉子的旋轉位置

Enigma(通信電文的加密)

密碼算法: 使用接線板的接線方式和 3 個轉子的順序固定的 Enigma 密碼機,按照每個轉子 的旋轉位置對字母進行替換

密鑰(通信密碼):每個轉子的旋轉位置

——

仔細研究一下每一對密碼算法和密鑰的組合就會發現,在密碼算法中必然存在可變部分,而這些可變部分就相當於密鑰。當密碼算法和密鑰都確定時,加密的方法也就確定了。

如果每次加密都必須產生一個新的密碼算法,那真是太詭異了。對於已經開發出的一種密碼算法,我們總是希望能夠重複使用。

將密碼算法和密鑰分開的意義正在於此。密碼算法是需要重複使用的,但在重複使用同一種算法的過程中,該算法被破譯的可能性也在逐漸增大。因此,我們就在密碼算法中準備了一些可變部分,並在每次通信時都對這部分內容進行改變,而這一可變部分就是密鑰。

將密碼算法和密鑰分開考慮 ,就解決了希望重複使用,但重複使用會增加風險這個難題。

本文中,我們介紹了歷史上一些有名的密碼技術。雖然這些密碼技術現在都已經不再使用了,但是希望重複使用,但重複使用會增加風險這個難題卻依然存在。

現在的密碼算法中都有一部分標準化的技術。你也許會想,密碼這種需要機密性的領域怎麼可能會標準化呢?其實這並不奇怪,請大家回想一下我們之前講過的那條常識——不要使用保密的密碼算法。標準化的推進,使得密碼算法能夠作為公有財產被開發、研究和利用。即便經過標準化,密文的機密性也絲毫沒有降低,這是因為密碼算法和密鑰是分開的。

密鑰才是秘密的精華。因此,在密碼技術中,如何管理密鑰是一個重要的課題。

每個人都可以擁有相同品牌的鎖,但每個人都有不同的鑰匙。鎖的設計是公開的——鎖匠都有帶有詳細圖的書,而且絕大多數好的設計方案都在公開專利中進行了描述——但是鑰匙是秘密的。

——布魯斯·施奈爾:《網絡信息安全的真相》(Schneier, 2000,p.117)

本文節選自史上最好懂的密碼學——《圖解密碼技術(第3版)》。

服了!酷到讓人望而生畏密碼學,能解釋得如此簡單!圖解密碼技術

圖解密碼技術(第3版)

  • 史上最好懂密碼學,豆瓣評分9.5
  • 日本數學協會出版獎得主、《程序員的數學》《數學女孩》作者結城浩重磅力作

本書以圖配文的形式,詳細講解了6種非常重要的密碼技術:對稱密碼、公鑰密碼、單向散列函數、消息認證碼、數字簽名和偽隨機數生成器。

第1部分講述了密碼技術的歷史沿革、對稱密碼、分組密碼模式(包括ECB、CBC、CFB、OFB、CTR)、公鑰、混合密碼系統。第2部分重點介紹了認證方面的內容,涉及單向散列函數、消息認證碼、數字簽名、證書等。第3部分講述了密鑰、隨機數、PGP、SSL/TLS以及密碼技術在現實生活中的應用。

小測驗的答案

小測驗 1 的答案:愷撒密碼的破譯

可以用暴力破解法來破譯,從密鑰 0 到 25 逐一進行嘗試。

PELCGBTENCUL → 用密鑰 0 解密 → pelcgbtencul

PELCGBTENCUL → 用密鑰 1 解密 → odkbfasdmbtk

PELCGBTENCUL → 用密鑰 2 解密 → ncjaezrclasj

PELCGBTENCUL → 用密鑰 3 解密 → mbizdyqbkzri

PELCGBTENCUL → 用密鑰 4 解密 → lahycxpajyqh

PELCGBTENCUL → 用密鑰 5 解密 → kzgxbwozixpg

PELCGBTENCUL → 用密鑰 6 解密 → jyfwavnyhwof

PELCGBTENCUL → 用密鑰 7 解密 → ixevzumxgvne

PELCGBTENCUL → 用密鑰 8 解密 → hwduytlwfumd

PELCGBTENCUL → 用密鑰 9 解密 → gvctxskvetlc

PELCGBTENCUL → 用密鑰 10 解密 → fubswrjudskb

PELCGBTENCUL → 用密鑰 11 解密 → etarvqitcrja

PELCGBTENCUL → 用密鑰 12 解密 → dszquphsbqiz

PELCGBTENCUL → 用密鑰 13 解密 → cryptography

PELCGBTENCUL → 用密鑰 14 解密 → bqxosnfqzogx

PELCGBTENCUL → 用密鑰 15 解密 → apwnrmepynfw

PELCGBTENCUL → 用密鑰 16 解密 → zovmqldoxmev

PELCGBTENCUL → 用密鑰 17 解密 → ynulpkcnwldu

PELCGBTENCUL → 用密鑰 18 解密 → xmtkojbmvkct

PELCGBTENCUL → 用密鑰 19 解密 → wlsjnialujbs

PELCGBTENCUL → 用密鑰 20 解密 → vkrimhzktiar

PELCGBTENCUL → 用密鑰 21 解密 → ujqhlgyjshzq

PELCGBTENCUL → 用密鑰 22 解密 → tipgkfxirgyp

PELCGBTENCUL → 用密鑰 23 解密 → shofjewhqfxo

PELCGBTENCUL → 用密鑰 24 解密 → rgneidvgpewn

PELCGBTENCUL → 用密鑰 25 解密 → qfmdhcufodvm

密鑰為 13,明文(加密前的消息)如下:

cryptography

也就是“密碼”這個詞。

小測驗 2 的答案:簡單替換密碼的“改良”

不正確。相反,Alice 的“改良”讓密碼變得更容易破譯了。

密碼破譯者需要推測密文中的某個字母(如 A)應該解密為哪個字母。這時,如果沒有Alice 的“改良”,其可能性應該有 26 種。然而,經過 Alice 的“改良”後,由於 A 是不可能對 應 a 的,因此破譯者從一開始就可以將 a 排除掉,而只要考慮剩下的 25 種可能性就可以了。 這等於是給了破譯者一條用於破譯的線索。

像這個例子一樣,對密碼進行“少許改良”,很可能反而會讓安全性變得更差。

小測驗 3 的答案:沒有 L 的密文

明文是一段只有字母 l 的文字,即 llllll……。發送者的目的是將毫無意義的明文加密發送以干擾密碼破譯者。

然而密碼破譯者知道 Enigma 的構造,即無論接線板如何接線,3 個轉子的順序和每個轉子的旋轉位置如何改變,輸入的字母都絕對不可能被替換成該字母本身。通過密文中沒有 L 這一 事實,密碼破譯者就能夠推測出其明文可能是一串 l。

此外,密碼破譯者還能夠根據密文的排列組合繼續進行破譯,從而得到推測 Enigma 的接線板和轉子狀態的線索。

發送者本想幹擾密碼破譯者,卻反而為破譯者提供了線索。順便提一下,破解這一謎題的破譯者名叫 Mavis Lever,是一位女性。


分享到:


相關文章: