天天看點

公鑰密碼學簡介

作為工程師應學習的非對稱密碼學概念

公鑰密碼學簡介

> Enigma machine by School of Mathematics — University of Manchester on flickr (CC BY 2.0)

如果您從事軟體開發,則可能已經以一種或另一種方式向您介紹了加密技術。 簽名消息,加密有效載荷,驗證簽名以及使用證書; 這些都是我們每天都使用的功能,即使我們不知道也是如此。

公鑰密碼學或非對稱密碼學是70年代中期開始的廣泛科學研究的主題,也是當今衆多書籍和研究論文的目标。

這絕不是試圖以任何水準的科學或學術細節介紹密碼技術。

相反,我将嘗試展示非對稱密碼技術背後的關鍵功能概念,并提供示例說明如何使用它(同時盡量避免使用專業術語)。

在以下各節中,我們将讨論:

· 對稱加密與非對稱加密。

· 密鑰生成。

· 非對稱加密,或如何發送加密的消息。

· 簽署有效載荷。

· 證書。

對稱加密與非對稱加密

對稱加密與非對稱加密的差別在于使用密鑰來傳遞基礎加密功能的方式:

公鑰密碼學簡介

> With symmetric encryption, one key is shared with one or more parties (image by author)

在對稱加密中,同一密鑰既用于加密又用于解密。 密鑰成為參與者之間共享的共享秘密。

顯然,随着參與者數量的增加,洩露密鑰的風險也随之增加。

在上圖中,如果 史蒂夫(Steve)的PC受到了威脅,任何獲得密鑰的人都可以解密發送給愛麗絲(Alice),約翰(John)和伊麗莎白(Elizabeth)的所有消息。

是以,一旦共享秘密在任何單個位置受到破壞,整個系統的安全性就會受到損害。 對稱加密的主要缺點是使用單個共享密鑰以及找到安全的傳播方式的要求。

對稱加密是直到70年代中期之前使用的主要加密機制,當時研究人員開始建議使用另一種方法來建立和傳播密鑰,更重要的是。

這是非對稱加密誕生的時候:

公鑰密碼學簡介

> With asymmetric encryption, parties maintain key-pairs and exchange public keys (image by author)

在非對稱加密中,每一方都是一對密鑰(公共密鑰和私有密鑰)的所有者。

最大的突破是,公開密鑰不是一個共享的秘密,應該由兩個或多個參與者小心地隐藏起來。 相反,參與者可以通過不受信任的網絡交換公用密鑰,甚至可以與其他任何人共享公用密鑰。

對稱加密徹底改變了密碼學領域,如今它已成為大多數大規模加密方案的基礎。 例如,網際網路。

密鑰生成

非對稱加密中公鑰和私鑰的建立取決于數學問題,尤其是單向函數。

單向函數的特征在于易于以一種方式解決(即生成密鑰),但是反計算(即在具有加密的有效載荷時找到密鑰)在計算上非常昂貴。

就像我在本文開頭所承諾的那樣,我不會不必要地使用與密碼學有關的技術術語。 但是,請記住這一點:并非所有鍵都是相同的。

密鑰的品質和強度取決于生成密鑰的算法以及密鑰的位數。

目前使用Diffie-Hellman算法生成的密鑰的密鑰大小建議為2048位或更大,約為使用橢圓曲線算法生成的密鑰的1/10。

是以,是時候使用瑞士的加密工具LibreSSL(v2.8.3,如果您使用的是OpenSSL,下面的大多數指令也應如此)來建立我們的第一個非對稱加密密鑰對。

建立一個加密的私鑰

openssl genrsa -des3 -out alice-privatekey.pem 2048openssl genrsa -des3 -out bob-privatekey.pem 2048

您現在已經成功為Alice和Bob生成了私鑰。 LibreSSL和OpenSSL中都有指定密鑰屬性的其他選項,包括在生成過程中使用橢圓曲線算法。

私鑰應該保持,好…私密,切勿與其他任何人共享。

從私鑰中提取公鑰

openssl rsa -in alice-privatekey.pem -outform PEM -pubout -out alice-publickey.pemopenssl rsa -in bob-privatekey.pem -outform PEM -pubout -out bob-publickey.pem

現在,由于沒有嵌入任何敏感資訊,是以可以提取Alice和Bob的公鑰并将其發送給任何感興趣的方。

非對稱加密,或如何發送加密的消息

非對稱加密适用于公鑰和私鑰。 要發送加密的消息,在加密過程中使用接收者的公鑰,在解密過程中使用接收者的私鑰,如下所示:

公鑰密碼學簡介

> Public-key encryption/decryption (image by author)

以下是上述場景中涉及的步驟,其中Alice希望将加密的消息發送給Bob:

· 愛麗絲獲得鮑勃的公鑰。

· 愛麗絲存儲鮑勃的公鑰以備将來使用。

· 愛麗絲将鮑勃的公鑰與有效載荷一起使用,然後将其通過她的加密軟體進行加密。

· 加密的有效負載将發送到Bob。

· 鮑勃将自己的私鑰和愛麗絲發送給他的解密軟體的加密消息傳遞。

· Bob獲得了Alice發送的原始有效負載。

是以,讓我們進入實際部分,并使用Bob的公鑰向他發送加密檔案。 哦,等等…我們不能!

混合加密

上面介紹的理論部分沒有任何問題,因為它的工作原理與廣告宣傳完全一樣。 但是,有一個不對稱加密的"陷阱":要加密的有效負載的大小必須(幾乎)與用于加密的公鑰的大小比對。

是以,要向Bob發送大約1MB的照片,您需要Bob擁有至少800萬比特的公共密鑰。 那是八百萬個1和0,一個接一個。 生成這樣的密鑰可能不太實際-即使可以實作。

盡管您可以建立一種結構,在該結構中以塊模式使用非對稱加密來加密大型有效負載,但是通過以接近可用公共密鑰大小的較小比特來加密有效負載,實際上,這是沒人在使用的東西。 就所用空間而言,效率低下,而且速度将非常緩慢。

為了減輕非對稱加密的密鑰大小限制,目前的做法是使用混合加密:

公鑰密碼學簡介

> Hybrid encryption (image by author)

在混合加密中,将建立一個随機對稱密鑰來加密有效負載,并使用公共密鑰來加密随機對稱密鑰。 讓我們看看它是如何工作的:

· 鮑勃将他的公鑰發送給愛麗絲。

· 愛麗絲生成共享的對稱密鑰。

· 愛麗絲用鮑勃的公鑰加密對稱密鑰。

· 愛麗絲使用(2)中建立的共享密鑰對消息進行加密。

· 愛麗絲将加密的消息和加密的共享密鑰發送給鮑勃。

· 鮑勃使用他的私鑰解密共享密鑰。

· 鮑勃使用共享密鑰解密加密的消息。

如果手動執行,上述情況将是冗長而乏味的。 但是,有完善的工具和标準可以自動安全地交換消息和檔案,例如OpenPGP及其在PGP和GPG中的化身。

使用GPG加密(GNU Privacy Guard)

GnuPG是RFC4880(也稱為PGP)定義的OpenPGP标準的完整和免費實作。

GnuPG允許您對資料和通信進行加密和簽名,并具有通用的密鑰管理系統以及用于各種公鑰目錄的通路子產品。

現在,讓我們嘗試使用GPG将加密的檔案從愛麗絲發送到鮑勃:

· 愛麗絲和鮑勃都需要建立GPG密鑰對:gpg –gen-key

· 鮑勃應導出其公鑰并将其發送給Alice:gpg –output bob.gpg –export [email protected]

· 愛麗絲收到鮑勃的公鑰後,應将其導入到本地密鑰資料庫中:gpg –import bob.gpg

· 愛麗絲建立未加密的消息:echo" Hello Bob"> bob.msg

· 愛麗絲對郵件進行加密,然後将加密的郵件與加密的共享密鑰一起發送到Bob:gpg-輸出bob.msg.gpg –encrypt-收件人[email protected] bob.msg

· 鮑勃(Bob)接收加密的消息,并通過解密共享密鑰并解密加密的消息來解密它:gpg –output bob.msg –decrypt bob.msg.pgp

GPG和PGP都已被廣泛使用,并且已經包含在我們日常使用的許多産品中,例如電子郵件用戶端,是以您幾乎不必手動執行上述順序。

簽署有效載荷

有時,不一定需要加密消息的内容,但是,我們可能仍要確定發送者的身份。 其他時候,内容需要加密,發件人的身份也需要驗證。 在兩種情況下,這都是我們使用數字簽名的地方。

在我們看到如何生成數字簽名以及如何對内容進行驗證以及驗證發件人的身份之前,讓我們在這裡進行重要的區分-我經常看到人們可以互換使用:數字簽名不是電子簽名 。

電子簽名

數字簽名隻是用于驗證數字消息真實性的數學證明。

它使郵件的接收者具有很高的确定性,可以相信特定的郵件是由已知的發件人建立的,并且該郵件在傳輸過程中沒有被更改。

電子簽名帶有實體簽名的意圖,通常使用數字簽名來實作。

在許多國家/地區,電子簽名隻要符合其所依據的特定法規的要求,就可以提供與手寫簽名相同的法律地位。

發送者使用私鑰産生數字簽名,接收者使用發送者的公鑰驗證數字簽名:

公鑰密碼學簡介

> Verifying a message with a digital signature (image by author)

· 愛麗絲将她的公鑰發送給鮑勃。

· 愛麗絲建立一條消息,并使用她的公鑰産生數字簽名。 通常,在消息的計算出的哈希值上,例如在所得的SHA-256上,産生數字簽名。

· Bob收到了原始的未加密消息以及該消息的Alice的數字簽名。

· Bob使用Alice的公鑰重新計算了原始未加密郵件的數字簽名,并将其與Alice發送的簽名進行了比較。

· 如果兩個簽名都比對,則鮑勃知道是愛麗絲發送了原始郵件,并且郵件的内容沒有更改。

接下來,讓我們看看如何建立數字簽名以及收件人如何驗證收到的郵件是否未被篡改。

簽發簽名

openssl dgst -sha256 -sign alice-privatekey.pem -out bob.msg.sign bob.msg

上面的指令使用Alice的私鑰在bob.msg檔案的SHA-256輸出上計算數字簽名。 然後,愛麗絲将bob.msg以及bob.msg.sign檔案發送給Bob。

驗證簽名

openssl dgst -sha256 -verify alice-publickey.pem -signature bob.msg.sign bob.msg

鮑勃從愛麗絲那裡收到了兩個檔案,然後繼續使用愛麗絲的公鑰來驗證簽名。 上面的指令根據數字簽名驗證結果傳回" Verified OK"或" Verification Failure"。

證明書

證書,也稱為數字證書,身份證書或公鑰證書,是證明公鑰所有權的電子文檔。

證書的最常見格式由X.509定義,從根本上講,它包含一個公共密鑰,該公共密鑰的數字簽名以及有關公共密鑰所有者身份的資訊。

證書可用于多種目的,是以,存在不同的證書配置檔案。

公鑰對應于證書的所有者。 但是,要使其他任何人都能夠驗證所有者的身份,則需要一個受信任的第三方實體。

這就是證書頒發機構的用處。證書頒發機構是負責簽署證書的一方,通常是受信任的知名公司或組織。

為了有效地執行此角色,證書頒發機構需要擁有自己的根證書,該證書由盡可能多的使用者信任。 但是,證書頒發機構也可以提供交叉簽名,進而對其他證書頒發機構的根證書進行簽名。

剛開始時聽起來可能會令人困惑,是以讓我們嘗試通過一個示例進行說明:

公鑰密碼學簡介

> A certificate validation chain of trust (image by author)

· 在上面的示例中,鮑勃連接配接到愛麗絲的網站,并希望驗證是由愛麗絲經營的。

· Bob在通路愛麗絲的網站時獲得了證書。 該證書包含Alice的公鑰以及來自證書頒發機構CA1的數字簽名。

· 由于Bob不了解也不信任CA1,是以他檢查了嵌入證書中的證書鍊。

· 通過追溯可用的交叉簽名,Bob到達了他信任的證書頒發機構CA3。 現在,他知道愛麗絲的網站可以信任由愛麗絲營運。

當然,所有這些過程都是由Internet浏覽器在幕後在HTTPS協定的傳輸層安全性(TLS)下進行的。

證書身份驗證是基于共同受信任的父證書頒發機構的事實,這也是對證書的主要批評之一。

如果該父證書頒發機構被破壞或流氓怎麼辦?

盡管證書主要用于網站隐私,辨別和内容可靠性,但它們也可以用于用戶端辨別。

如果您對自己的證書頒發機構感興趣,可以嘗試使用各種可用的開源實作之一,例如OpenCA,EJBCA或OpenXKPI。

公鑰密碼學簡介

> Screenshot of the web administration console of EJBCA (David CARELLA, Wikipedia, CC BY-SA 4.0)

當然,請考慮到由于您自己的證書頒發機構的根證書不會被您的Internet浏覽器或其他任何人信任,是以您需要按照作業系統的說明将其手動插入到受信任的證書存儲中。

使用您自己的證書頒發機構頒發的證書的所有使用者的計算機也是如此。

不,不是一種選擇是讓一個知名的大型根證書頒發機構對您自己的證書頒發機構的根證書進行交叉簽名。

結論

公鑰密碼術或非對稱加密是一種基于密鑰對,公鑰和私鑰的密碼系統。 非對稱加密的主要用例是加密通信,提供消息驗證和真實性。

在本文中,我試圖介紹非對稱加密背後的基本概念,盡管隻是從頭開始讨論了這樣一個複雜的話題。 密碼學是一個引人入勝的領域,迄今為止,它一直在進行積極的研究,并為好奇的人們提供了大量的資訊。

離開之前,如果您需要在項目中進行加密,請牢記加密的黃金法則:不要投放自己的加密貨币。

那裡有許多庫以及已經實施的強大,安全,經過考驗的算法。 做研究并選擇已經滿足項目需求的研究。

感謝您閱讀本文。 我希望在下一個見到你。