密碼學:一文讀懂常用加密技術原理及其邏輯與應用方法

一直以來,有很多小夥伴在區塊鏈學習亦或是網絡安全學習的過程中,後臺私聊我一些關於密碼學的問題。在這篇文章裏,我將嘗試用通俗的語言,還原密碼學應用邏輯與信息傳輸加密方法,幫助大家在密碼學學習過程中更好的理解學科中的關鍵要點。希望無論是新手小白,還是在密碼學學習道路上不斷探索的“我們”,都能夠通過這篇文章,收穫一二。

在這裏插入圖片描述


密碼,最初的目的是用於對信息加密,但隨着密碼學的運用,密碼還被廣泛用於身份認證、防止否認等問題上。針對信息傳輸過程中可能面對的“竊聽”、“篡改”、“假冒”、“否認”等安全性隱患,計算機領域衍生出種類繁多的密碼技術,針對不同的應用場景,可以總結出下表:

威脅 特徵 相應技術
竊聽 破壞數據機密性 對稱加密、非對稱加密、混合加密
假冒 第三方假冒一方發送信息 消息認證碼、數字簽名、數字證書
篡改 破壞數據完整性 單向散列、消息認證碼、數字簽名、數字證書
否認 事後否認自己行爲 數字簽名、數字證書

在這裏插入圖片描述


一、加密——防止“竊聽”

密碼最基本的功能是信息的加解密,這就涉及到了密碼算法。每個密碼算法都基於相應的數學理論。密碼學發展至今,已經產生了大量優秀的密碼算法,通常分爲兩類:對稱密碼算法(Sysmmetric Cryptography)和非對稱密碼算法(Public-Key Cryptography,Asymmetric Cryptography),這兩者的區別是是否使用了相同的密鑰。

(1)對稱密碼算法(Sysmmetric Cryptography)

所謂對稱加密,是信息傳遞雙方用同一個密鑰來進行加密解密,實踐中最爲常用,效率高。

在這裏插入圖片描述
上圖向大家展示了對稱加密流程:

  1. 發送方A、接收方B共享密鑰A;
  2. 發送方A通過密鑰A對明文加密;
  3. 發送方A向接收方B發送密文;
  4. 接收方B通過密鑰A解密密文,得到明文。

對稱密碼算法以A、B間密鑰A的共享(傳遞)不被第三方C獲取爲前提,無法解決密鑰分配過程中的安全性問題(即密鑰A存在被第三方C獲取的可能)。

(2)非對稱密碼算法(Public-Key Cryptography,Asymmetric Cryptography)

非對稱加密可以用於解決密鑰配送問題。

相對於對稱密碼加解密採用相同的密碼,非對稱密碼加解密採用的是不同的密鑰,公鑰和私鑰成對,公鑰加密信息,相應的私鑰解密。公鑰是公開的,私鑰歸信息的接受者所有。由於非對稱密碼算法可以把加密密鑰公開,因此也叫做公開密鑰密碼算法,簡稱公鑰密碼算法,或公鑰算法。公鑰算法非常優雅地解決了密鑰既要保密又要公開的矛盾。
在這裏插入圖片描述

上圖向大家展示了非對稱加密流程:

  1. 接收方B生成公私鑰對,私鑰由接收方B自己保管;
  2. 接收方B將公鑰發送給信息發送方A;
  3. 發送方A通過公鑰對明文加密,得到密文;
  4. 發送方A向接收方B發送密文;
  5. 接收方B通過私鑰解密密文,得到明文。

非對稱加密算法似乎能夠解決密鑰分配問題,但是依然存在缺陷,其中最明顯的缺陷是:加密解密效率慢!

RSA算法的速度是DES的1000分之一,並且密鑰越長,速度會急劇變慢。基於此,在工業場景下,往往選擇的是通過非對稱加密配送密鑰,對稱加密加密明文的混合加密方式加密報文。

(3)混合加密

混合加密就是對稱加密與非對稱加密的結合。用對稱密碼來加密明文(速度),用非對稱密碼來加密對稱密碼中所使用的密鑰(安全)。對稱加密算法加密解密速度快,強度高,但存在密鑰分配問題;非對稱加密不存在密鑰分配問題,但算法效率低。基於上述特徵,可以選擇通過非對稱加密配送對稱密鑰,再採用對稱密鑰用來加密的方式,實現網絡的密鑰配送與通信加密,以取長補短,優化加密方法。
在這裏插入圖片描述
上圖向大家展示了混合加密流程:

  1. 接收方B生成公私鑰對(公鑰A、私鑰A),私鑰(私鑰A)由接收方B自己保管;
  2. 接收方B將公鑰(公鑰A)發送給信息發送方A;
  3. 發送方A通過公鑰對對稱密鑰(對稱密鑰S)加密,得到密鑰密文;
  4. 發送方A向接收方B發送密鑰密文;
  5. 接收方B通過私鑰(私鑰A)解密密文,得到對稱密鑰(對稱密鑰S);
  6. 此時,發送方A、接收方B成功共享密鑰S,此後信息就可以用對稱加密方法傳遞;
    • 發送方A通過密鑰S對明文加密;
    • 發送方A向接收方B發送密文;
    • 接收方B通過密鑰S解密密文,得到明文。

混合加密利用對稱加密算法解決了信息加解密效率缺陷,利用非對稱加密算法配送對稱密鑰解決了密鑰分配問題,但即便如此,仍然存在一定的安全隱患,如:無法避免中間人攻擊、信息篡改

例如:中間人C可以在劫持B發出的公鑰A後,發送一個僞造的公鑰B給A,A通過公鑰B加密後的密文,可以被劫持者C通過私鑰B解密,之後所有的密文都對劫持者透明瞭;C還能用之前劫持到的公鑰A 假冒 A,通過加密信息甚至篡改信息,發送給B,此時AB均無從發覺公鑰已被中間人C 僞造,信息已被竊聽,甚至篡改


二、單向散列、消息認證碼——防止“假冒”與“篡改”

加密算法爲我們解決了數據的竊聽威脅,但無法有效應對數據的篡改與假冒,這就有必要了解消息認證碼等相關技術。

(1)單向散列技術(One-Way Hash Function)

在瞭解消息認證碼前,我們需要先了解單向散列技術(即哈希技術)。所謂單向散列技術又稱密碼檢驗(Cryptographic Checksum)、指紋 (Fingerprint)、消息摘要 (Message Digest),是爲了保證信息的完整性(Integrity),防止信息被篡改的一項技術。單向散列算法,又稱單向Hash函數、雜湊函數,就是把任意長的輸入消息串變化成固定長的輸出串且由輸出串難以得到輸入串的一種函數。其具有如下特點:

  1. 任意的消息大小。哈希函數對任何大小的消息x都適用。
  2. 固定的輸出長度。無論信息長度,計算出的長度永遠不變。
  3. 計算快速,即函數的計算相對簡單
  4. 具有單向性(one-way),不可由散列值推出原信息。即教材所謂的抗第一原像性【給定一個輸出z,找到滿足h(x)=z的輸入x是不可能的】
  5. 信息不同,散列值不同,具有抗碰撞性(Collision Resistance)。
    (1)強抗碰撞性:要找到散列值相同的兩條不同的消息是非常困難的(知道散列值找兩條消息)。即找到滿足h(x1)=h(x2)的一對x1≠x2在計算上是不可行的;
    (2)弱抗碰撞性:要找到和該消息具有相同散列值的另一個消息是非常困難的(知道該消息和其散列值找另一條消息)。即抗第二原像性【給定x1和h(x1),找到滿足h(x1)=h(x2)的x2在計算上是不可能的】。

常見的單向散列函數(Hash函數)有消息摘要算法MD(Message Digest)、安全散列算法SHA(Secure Hash Algorithm),其中採用 Keccak 算法的SHA-3採用海綿結構。就安全性而言,MD4、MD5爲產生128比特散列值,均已不安全,存在可碰撞。SHA-1產生160比特散列值,也是不推薦使用的,存在可碰撞。RIPEMD-128、RIPEMD-160也不推薦使用。推薦使用SHA-2、SHA-3算法(目前對它的支持還不是很廣泛)。

  • 哈希函數是沒有密鑰的。哈希函數兩個最主要的應用就是數字簽名和消息驗證碼(比如 HMAC)
  • 哈希函數的三個安全性要求爲單向性、抗第二原像性和抗衝突性。
  • 爲了抵抗衝突攻擊,哈希函數的輸出長度至少爲160 位;對長期安全性而言,最好使用256位或更多的哈希函數。
  • MD5 的使用非常廣泛,但卻是不安全的。人們發現了 SHA-1中存在的嚴重安全漏洞,這樣的哈希函數應該被逐步淘汰。SHA-2算法看上去是安全的。
  • 正在進行的 SHA-3競爭將在幾年後產生新的標準化的哈希函數。

結合密碼學的加解密技術和單向散列技術,有了用於防止篡改的消息認證碼技術,防止僞裝的數字簽名技術以及認證證書,這一部分請看下文。

(2)消息認證碼(Message Authentication Code)

消息認證碼算法(MAC)的作用在於驗證傳輸數據的完整性,這就要求其應當是一串需要與共享密鑰相關而且足夠有區分度的串。因此,可以通過多種方式獲得 MAC 值,如單向散列(Hash函數)、分組密碼截取最後一組作爲 MAC 值、流密碼、非對稱加密等。

以單向散列技術(Hash函數)爲例:

在這裏插入圖片描述
首先,消息認證碼採用的是對稱加密,因此A需要準備一個用於加密密文的密鑰(密鑰W)和一個用來生成消息驗證碼的密鑰(密鑰X),將其通過安全的方法(如非對稱加密算法)發送給接收方B。

在這裏插入圖片描述

上圖向大家展示了密鑰建立共享後信息的傳輸流程:

  1. 發送方 A 與接收方 B 共享密鑰(加密密文的密鑰W和生成消息驗證碼的密鑰X);
  2. 發送方A通過密鑰W對明文加密,得到密文;
  3. 發送方 A 通過密鑰X計算 MAC 值,hash加密後生成消息驗證碼(MAC-A);
  4. 發送方A向接收方B發送密文和消息驗證碼(MAC-A);
  5. 接收方 B 對密文通過密鑰X計算 MAC 值,再hash加密一次獲得消息驗證碼(MAC-B)。
  6. 接收方 B 比較 MAC-A 與 MAC-B,若一致則說明信息未被篡改,可以通過密鑰W對密文解密讀取信息。
  7. 若MAC-A 與 MAC-B不一致,則說明密文被篡改,或者消息驗證碼被篡改,或兩者皆被篡改。

需要注意的是,消息認證碼仍然存在問題:

  1. 密鑰配送的問題,因爲 MAC 需要發送者與接收者使用相同的密鑰;
  2. 暴力破解;
  3. 無法防止事後否認、也無法對第三方證明。因爲密鑰是共享的,接收者可以僞造對發送者不利的信息。
  4. 重放攻擊,竊取某一次通信中的正確的 MAC,然後攻擊者重複多次發送相同的信息。由於信息與 MAC 可以匹配,在不知道密鑰的情況下,攻擊者就可以完成攻擊。

以下方法可以避免重放攻擊:

  • 序號,約定信息中帶上遞增序號,MAC 值爲加上序號的 MAC
  • 時間戳,約定信息中帶上時間戳。使用時間戳避免重放攻擊要保證發送者和接受者的時鐘必須一致,但考慮到網絡延遲,必須在時間的判斷上留下緩衝,因此仍有可以進行重放攻擊的時間。
  • 隨機數 nonce,每次傳遞前,先發送隨機數 nonce,通信時再將隨機數包含在消息中並計算MAC值,基於此將無法進行重放。

三、數字簽名、數字證書——防止“事後否認”,兼顧“假冒”與“篡改”

(1)數字簽名

消息驗證碼之所以無法解決事後否認的問題,是因爲其採用的是對稱加密算法(因爲密鑰是共享的,接收者存在僞造發送者信息之可能,因此發送者可以事後否認信息的真實性。),採用非對稱加密的消息認證碼的技術,就是數字簽名。

在非對稱加密中,私鑰用來解密,公鑰用來加密。
在數字簽名技術中,私鑰用來加密,公鑰用來解密。

在這裏插入圖片描述
上圖向大家展示了數字簽名及驗證流程:

  1. 簽名方 A 生成非對稱公私鑰對 公鑰A、私鑰A;
  2. A 向消息接收方 B 發送公鑰A;
  3. A 使用私鑰A對消息加密(一般是對消息的散列值進行加密,防止因數據量過大或非對稱加密效率低下特徵導致簽名時間過長等問題),生成數字簽名;
  4. A 將消息與數字簽名發往 B;
  5. 接收方B通過公鑰解密數字簽名;
  6. 驗證簽名,即比對Hash值,如相等,大概率(存在Hash碰撞)表明數據未被篡改。

用更爲歸納性的語言表述,即先計算消息的散列值,再對散列值進行私鑰加密,得到的即爲簽名,簽名人將消息和簽名發送,接收方用公鑰對簽名進行解密並做驗證(只要接收方B能夠用A的公鑰解密數字簽名,就代表該簽名是A簽署的,因爲公鑰A只能解鎖由A保管的私鑰A簽寫的簽名)。

當然數字簽名的方式也有兩種:

  • 明文簽名:不對消息進行加密,只對消息進行簽名,主要用於發佈消息。
  • 密文簽名:對消息進行加密和簽名。

數字簽名不僅能夠防止A的事後否認,同樣能夠防止數據的假冒與篡改。但需要注意的是,數字簽名仍然存在問題:

數字簽名由於採用了非對稱加密算法,儘管能夠防止否認,但發送方卻不能知道所收到的公鑰是否是接收方私鑰所對應的公鑰,因此無法防止中間人攻擊

僞造公鑰是中間人攻擊中重要的一環。之所以能夠僞造,是因爲消息發送方無法確認公鑰的身份問題。如下圖所示,如果公鑰A被中間人C所劫持,替換成自己的公鑰C,接受者B採用了攻擊者C的公鑰,此後接收了攻擊者私鑰簽名的信息,公私鑰完全匹配,AB均無從發覺公鑰已被中間人C 僞造、篡改。
在這裏插入圖片描述

(2)數字證書

對數字簽名所發佈的公鑰進行權威的認證,便是證書。公鑰證書記錄個人信息及個人公鑰,並由認證機構施加數字簽名。數字證書能夠有效避免中間人攻擊的問題。

爲實現不同成員在不見面的情況下進行安全通信,公鑰基礎設施(PKI)當前採用的模型是基於可信的第三方機構,也就是證書頒發機構(CA)簽發的證書。PKI是爲了能夠有效的運用公鑰而制定的一系列規範和規格的總稱(並非某單一規範)。其組成包括用戶、認證機構(CA)、證書倉庫。其中證書頒發機構(CA)是指我們都信任的證書頒發機構,它會在確認申請用戶的身份之後簽發證書。同時CA會在線提供其所簽發證書的最新吊銷信息(CRL,證書作廢清單),用戶要定期查詢認證機構最新的CRL,確認證書是否失效。

在這裏插入圖片描述
上圖向大家展示了數字證書的生成及驗證流程:

  1. A 生成公私鑰對;
  2. A 向認證中心CA註冊自己的公鑰A(該步驟只在第一次註冊時存在);
  3. 認證中心CA用自己的私鑰(私鑰CA)對A的公鑰(公鑰A)施加數字簽名並生成數字證書;
  4. B得到帶有認證機構CA的數字簽名的A的公鑰(證書);
  5. B使用認證機構CA的公開公鑰(公鑰CA)驗證數字簽名,確認公鑰A的合法性。

對於認證機構的公鑰,一般由其它的認證機構施加數字簽名,從而對認證機構的公鑰進行驗證,即生成一張認證機構的公鑰證書,這樣的關係可以迭代好幾層,以杜絕中間人假冒認證機構CA。最高一層的認證機構被稱爲根CA,RCA會對自己的公鑰進行數字簽名,即自簽名,也會在RCA間互相簽名。

這與https加密傳輸原理是一致的。以CSDN站點爲例,我們先從CSDN的證書中拿到CSDN的公鑰,對我們本地生成的對稱加密密鑰進行加密,此後發送給CSDN,CSDN用其私鑰解密獲得我們的對稱加密密鑰,此時本地計算機與CSDN就擁有相同的對稱密鑰,此後用對稱加密和消息認證碼、數字簽名來防止信息傳輸中的竊聽、假冒、篡改以及事後否認。
在這裏插入圖片描述


密碼學是一門非常有趣的學科,它與計算機科學、數學以及電子工程都存在交叉。隨着密碼學日新月異地取得發展,人們現在已經很難跟上它的發展步伐。密碼學領域的理論基礎在過去的30餘年裏已經得到加強和鞏固:現在,人們對安全的定義和證明結構安全的方法有了更深入的認識。同時,我們也見證了應用密碼學的快速發展:舊算法不斷地被破解和拋棄,同時,新算法和協議也在不斷湧現。

之所以寫這篇文章,是爲了能夠以最通俗易懂的方式幫助大家快速瞭解現代加密方案的工作原理。但由於拋開了微積分等必要的數學概念以及個人知識理解的侷限性,所以,難免在相關問題的表述上略顯稚嫩,供期望更深入理解現代密碼學的讀者以參考借鑑,也歡迎大家的批評交流。

本文簡單梳理了實際應用中使用的部分加密算法,其實還有加密協議、運作模式、安全服務和密鑰建立技術等內容未展開論述,我們之後有機會再談。


如果您有任何疑問或者好的建議,期待你的留言與評論!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章