公鑰密碼學簡介
如果您從事軟件開發,則可能已經以一種或另一種方式向您介紹了加密技術。 簽名消息,加密有效載荷,驗證簽名以及使用證書; 這些都是我們每天都使用的功能,即使我們不知道也是如此。
公鑰密碼學或非對稱密碼學是70年代中期開始的廣泛科學研究的主題,也是當今眾多書籍和研究論文的目標。
這絕不是試圖以任何水平的科學或學術細節介紹密碼技術。
相反,我將嘗試展示非對稱密碼技術背后的關鍵功能概念,并提供示例說明如何使用它(同時盡量避免使用專業術語)。
在以下各節中,我們將討論:
- 對稱加密與非對稱加密。
- 密鑰生成。
- 非對稱加密,或如何發送加密的消息。
- 簽署有效載荷。
- 證書。
一、對稱加密與非對稱加密
對稱加密與非對稱加密的區別在于使用密鑰來交付基礎加密功能的方式:
在對稱加密中,同一密鑰既用于加密又用于解密。 密鑰成為參與者之間共享的共享秘密。
顯然,隨著參與者數量的增加,泄露密鑰的風險也隨之增加。
在上圖中,如果 史蒂夫(Steve)的PC受到了威脅,任何獲得密鑰的人都可以解密發送給愛麗絲(Alice),約翰(John)和伊麗莎白(Elizabeth)的所有消息。
因此,一旦共享秘密在任何單個位置受到破壞,整個系統的安全性就會受到損害。 對稱加密的主要缺點是使用單個共享密鑰以及找到安全的傳播方式的要求。
對稱加密是直到70年代中期之前使用的主要加密機制,當時研究人員開始建議使用另一種方法來創建和傳播密鑰,更重要的是。
這是非對稱加密誕生的時候:

在非對稱加密中,每一方都是一對密鑰(公共密鑰和私有密鑰)的所有者。
最大的突破是,公開密鑰不是一個共享的秘密,應該由兩個或多個參與者小心地隱藏起來。 相反,參與者可以通過不受信任的網絡交換公用密鑰,甚至可以與其他任何人共享公用密鑰。
對稱加密徹底改變了密碼學領域,如今它已成為大多數大規模加密方案的基礎。 例如,互聯網。
二、密鑰生成
非對稱加密中公鑰和私鑰的創建取決于數學問題,尤其是單向函數。
單向函數的特征在于易于以一種方式解決(即生成密鑰),但是反計算(即在具有加密的有效載荷時找到密鑰)在計算上非常昂貴。
就像我在本文開頭所承諾的那樣,我不會不必要地使用與密碼學有關的技術術語。 但是,請記住這一點:并非所有鍵都是相同的。
密鑰的質量和強度取決于生成密鑰的算法以及密鑰的位數。
當前使用Diffie-Hellman算法生成的密鑰的密鑰大小建議為2048位或更大,約為使用橢圓曲線算法生成的密鑰的1/10。
因此,是時候使用瑞士的加密工具LibreSSL(v2.8.3,如果您使用的是OpenSSL,下面的大多數命令也應如此)來創建我們的第一個非對稱加密密鑰對。
1. 創建一個加密的私鑰
- openssl genrsa -des3 -out alice-privatekey.pem 2048openssl genrsa -des3 -out bob-privatekey.pem 2048
您現在已經成功為Alice和Bob生成了私鑰。 LibreSSL和OpenSSL中都有指定密鑰屬性的其他選項,包括在生成過程中使用橢圓曲線算法。
私鑰應該保持,好…私密,切勿與其他任何人共享。
2. 從私鑰中提取公鑰
- 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的公鑰并將其發送給任何感興趣的方。
三、非對稱加密,或如何發送加密的消息
非對稱加密適用于公鑰和私鑰。 要發送加密的消息,在加密過程中使用接收者的公鑰,在解密過程中使用接收者的私鑰,如下所示:
以下是上述場景中涉及的步驟,其中Alice希望將加密的消息發送給Bob:
- 愛麗絲獲得鮑勃的公鑰。
- 愛麗絲存儲鮑勃的公鑰以備將來使用。
- 愛麗絲將鮑勃的公鑰與有效載荷一起使用,然后將其通過她的加密軟件進行加密。
- 加密的有效負載將發送到Bob。
- 鮑勃將自己的私鑰和愛麗絲發送給他的解密軟件的加密消息傳遞。
- Bob獲得了Alice發送的原始有效負載。
因此,讓我們進入實際部分,并使用Bob的公鑰向他發送加密文件。 哦,等等…我們不能!
1. 混合加密
上面介紹的理論部分沒有任何問題,因為它的工作原理與廣告宣傳完全一樣。 但是,有一個不對稱加密的"陷阱":要加密的有效負載的大小必須(幾乎)與用于加密的公鑰的大小匹配。
因此,要向Bob發送大約1MB的照片,您需要Bob擁有至少800萬比特的公共密鑰。 那是八百萬個1和0,一個接一個。 生成這樣的密鑰可能不太實際-即使可以實現。
盡管您可以創建一種結構,在該結構中以塊模式使用非對稱加密來加密大型有效負載,但是通過以接近可用公共密鑰大小的較小比特來加密有效負載,實際上,這是沒人在使用的東西。 就所用空間而言,效率低下,而且速度將非常緩慢。
為了減輕非對稱加密的密鑰大小限制,當前的做法是使用混合加密:

在混合加密中,將創建一個隨機對稱密鑰來加密有效負載,并使用公共密鑰來加密隨機對稱密鑰。 讓我們看看它是如何工作的:
- 鮑勃將他的公鑰發送給愛麗絲。
- 愛麗絲生成共享的對稱密鑰。
- 愛麗絲用鮑勃的公鑰加密對稱密鑰。
- 愛麗絲使用(2)中創建的共享密鑰對消息進行加密。
- 愛麗絲將加密的消息和加密的共享密鑰發送給鮑勃。
- 鮑勃使用他的私鑰解密共享密鑰。
- 鮑勃使用共享密鑰解密加密的消息。
如果手動執行,上述情況將是冗長而乏味的。 但是,有完善的工具和標準可以自動安全地交換消息和文件,例如OpenPGP及其在PGP和GPG中的化身。
2. 使用GPG加密(GNU Privacy Guard)
GnuPG是RFC4880(也稱為PGP)定義的OpenPGP標準的完整和免費實現。
GnuPG允許您對數據和通信進行加密和簽名,并具有通用的密鑰管理系統以及用于各種公鑰目錄的訪問模塊。
現在,讓我們嘗試使用GPG將加密的文件從愛麗絲發送到鮑勃:
- 愛麗絲和鮑勃都需要創建GPG密鑰對:gpg –gen-key
- 鮑勃應導出其公鑰并將其發送給Alice:gpg –output bob.gpg –export bob@bob.com
- 愛麗絲收到鮑勃的公鑰后,應將其導入到本地密鑰數據庫中:gpg –import bob.gpg
- 愛麗絲創建未加密的消息:echo" Hello Bob"> bob.msg
- 愛麗絲對郵件進行加密,然后將加密的郵件與加密的共享密鑰一起發送到Bob:gpg-輸出bob.msg.gpg –encrypt-收件人bob@bob.com bob.msg
- 鮑勃(Bob)接收加密的消息,并通過解密共享密鑰并解密加密的消息來解密它:gpg –output bob.msg –decrypt bob.msg.pgp
GPG和PGP都已被廣泛使用,并且已經包含在我們日常使用的許多產品中,例如電子郵件客戶端,因此您幾乎不必手動執行上述順序。
四、簽署有效載荷
有時,不一定需要加密消息的內容,但是,我們可能仍要確保發送者的身份。 其他時候,內容需要加密,發件人的身份也需要驗證。 在兩種情況下,這都是我們使用數字簽名的地方。
在我們看到如何生成數字簽名以及如何對內容進行驗證以及驗證發件人的身份之前,讓我們在這里進行重要的區分-我經常看到人們可以互換使用:數字簽名不是電子簽名 。
1. 數字簽名
數字簽名只是用于驗證數字消息真實性的數學證明。
它使郵件的接收者具有很高的確定性,可以相信特定的郵件是由已知的發件人創建的,并且該郵件在傳輸過程中沒有被更改。
2. 電子簽名
電子簽名帶有物理簽名的意圖,通常使用數字簽名來實現。
在許多國家/地區,電子簽名只要符合其所依據的特定法規的要求,就可以提供與手寫簽名相同的法律地位。
發送者使用私鑰產生數字簽名,接收者使用發送者的公鑰驗證數字簽名:

- 愛麗絲將她的公鑰發送給鮑勃。
- 愛麗絲創建一條消息,并使用她的公鑰產生數字簽名。 通常,在消息的計算出的哈希值上,例如在所得的SHA-256上,產生數字簽名。
- Bob收到了原始的未加密消息以及該消息的Alice的數字簽名。
- Bob使用Alice的公鑰重新計算了原始未加密郵件的數字簽名,并將其與Alice發送的簽名進行了比較。
- 如果兩個簽名都匹配,則鮑勃知道是愛麗絲發送了原始郵件,并且郵件的內容沒有更改。
接下來,讓我們看看如何創建數字簽名以及收件人如何驗證收到的郵件是否未被篡改。
3. 簽發簽名
- openssl dgst -sha256 -sign alice-privatekey.pem -out bob.msg.sign bob.msg
上面的命令使用Alice的私鑰在bob.msg文件的SHA-256輸出上計算數字簽名。 然后,愛麗絲將bob.msg以及bob.msg.sign文件發送給Bob。
4. 驗證簽名
- openssl dgst -sha256 -verify alice-publickey.pem -signature bob.msg.sign bob.msg
鮑勃從愛麗絲那里收到了兩個文件,然后繼續使用愛麗絲的公鑰來驗證簽名。 上面的命令根據數字簽名驗證結果返回" Verified OK"或" Verification Failure"。
五、證書
證書,也稱為數字證書,身份證書或公鑰證書,是證明公鑰所有權的電子文檔。
證書的最常見格式由X.509定義,從根本上講,它包含一個公共密鑰,該公共密鑰的數字簽名以及有關公共密鑰所有者身份的信息。
證書可用于多種目的,因此,存在不同的證書配置文件。
公鑰對應于證書的所有者。 但是,要使其他任何人都能夠驗證所有者的身份,則需要一個受信任的第三方實體。
這就是證書頒發機構的用處。證書頒發機構是負責簽署證書的一方,通常是受信任的知名公司或組織。
為了有效地執行此角色,證書頒發機構需要擁有自己的根證書,該證書由盡可能多的用戶信任。 但是,證書頒發機構也可以提供交叉簽名,從而對其他證書頒發機構的根證書進行簽名。
剛開始時聽起來可能會令人困惑,所以讓我們嘗試通過一個示例進行說明:

- 在上面的示例中,鮑勃連接到愛麗絲的網站,并希望驗證是由愛麗絲經營的。
- Bob在訪問愛麗絲的網站時獲得了證書。 該證書包含Alice的公鑰以及來自證書頒發機構CA1的數字簽名。
- 由于Bob不了解也不信任CA1,因此他檢查了嵌入證書中的證書鏈。
- 通過追溯可用的交叉簽名,Bob到達了他信任的證書頒發機構CA3。 現在,他知道愛麗絲的網站可以信任由愛麗絲運營。
當然,所有這些過程都是由Internet瀏覽器在幕后在HTTPS協議的傳輸層安全性(TLS)下進行的。
證書身份驗證是基于共同受信任的父證書頒發機構的事實,這也是對證書的主要批評之一。
如果該父證書頒發機構被破壞或流氓怎么辦?
盡管證書主要用于網站隱私,標識和內容可靠性,但它們也可以用于客戶端標識。
如果您對自己的證書頒發機構感興趣,可以嘗試使用各種可用的開源實現之一,例如OpenCA,EJBCA或OpenXKPI。

當然,請考慮到由于您自己的證書頒發機構的根證書不會被您的Internet瀏覽器或其他任何人信任,因此您需要按照操作系統的說明將其手動插入到受信任的證書存儲中。
使用您自己的證書頒發機構頒發的證書的所有用戶的計算機也是如此。
不,不是一種選擇是讓一個知名的大型根證書頒發機構對您自己的證書頒發機構的根證書進行交叉簽名。
結論
公鑰密碼術或非對稱加密是一種基于密鑰對,公鑰和私鑰的密碼系統。 非對稱加密的主要用例是加密通信,提供消息驗證和真實性。
在本文中,我試圖介紹非對稱加密背后的基本概念,盡管只是從頭開始討論了這樣一個復雜的話題。 密碼學是一個引人入勝的領域,迄今為止,它一直在進行積極的研究,并為好奇的人們提供了大量的信息。
離開之前,如果您需要在項目中進行加密,請牢記加密的黃金法則:不要投放自己的加密貨幣。
那里有許多庫以及已經實施的強大,安全,經過考驗的算法。 做研究并選擇已經滿足項目需求的研究。