官术网_书友最值得收藏!

1.4 非對稱加密:兩個密鑰優(yōu)于一個密鑰

在前面關于對稱加密的討論中,我們曾提到:Alice和Bob在安全傳遞信件前需要見面,以確定他們將要使用的對稱加密密鑰。這是一個合理的要求,許多協(xié)議實際上都有這樣的前提要求。然而,這樣的要求在有許多參與者的協(xié)議中很快變得不那么實用:在安全連接到谷歌、Facebook、亞馬遜和其他數(shù)十億網(wǎng)站之前,網(wǎng)絡瀏覽器是否也要滿足這樣的要求(即在連接前,瀏覽器之間要相互確定使用的對稱加密密鑰)?

這也稱為密鑰分發(fā)問題,在相當長的一段時間內該問題都未被解決,直到20世紀70年代末密碼學家發(fā)現(xiàn)了另一類稱為非對稱密碼(Asymmetric Cryptography)或公鑰密碼(Public Key Cryptography)的算法,密鑰分發(fā)問題才得以解決。在非對稱密碼中,不同的函數(shù)(ENCRYPT和DECRYPT)使用不同的密鑰(對稱密碼僅使用單個密鑰)。為了說明公鑰密碼如何幫助人們建立信任,我將在本節(jié)介紹一些非對稱密碼原語。注意,這些原語只是本書內容的概覽,在后續(xù)章節(jié)中我們會更詳細地討論這些密碼原語。

1.4.1 密鑰交換

我們學習的第一個非對稱密碼原語是密鑰交換(Secret Key Exchange)。DH密鑰交換算法是密碼學家提出的第一個公鑰密碼算法,該算法以其提出者(Diffie和Hellman)的名字的首字母命名。DH密鑰交換算法的主要目的是為通信雙方生成一個共享的秘密。這個雙方共享的秘密可以用于不同的目的,例如作為對稱加密原語的密鑰。

在第5章中,我將詳細解釋DH密鑰交換的工作原理。在本小節(jié)我們使用一個簡單的類比來解釋密鑰交換。與大多數(shù)密碼算法一樣,在密鑰交換算法執(zhí)行前,參與者也必須獲得一組公共參數(shù)。在類比說明中,我們用正方形■表示Alice和Bob協(xié)商好的公共參數(shù)(公共形狀)。接下來,他們各自找到一個秘密地點,并隨機選擇一個形狀。假設Alice選擇的形狀是三角形▲,而Bob選擇的是星形★,同時他們會不惜一切代價地保密自己所選的形狀。這些隨機選擇的形狀就是他們各自的私鑰(Private Key),如圖1.7所示。

圖1.7 在DH密鑰協(xié)商的第一步,雙方生成私鑰。在類比說明中,Alice的私鑰是三角形,Bob的私鑰是星形

當Alice和Bob選擇完私鑰后,他們就各自將他們隨機選擇的形狀與他們起初協(xié)商的公共形狀(正方形)結合起來。這些組合會產生唯一的新形狀,每個新形狀表示一個公鑰(Public Key)。公鑰屬于公開信息,因此Alice和Bob可以相互交換他們的公鑰。該過程說明如圖1.8所示。

現(xiàn)在我們來思考這個算法為什么屬于公鑰密碼算法。這是因為此類密碼算法的密鑰由一個公鑰和一個私鑰組成。DH密鑰交換算法的最后一步相當簡單,即Alice和Bob分別將對方的公鑰和自己的私鑰結合在一起。最終,雙方得到完全相同的結果(形狀)。在所給的類比示例中,由正方形、星形和三角形組合在一起產生的形狀如圖1.9所示。

圖1.8 在DH密鑰協(xié)商的第二步,雙方交換公鑰。雙方通過將公共形狀和私鑰結合在一起來生成公鑰

圖1.9 在DH密鑰協(xié)商的最后一步:雙方生成共享密鑰。為了生成這個密鑰,雙方都將對方的公鑰和自己的私鑰結合在一起,而且僅僅通過兩個公鑰無法生成共享密鑰

之后,協(xié)議的參與者可以使用這個共享密鑰。本書也包含許多共享密鑰使用場景的例子。例如,Alice和Bob可以將共享密鑰當作對稱加密算法的密鑰,進而使用這個對稱加密原語去加密消息。DH密鑰交換的整個過程概括如下:

(1)Alice和Bob交換掩蓋了他們各自私鑰的公鑰;

(2)雙方均使用對方的公鑰和己方的私鑰計算出共享密鑰;

(3)敵手通過觀察公鑰不能獲得私鑰的任何信息,更不能計算出共享密鑰。

注意:

在所給示例中,敵手很容易繞過最后一個問題。因為在不知道私鑰的情況下,我們可以將公鑰結合在一起生成共享密鑰。幸運的是,這只是類比示例本身的局限性,而且并不影響我們理解密鑰交換的內部原理。

實際上,DH密鑰交換是非常不安全的。你能花上幾秒找出其不安全的原因嗎?

這是因為Alice接收任何來自Bob的公鑰,所以我可以攔截Bob發(fā)向Alice的公鑰,并用我的公鑰替換掉Bob的公鑰,這樣我就可以冒充Bob(反之,我也可以向Bob冒充Alice)。這樣的中間人(Man-in-the-Middle,MITM)攻擊者方法可以成功地攻擊該密鑰交換協(xié)議。那么如何修復協(xié)議的這個漏洞呢?在第2章我們會看到,修復該協(xié)議有兩種方法,即用另一個加密原語增強這個密鑰交換協(xié)議,或者提前知道Bob的公鑰。但這不就意味著我們又回到了原點,即如何在協(xié)議開始之前確定雙方公鑰?

先前我們提到,Alice和Bob需要知道一個共同的密鑰;現(xiàn)在,我們又要求,Alice和Bob需要事先知道彼此的公鑰。雙方如何才能知道對方的公鑰呢?這不就是一個先有雞還是先有蛋的問題嗎?是的,的確如此。正如我們將看到的一樣,在實踐中,公鑰密碼并不能解決信任問題,它只是簡化了信任的建立難度(特別是參與者數(shù)量有很多時)。

現(xiàn)在,讓我們用圖 1.10 來匯總目前學到的內容。我們停止討論該話題,轉而繼續(xù)學習1.4.2小節(jié)內容。在第5章中,我們會了解更多關于密鑰交換的內容。

圖1.10 到目前為止,我們學到的密碼算法分屬兩大類,即對稱密碼(包含對稱加密)和 非對稱密碼(包含密鑰交換)

1.4.2 非對稱加密

在DH密鑰交換算法提出后不久,密碼學家Ron Rivest、Adi Shamir和Leonard Adleman又提出了一個新的密碼算法,該算法也以他們的名字命名,稱為RSA算法。RSA算法包含兩類不同的密碼學原語:公鑰加密(或非對稱加密)算法和(數(shù)字)簽名算法。這兩個密碼算法屬于非對稱密碼中兩類不同的密碼學原語。在本小節(jié)中,我們將解釋這些原語的功能以及它們在密碼協(xié)議里發(fā)揮的作用。對于非對稱加密,其功能與我們前面討論的對稱加密算法類似:它通過加密消息來保證機密性。不過,對稱加密中兩個參與方使用相同的密鑰加密和解密消息,但在非對稱加密中加密和解密消息的方式則完全不同:

非對稱加密有兩個密鑰,分別稱為公鑰和私鑰;

任何人都可以使用公鑰加密消息,但是只有私鑰擁有者才可以解密消息。

現(xiàn)在,我們用另外一個簡單的類比示例來解釋非對稱加密的使用方法。我們再次從我們的老朋友Alice談起,假設她持有私鑰及其對應的公鑰。我們把她的公鑰想象成一個打開的盒子,它向公眾敞開,任何人均可使用它,如圖1.11所示。

圖1.11 為了使用非對稱加密,Alice首先公開她的公鑰(這里用打開的盒子來表示)。任何人都可以使用這個公鑰加密向她發(fā)送的消息。Alice可以使用私鑰解密收到的加密消息

任何人都可以使用Alice的公鑰加密發(fā)向她的消息。在類比說明中,我們將加密消息想象成把消息放到打開的盒子里并關上它。一旦盒子關上,除了Alice,任何人都沒法打開放有消息的盒子。這個盒子有效地保證了消息的機密性,避免第三方獲得消息本身。Alice收到關閉的盒子(加密的消息)后,她可以用只有自己知道的私鑰打開盒子(解密消息),獲得消息,如圖1.12所示。

圖1.12 非對稱加密:(1)任何人都可以用Alice的公鑰加密發(fā)給她的消息;(2)接收到加密的消息后; (3)她可以用對應的私鑰解密,獲得消息本身,第三方?jīng)]法直接觀察到發(fā)給Alice的消息

我們用圖 1.13 總結了到目前為止學到的密碼學原語。距離實用密碼學之旅結束,我們需要學習的密碼學原語只差一個!

圖1.13 到目前為止,我們學到的密碼算法分屬兩大類,即對稱密碼(包含對稱加密)和 非對稱密碼(包含密鑰交換和非對稱加密)

1.4.3 數(shù)字簽名:與手寫簽名作用一樣

在1.4.2小節(jié),我們了解了由RSA算法衍生出的非對稱加密算法。同時提到,RSA算法還能實現(xiàn)數(shù)字簽名。數(shù)字簽名原語能夠有效地幫助Alice和Bob建立起信任,它的作用與手寫簽名十分類似。例如,當租賃公寓時,我們需要在租住合同上簽字。

我們可能會產生這樣的疑問:如果他們偽造我的簽名怎么辦?確實,手寫簽名在現(xiàn)實世界中并不能提供足夠的安全性。密碼上的簽名也可能偽造,但是密碼簽名還會提供一個帶有簽名者姓名的密碼證書。這能保證密碼簽名不可偽造,進而讓別人很容易驗證簽名。與在支票上寫的古老簽名相比,密碼簽名更加有用!

在圖1.14中,我們想象這樣一個場景:Alice想向David證明她信任Bob。這是一個在多方環(huán)境中建立信任以及非對稱密碼技術使用場景的典型例子。Alice通過在一張寫有“Alice信任Bob”的紙上簽名來表明立場,并告訴David:Bob是可以信任的。如果David信任Alice和她的簽名算法,那么他也可以選擇信任Bob。

具體來說,就是Alice用她的RSA簽名算法以及私鑰對消息“Alice信任Bob”簽名。這會產生一個類似隨機噪聲的簽名,如圖1.15所示。

圖1.14 David信任Alice。如果Alice信任Bob,那么David也可以信任Bob嗎

圖1.15 Alice用她的私鑰生成消息的簽名

任何人都可以通過以下信息驗證這個簽名:

(1)Alice公鑰;

(2)待簽消息;

(3)消息的簽名。

驗證結果只能是真(簽名有效)或者假(簽名無效),如圖1.16所示。

圖1.16 為了驗證Alice的簽名,驗證者還需要待簽消息本身和Alice的公鑰。驗證結果只能是簽名有效或者無效

到現(xiàn)在為止,我們已經(jīng)學了3個不同的非對稱密碼原語:

(1)DH密鑰交換;

(2)非對稱加密;

(3)RSA數(shù)字簽名。

這是3個非常著名且應用廣泛的非對稱密碼算法。這些算法對于解決現(xiàn)實世界的安全問題所發(fā)揮的作用可能不會十分明顯,但是這些算法確實每時每刻都在保護著我們所觸及的各類應用。現(xiàn)在,讓我們還用圖來總結到目前為止我們學到的所有密碼算法,如圖1.17所示。

圖1.17 到目前為止,我們學過的對稱密碼算法和非對稱密碼算法

主站蜘蛛池模板: 赤水市| 奉贤区| 磐石市| 法库县| 荔波县| 榆林市| 巴彦淖尔市| 泽库县| 当雄县| 勐海县| 思南县| 五指山市| 于田县| 大关县| 惠水县| 大渡口区| 钟山县| 上高县| 双城市| 孝义市| 津南区| 关岭| 台江县| 北辰区| 天峨县| 瓦房店市| 通化县| 清原| 昌黎县| 武山县| 遂溪县| 张北县| 桂阳县| 永清县| 武定县| 砀山县| 嘉峪关市| 当阳市| 静安区| 富源县| 米林县|