密碼學基礎知識


  要理解SSL/TLS協議,需要一些密碼學知識,這篇文章簡要介紹密碼學相關基礎知識。

一、加密與解密

  如圖,發送者Alice向接收者Bob發送消息,如果將消息直接進行發送,那么很可能被一個心懷惡意的竊聽者Eve竊聽消息。這樣Eve就知道了消息的內容。

  為了不讓別人看到消息內容,Alice決定對消息進行加密之后再發送出去。加密之前的消息稱為明文,加密之后的消息稱為密文。我們看到明文可以理解其含義,看到密文則看上去像是一堆亂碼。

  接收者Bob收到密文后需要先進行解密才能閱讀消息 ,解密就是將密文恢復成明文的過程。

  將消息加密后發送,竊聽者Eve得到是密文,無法得知加密前的消息內容。

  正常的接收者將密文還原為明文的過程叫做解密,但接收者以外的人試圖進行還原明文則成為密碼破譯,簡稱破譯。進行破譯的人稱為破譯者,破譯者不一定都是壞人,密碼學研究者為了研究密碼強度,也會需要對密碼進行破譯,研究者在這種情況下也是破譯者。

二、對稱加密

  對稱密碼 (symmetric cryptography)是指在加密和解密時使用同一密鑰的方式。目前廣泛使用 AES。對稱加密有一個問題就是密鑰配送問題, 即發送方和接收方如何在一個不安全的信道上共享密碼的問題。

三、非對稱加密

  非對稱加密(也叫公鑰密碼 (public-key cryptography))則是指在加密和解密時使用不同密鑰的方式。目前廣泛使用 RSA和ECDH。(RSA、ElGamal、Rabin、DH、ECDH)。

  非對稱加密的加密密鑰和解密密鑰不同,形成一對,具有強烈的數學關系。其中可以公開的一個一般稱為公鑰,可以給任何人,另一個則不能公開,稱為私鑰。私鑰一定嚴格妥善保管。通過公鑰加密的密文只能由私鑰解密。因此接收者Bob可以將公鑰發給發送者Alice,然后Alice用公鑰加密消息,並發送。即使被竊聽者竊取到公鑰也沒關系。因為用公鑰加密的密文只能由對應的私鑰解密,而私鑰只有接收者Bob才有。因此非對稱加密解決了密鑰配送問題,但依然存在下面兩個問題:

  1. 處理速度遠遠低於對稱加密
  2. 難以抵御中間人攻擊

四、混合密碼加密系統

  混合密碼系統是將對稱加密和非對稱加密優勢相結合的一種混合方式。可以解決對稱加密密鑰配送和非對稱加密處理速度低的問題。主要流程如下:

  • 發送者用接收者的公鑰加密對稱加密的密鑰,並發送

  • 接受者得到用公鑰加密的密鑰,然后用私鑰解密,得到對稱加密的密鑰

  • 發送者用對稱加密的密鑰加密消息內容,並發送

  • 接收者用對稱加密的密鑰解密消息

五、單向散列函數

  加密算法可以解決消息的機密性問題,但是無法保證消息的完整性。完整性指的是,數據是正確的,而不是偽造的。單向散列函數是保證信息的完整性的密碼技術,它會檢測數據是否被篡改。常用的散列函數有 md5 、 SHA-2(SHA-224、SHA-356、SHA-384、SHA-512) 和 具有全新結構的 SHA-3(Keccak 算法)等。

六、消息認證碼

  單向散列函數能保證消息的完整性的前提是散列值和消息是分開傳輸的。試想一下,如果竊聽者能夠同時獲取消息和散列值,那么他就可以同時修改消息內容和散列值來進行篡改。接收者驗證的時候不會發現消息被修改了,因為散列值對比檢測是一致的。進一步說,這里接收者收到的消息和散列值其實不是由發送者發送的,而是經過竊聽者修改過后的。

  消息認證碼(MAC)技術能提供一種認證機制,保證消息是來自於期望的發送者,同時也能保證消息的完整性。消息認證碼的輸入由任意長度的消息和一個事先由發送者和接收者共享的密鑰組成,他可以輸出固定長度的數據,這個數據稱為MAC值。

  任意長度的消息輸出固定長度的數據,這一點和單向散列函數很類似。但單向散列函數不需要共享密碼。實際上,一種實現消息認證碼的方式就是由單向散列函數加分組密碼( 比如AES)完成(HMAC),這種實現可以簡單的理解為一種與密碼相關的單向散列函數。

  要計算MAC值就必須擁有共享密鑰,沒有共享密鑰的人就無法計算出MAC值,消息認證碼正是基於這一點來完成認證的。試想,竊聽者同時竊取了消息和MAC值,但是由於他沒有共享密鑰,所以無法同時篡改消息並計算正確的MAC值。

  由上面的描述可以知道消息認證碼同樣存在密鑰共享的問題,除此之外消息認證碼還存在下面兩個問題:

  • 無法對第三方提供證明
  • 無法防止否認

  假設接收者Bob接收到Alice發送的消息后,想要向第三方驗證者Victor證明這條消息的確是Alice發送的,使用消息認證碼無法進行這樣的證明。為什么呢? 首先Victor想要校驗MAC,需要知道共享密鑰,就算Bob相信Victor把共享密鑰告訴了他,Victor能驗證MAC值是正確的,也無法證明消息就是Alice發送的,因為還有可能是Bob發送的。
  因為無法向第三方證明這條消息是Alice發送的,Alice就可以聲稱這條消息不是我發送的,是Bob偽造的。也就是發送方和接收方自己吵了起來。

  在這種情況下,使用數字簽名就可以防止否認。

七、數字簽名

  消息認證碼無法防止否認,其原因就在於發送者和接收者共享密鑰,那么如果發送者和接收者不需要共享密鑰,而是各自使用一個密鑰呢?有沒有很眼熟,對,很容易想到之前說過的非對稱加密。但數字簽名和非對稱加密是不同的。看一下數字簽名的基本流程和原理:

  • 發送者Alice,發送消息前用自己才知道的私鑰對消息進行一個“簽名”。然后將消息和簽名一起發送給接收者Bob
  • Bob收到消息后,用公鑰對消息的簽名進行”驗證“,驗證的方式就是對收到的簽名進行解密,然后和消息進行對比,如果是一致的則驗證成功。
  • 這里的關鍵點是,使用公鑰無法產生一個”簽名“,但卻可以對簽名進行”驗證“。

  這就是數字簽名技術,我們來理一下為什么數字簽名可以向提三方提供證明以及防止否認。首先,驗證用的公鑰是可以發送給任何人的,所以任何人都可以進行驗證。然后由於私鑰只有發送者才有,因此只有發送者才能進行“簽名“,發送者就沒法否認說這個消息不是我發送的了。當然更嚴格的說,發送者還是可以說”我的密鑰丟失了,被別人盜用了“。這個層面就上升到社會工程學層面了。我們將在證書和pki系統中描述這個問題。
上述的描述中是直接對消息內容進行了簽名,實際上一般不會這么做,因為如果消息內容很大,簽名和驗證都會很耗時。所以實際上一般是先對消息計算散列值,然后對散列值進行簽名。接收者驗證時也先對消息進行散列,然后解密簽名得到解密后的散列值,比較兩個散列值,相同則驗證成功。

  注意數字簽名和非對稱加密的區別 ,其比較如下圖:

八、偽隨機數生成器

  偽隨機數生成器(Pseudo Random Number Generator,PRNG)是一種能夠模擬產生隨機數列的算法。偽隨機數負責承擔密鑰生成的職責。它由密碼和單向散列函數等技術構成,主要用於生成密鑰、初始化向量和 nonce 等。

九、密碼學家的工具箱

  上面描述的六種密碼技術發揮着重要作用:

  • 對稱密碼
  • 公鑰密碼
  • 單向散列函數
  • 消息認證碼
  • 數字簽名
  • 偽隨機數生成器

  做一下總結:

  原博文入口: https://blog.csdn.net/zhanyiwp/article/details/105530487


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM