通過Alice和Bob,輕鬆走進密碼學

pmcaff產品經理社區 發佈 2020-01-13T02:10:44+00:00

A 需要與某個聲稱自己是 B 的人進行網絡通信。於是,A向B發送了一段隨機的數據 X,B 用 密碼K 將數據 X 加密後得到 密文數據Y ,並將密文 Y 回傳給 A。

不懂技術的產品不是好業務,而加密算法等密碼學原理也是最基礎的知識之一,也是網際網路信息安全的基礎。甚至現在很火的區塊鏈,最基礎的部分也是基於密碼學的。

密碼學很難嗎?其實不然,認識了我們的女主角Alice和男一號Bob,我們就能輕鬆掌握密碼學基本原理!

1.初識Alice和Bob

首先我們來認識下,為我們講解密碼原理的兩位主角——女神「Alice」和型男「Bob」,他倆可以說是密碼學中最經典的角色,幾乎所有的密碼學著作、文章里都能看到他們的身影。

如果沒有Alice和Bob,在講解密碼協議原理的時候,大致會描述成這樣:

A 需要與某個聲稱自己是 B 的人進行網絡通信。為了確保通信安全,A 必須先驗證B的身份真實性(萬一聲稱自己是B的人,是個騙紙,其實他是壞人呢),於是A需要看看B是否知道他們之間約定的接頭「暗號」——也就是我們經常提到的通信密碼 K。那麼A該如何驗證K呢?於是,A向B發送了一段隨機的數據 X,B 用 密碼K 將數據 X 加密後得到 密文數據Y ,並將密文 Y 回傳給 A。A再使用密碼K對密文Y進行解密,驗證是否可以得到數據X。如果解密後可以得到正確的X,則B身份合法。反之,則B不合法。

那麼在引入Alice、Bob替代A、B之後,這段描述就變得立體生動起來。

Alice和Bob通過網絡通信,但實際上通信鏈路和環境往往是不安全的。他們的通信內容很可能會被竊聽。黑客通過進入一個路由器或聆聽一個Wi-Fi通信的無線電信號。這種未經授權的監聽被稱為竊聽。竊聽者英文叫Eavesdropper,我們暫時稱呼這個黑客竊聽者為Eve。Eve不僅會竊聽通信內容,還會攔截甚至是篡改Alice給Bob消息,以便從中謀利。

角色設定: 人名 | 角色 ---|--- Alice | 所有協議中的第一個參與者 Bob | 所有協議中的第二個參與者 Eve | 竊聽者

2.發送者、接收者和竊聽者

場景1: Alice向Bob發送電子郵件

在這個場景中,發出郵件的 Alice 稱為 發送者(sender),而收到郵件的 Bob 則稱為 接收者(receiver)。 在講解發送者、接收者的概念時,用郵件這個例子會比較便於理解,但實際上發送者和接收者這兩個術語的使用範圍並不僅僅局限於郵件。當某個人向另一個人發送信息時,發出 信息的人稱為發送者,而收到信息的人稱為接收者。另外,被發送的信息有時也統稱為消息(message)

場景2: Eve竊聽郵件

郵件是通過網際網路從Alice的計算機發送到Bob的計算機的。在發送郵件時,郵件會經過許多台計算機和通信設備進行中轉,在這個過程中,就存在被惡意竊聽者偷看到的可能性。

竊聽者 Eve並不一定是人類,有可能是安裝在通信設備上的某種竊聽器,也可能是安裝在郵件軟體和郵件伺服器上的某些程序。 儘管郵件內容原本應該只有發送者和接收者兩個人知道,但如果不採取相應的對策,就存在被第三方知道的風險。

場景3: 郵件做了加密,Eve無法獲取郵件明文

為了防止被竊聽,Alice運用密碼(cryptography)技術,對郵件做了加密,變成密文傳輸。Bob收到密文,根據約定的「接頭暗號」也就是解密密鑰,獲得郵件明文。而Eve不知道密鑰,所以無法解讀郵件內容。

3.密碼

上述場景中,引入幾個概念:

〔明文〕:消息本身。(簡體中文)

〔加密〕:用某種方法偽裝消息以隱藏真實內容的過程。(類似你把簡體中文轉成了甲骨文,看到了估計也懵逼了,哈哈)

〔密文〕:加了密的消息。(甲骨文)

〔解密〕:密文轉變為明文的過程。(甲骨文又變回了簡體中文)

明文用M表示,它可能是比特流(文本文件、位圖、數字化的語音流或數字化的視頻圖像)。但涉及計算機時,明文也可以用P表示,是指簡單的二進位數據。 明文可被傳送或存儲,無論在哪種情況,M指待加密的消息。

密文用C表示,它也是二進位數據。加密函數E作用於M得到密文C,用數學公式表示為:  E(M)=C. 相反地,解密函數D作用於C產生M    D(C)=M.

  先加密後再解密消息,原始的明文將恢復出來,下面的等式必須成立:

  D(E(M))=M

  因此,大名鼎鼎的「密碼」閃亮登場!密碼,即密碼算法, 也就是用於加密和解密的數學函數。(通常情況下,有兩個相關的函數:一個用作加密,另一個用作解密)

  如果算法的保密性是基於保持住算法本身的秘密,不被外部獲知算法本身,那麼這種算法稱為「受限制的算法」。

受限制的算法具有歷史意義,在早期相當長時間內發揮著作用,但按現在的標準,它們的保密性已遠遠不夠。大的或經常變換的用戶組織不能使用它們,因為每有一個用戶離開這個組織,其它的用戶就必須改換另外不同的算法。如果有人無意暴露了這個秘密,所有人都必須改變他們的算法。這就好比地下黨組織,有個聯絡員甩手不幹了,那麼為了安全起見,這個組織聯絡暗號也要換掉。

  更糟的是,受限制的密碼算法不可能進行質量控制或標準化。每個用戶組織必須有他們自己的唯一算法。這樣的組織不可能採用流行的硬體或軟體產品。但竊聽者卻可以買到這些流行產品並學習算法,於是用戶不得不自己編寫算法並予以實現,如果這個組織中沒有好的密碼學家,那麼他們就無法知道他們是否擁有安全的算法。

  儘管有這些主要缺陷,受限制的算法對低密級的應用來說還是很流行的,用戶或者沒有認識到或者不在乎他們系統中內在的問題。

  現代密碼學用密鑰解決了這個問題,密鑰用K表示。K可以是很多數值里的任意值。密鑰K的可能值的範圍叫做密鑰空間。加密和解密運算都使用這個密鑰(即運算都依賴於密鑰,並用K作為下標表示),這樣,加/解密函數現在變成: EK(M)=C DK(C)=M.   這些函數具有下面的特性:DK(EK(M))=M.   有些算法使用不同的加密密鑰和解密密鑰,也就是說加密密鑰K1與相應的解密密鑰K2不同,在這種情況下: EK1(M)=C DK2(C)=M DK2(EK1(M))=M

  所有這些算法的安全性都基於密鑰的安全性;而不是基於算法的細節的安全性。這就意味著算法可以公開,也可以被分析,可以大量生產使用算法的產品,即使偷聽者知道你的算法也沒有關係;如果他不知道你使用的具體密鑰,他就不可能閱讀你的消息。

(1)對稱加密(Symmetric Cryptography)

對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key)。對稱加密有很多種算法,由於它效率很高,所以被廣泛使用在很多加密協議的核心當中。

對稱算法有時又叫傳統密碼算法,就是加密密鑰能夠從解密密鑰中推算出來,反過來也成立。在大多數對稱算法中,加/解密密鑰是相同的。這些算法也叫秘密密鑰算法或單密鑰算法,它要求發送者和接收者在安全通信之前,商定一個密鑰。對稱算法的安全性依賴於密鑰,泄漏密鑰就意味著任何人都能對消息進行加/解密。只要通信需要保密,密鑰就必須保密。

  對稱算法的加密和解密表示為: EK(M)=C DK(C)=M   

  

Alice和Bob只能事先約定好加密密鑰K。如上圖,如果K是在信道中傳輸的,那麼很有可能被Eve竊聽的。拿到K的Eve是可以獲取信息明文的。

對稱加密具有幾個顯著缺點:

1、密鑰分發問題:密鑰的分發必須建立Alice和Bob使用安全信道的基礎上。而實際上通信鏈路是不安全的,所以直接在信道上傳輸密鑰也是不安全的,儘管這是最方便的方式。

2、密鑰數量:就算解決了密鑰分發問題,我們還得處理大量的密鑰對。假設一個對用戶使用一對密鑰,N個用戶的網絡,有N*(N-1)/2對密鑰。每個用戶要維護N-1個密鑰對的安全

3、不具備抗抵賴性:所謂抗抵賴性,就是發送者事後不可能虛假地否認他發送的消息。因為Alice和Bob具有相同的密鑰,我們無法確定雙方是否具有欺騙行為。如在一個電子商務應用中,Alice下了一個購買電視的訂單,改變注意後,她可以聲稱是Bob自己生成了錯誤的訂單。   

常用對稱加密算法:AES,DES,3DES

(2)非對稱加密(Asymmetric Cryptography)

為了克服對稱密鑰的這些缺點,diffie-hellman、Merkle提出了一個革命性的設想: 加密消息的人 (即我們的示例中的 Alice) 不需要保證她所擁有的密鑰是保密性。這個設想的關鍵的部分是, Bob接收者只能用秘密密匙解密。為了實現這樣的系統, Bob 發布了一個公共加密密鑰。與此同時,Bob 還有一個與之匹配的密鑰, 用於解密。因此, Bob的鑰匙 K 包括兩個部分, 一個公共部分, $K_{pub}$, 和一個私有的, $K_{pri}$。

這個機制有點像街角的郵筒,任何人都可以往裡面投遞郵件,但只有擁有郵箱鑰匙$K_{pri}$的郵遞員能打開郵筒拿到信件。這個協議用數學表達應該是這樣的:

非對稱加密(也稱公鑰算法)為數據的加密與解密提供了一個非常安全的方法,它使用了一對密鑰,公鑰(public key)和私鑰(private key)。私鑰只能由一方安全保管,不能外泄,而公鑰則可以發給任何請求它的人。非對稱加密使用這對密鑰中的一個進行加密,而解密則需要另一個密鑰。比如,你向銀行請求公鑰,銀行將公鑰發給你,你使用公鑰對消息加密,那麼只有私鑰的持有人--銀行才能對你的消息解密。與對稱加密不同的是,銀行不需要將私鑰通過網絡發送出去,因此安全性大大提高。

非對稱加密的安全機制:

1、密鑰建立:在不安全信道上建立機密密鑰的協議。此類協議的示例包括 Diffie–赫爾曼密鑰交換 (DHKE) 或 rsa 密鑰傳輸協議。

2、完整性校驗:提供認可和消息完整性的認可可以通過數字簽名算法實現, 例如 rsa、dsa 或 ecdsa。

3、鑑別: 我們可以識別使用挑戰和響應 pro-tocols 的實體以及數字簽名 (例如, 在銀行或行動電話中的智慧卡之類的應用程式中)。

4、加密:可以使用rsa或elgamal之類的算法來加密消息。

非對稱加密也有一個顯著的缺點,效率遠低於對稱加密。所以在使用過程中,通常會結合兩者使用。用非對稱技術去做密鑰建立,用對稱加密作數據加密。

在上個例子中,Bob可以解密Alice發送的消息,那Alice怎麼處理Bob發送的消息呢?很簡單,可以Alice可以把對稱密鑰K用Bob發送的$K_{pub}$加密, 發送給Bob,Bob拿到後解出K。那麼接下來,他們就可以用對稱密鑰K來處理消息了。過程如圖:

常用非對稱加密算法:RSA,DSA,ECC

(3) 數字簽名

接著上面這個場景,Alice和Bob解決了密鑰分發的問題,並拿到了對稱密鑰K,接下來,他們開始通話(通話內容用K加密):

Alice:Bob,我要買一台電視。有什麼優惠活動嗎?

Bob:買電視,送一張迪斯尼樂園門票。

Alice:OK

三天後,Alice收到了電視,但沒有拿到迪斯尼樂園門票。Alice向Bob投訴。Bob抵賴說:我並沒有說過送什麼禮物。Alice把Bob告上法庭。作為第三方仲裁者,法官無法判別Bob是否撒了謊。雖然Alice拿出了Bob發送的加密信息作為證據。但Alice也擁有相同的K,完全可以偽造出相同的信息。

那麼,如何解決Bob抵賴的問題呢?

上文提到過,非對稱加密(公鑰加密)的安全機制除了加密功能,還有另外一個很強大的功能:鑑別(數字簽名)。

數字簽名是當今用途最廣泛的密碼學工具之一。應用範圍包括數字證書、簽署電子商務法律合同及軟體更新等場景。它也是建立安全通道的重要保障手段之一(後續場景會用到),是 公鑰加密算法的重要組成部分。

確定某條信息是特定的人產生的,是非常重要 的。在現實生活中,可以利用手寫簽名。例如,我們簽署一份合同或支票,接受方憑簽名向法官證明是我們簽署了這個信息。在數字世界中,我們可用公鑰算法(非對稱)做到這一點。其基本思想是,簽名消息的人使用私鑰,接收方使用匹配的公鑰校驗。

如上圖:Bob用私鑰對消息作了簽名,並發送給Alice。Alice可用拿Bob在之前步驟發送的公鑰,去驗證這個消息和簽名。 驗證通過之後,Bob就無從抵賴了。

(4) 中間人攻擊(Man-in-the-Middle Attack)

進行到這裡,我們已經解決了密鑰分發、抗抵賴性等問題。但還是遺留一個問題:在第一步中,Alice如何確認收到的公鑰是屬於Bob,而不是被Eve截取並串改過的?

  

 

在上圖中,Eve截獲了Bob發給Alice的公鑰 $K_{pub}$,並替換成自己的公鑰$K_{pubEve}$,發給Alice。 Alice拿到了Eve的公鑰$K_{pubEve}$,她並不能驗證該公鑰的真實性,以為這個公鑰就是Bob的。這直接導致Eve竊取到了最重要的對稱密鑰K。Eve憑藉K,就可以解密並竊聽Alice和Bob後續通話了。

(5) 數字證書(Certificates)

數字證書很好的解決了這個問題。粗略的來講,數字證書就是把公鑰$K_{pub}$綁定到了一個確定的身份上。好吧,這句話有點繞口,你可以這麼理解:數字證書是一張含有公鑰的身份證。

數字證書通常是第三方數字證書認證機構(Certificate authority,簡稱CA) 頒發的,包含以下信息:

我們先來看一個證書,有個概念。百度的證書長成這樣的:

看完證書之後,我們再以Alice和Bob舉例,看Alice是如何完成對Bob的身份驗證的。

場景1:Alice要Bob出示身份信息

Bob:Hi,Alice,我是Bob

Alice:我不能確定你是Bob,能出示一下身份證(數字證書)嗎?

場景2:Bob去公安局(CA機構),辦理身份證(數字證書)

1、公安局(CA機構)會讓Bob提供公鑰$K_{pubBob}$和一些材料(通常是公司信息、域名等),並作背景調查。

2、公安局(CA機構)擁有公鑰$K_{pubPolice}$和私鑰$K_{priPolice}$。 用私鑰$K_{priPolice}$對Bob公鑰及信息簽名, 合併後生成Bob在該公安局(CA機構)的數字證書:

$Cert_{Bob} = [(K_{pub},Bob,ID_{Bob}),sig_{K_{pri}} (K_{pub},Bob,ID_{Bob})]$

場景3: Alice驗證Bob身份

1、Bob不再直接傳遞$K_{pub}$給Alice,而是傳遞$Cert_{Bob}$。

2、公安局(CA機構)的公鑰$K_{pubPolice}$是公開的(通常是作為根證書,內置在系統或瀏覽器內)。 Alice用$K_{pubPolice}$校驗證書的簽名信息。校驗通過後,就可用確認Bob的身份,從證書中獲取Bob的公鑰$K_{pub}$。完成後續的密鑰建立流程。

結尾

到這裡,我們已經從理論上初步完成了如何去建立一個安全信道。大家應該對密碼學有個大致的了解了。

下一次,我們將聊聊密碼學在日常場景的應用。比如:打開百度:https://www.baidu.com 這個過程,發生了什麼?


本文由作者@紫氣冬來 在PMCAFF社區發布,轉載請註明作者及出處。


閱讀原文:https://coffee.pmcaff.com/article/2159642342561920/?utm_source=ydyw


關鍵字: