我們討論了很多關于公鑰加密的安全應用的內容,它是如何實現加密和認證的。它在SSL、代碼簽名、電子郵件和文檔簽名、個人身份驗證所有內容中所扮演的角色。我們不常談論的是公鑰加密的歷史意義。
今天,我們將討論私鑰加密和公鑰加密的區(qū)別,后者的歷史意義,以及它們如何結合起來,使SSL/TLS和類似的加密系統成為可能。話不多說,我們開始吧。
什么是私鑰加密?縱觀歷史,有無數的私鑰加密學例子,可以追溯到公元前1900年左右。在私鑰加密學中,雙方必須持有一個匹配的私鑰(或者在傳輸時交換私鑰),它們可以使用該私鑰來加密明文,然后對其進行解密。著名的例子是凱撒的密碼,神秘機器和路易十四的大密碼。
但是,私鑰加密存在一個固有的重大缺陷。今天,我們把它稱為密鑰分發(fā),對99.9%的人來說,這是一種事后考慮。但從歷史上看,密鑰分配是一個很大的問題。
想想看,雙方都必須擁有一個物理密鑰。如果雙方之間有任何距離,你必須委托一名快遞員攜帶私鑰或親自前往那里交易。如果鑰匙落入壞人之手,可能會破產。過去,人們因為這類私鑰問題跌了很多跟頭。
即使在數字時代,私鑰加密本身也在與密鑰分配進行斗爭。您怎么知道您在沒有身份驗證機制的情況下能將私鑰(在SSL/TLS中稱為會話密鑰)發(fā)送給正確的接收方?
公鑰加密技術的發(fā)明公開密鑰加密的發(fā)明實際上有兩次重大進展。1970年,一位名叫JamesEllis的加密學家在英國政府通信總部(GCHQ)工作,他從理論上提出了一種公開密鑰加密系統,但當時不知道如何實現它。三年后的1973年,CliffordCocks想出了一種實用的實現方法,方法是將一種和RSA(是1977年Ron Rivest、Adi Shamir和Leonard Adleman一起提出的。
1987年7月首次在美國公布,當時他們三人都在麻省理工學院工作實習。RSA就是他們三人姓氏開頭字母拼在一起組成的。目前最有影響力和最常用的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數密碼攻擊,已被ISO推薦為公鑰數據加密標準。)大致相當的算法混合在一起。第三個人,數學家Malcolm Williamson開發(fā)了一個等價于Diffie Helman密鑰交換的密鑰交換系統。
這些信息也被傳遞給了美國國家安全局,但這兩個組織都不理解它的重要性,而且由于當時計算機的性質,這種技術被認為是不切實際的,更像是一個有趣的思想實驗。它在1997年解密了27年。
據我們所知,它從未被任何一方使用過。因此,1976年,公開密鑰密碼再次被發(fā)現,這一次是由Whitfield Diffie和Martin Hellman共同命名的。
一年后,RSA創(chuàng)作者--Ron Rivest、Adi Shamir和Leonard Adleman正在麻省理工學院完成他們的這項工作。
什么是公鑰密碼?Diffie-Helman密鑰交換和RSA是非對稱加密體制。到目前為止,加密一直是對稱的,雙方都能夠使用相同的私鑰進行加密和解密。正如我們已經討論過的,這給人們帶來了各種各樣的問題。
從術語“密鑰交換”中可以看出,這些系統的創(chuàng)建者已經在考慮糾正一個由來已久的問題:密鑰分配。
公鑰加密使用一對密鑰。分別是可以加密的公鑰和解密的私鑰。使用公鑰加密,通信只能走一條路,因此被稱為“不對稱”。這個想法是,授權方持有私鑰,而公鑰是公共密鑰。
公鑰加密中的私鑰仍然和以往一樣有價值,因此必須額外考慮如何確保私鑰的安全。但在壞人手里,公鑰絕對是一文不值的。不存在公鑰被盜的風險。那么公鑰加密是如何解決私鑰問題的呢?
通過啟用更安全的對稱加密。
公鑰加密是一種密鑰交換機制顯然,公鑰加密的單向特性使得它成為通信的一個特殊的選擇。但這并不是真正的目的。它既是一種認證機制,也是一種加密機制。這是為了加密信息并確保它到達正確的地點。最好的加密方法之一就是私鑰。
這就是您在SSL/TLS中看到的。在短暫的片刻,客戶端生成對稱會話(私有)密鑰,對其進行加密,并將其發(fā)送到服務器。如果服務器擁有私鑰,它會解密會話密鑰,客戶端和服務器可以開始使用對稱密鑰進行通信。
這也有助于對服務器進行身份驗證,因為如果沒有正確的私鑰,服務器就無法解密客戶端的消息。
公鑰密碼學是一個輝煌的突破,為我們今天使用的SSL/TLS協議奠定了基礎。到目前為止,即使是最先進的加密系統也只能與其私鑰一樣安全。公鑰加密也是如此。但公鑰加密作為一種密鑰交換機制,消除了大量的攻擊向量。
由于它的單向特性,用于公鑰加密的私鑰可以更加健壯。強對稱私鑰是256位。這仍然是足夠的安全措施。但與2048位RSA私鑰相比卻相形見絀。這使得它成為一種更好的密鑰分發(fā)機制。
公鑰加密在SSL中是如何工作的?在SSL中,公鑰加密有助于身份驗證和密鑰交換。為了解釋這一點,我將使用TLS1.3模型,因為這是我們前進的方向。在早期的TLS版本中,這有點復雜。
讓我們從密碼和密碼套件開始。密碼是用于加密的算法。密碼套件是SSL/TLS協議聯合使用的一組算法。每個服務器和每個瀏覽器都被配置為支持某些密碼套件。
傳統上,密碼套件由:密鑰交換/認證算法_WITH_S組成。
TLS 1.3將加密和身份驗證算法與關聯數據(Aead)算法結合在一起。當用戶(客戶端)到達網站(服務器)時,它會發(fā)送一條ClientHello消息,其中包含按首選項排序的受支持密碼套件列表。它還猜測將使用何種加密算法并發(fā)送會話密鑰。所有這些都是使用服務器的公鑰加密的。
服務器使用自己的私鑰解密ClientHello消息,然后返回服務器Hello消息及其證書、所選的密碼套件以及密鑰。在收到服務器-Hello之后,客戶端和服務器開始使用他們交換的對稱加密密鑰進行通信。
現在會話密鑰的快速消息經常被替換。在某些情況下,為每條消息使用不同的會話密鑰并不少見。但是,如果沒有安全處理密鑰分發(fā)的能力,這是不可能實現的。這也是公鑰密碼學的歷史意義。