那些關於SSL/TLS的二三事(八) — 加密演算法簡介

Carl
12 min readMay 9, 2018

--

這篇要談的是密碼學系統, 以做為接下來要講的SSL通訊機制的前置知識, 所謂的密碼學系統, 主要會有兩種操作:

  • 加密(encrypt)給定的明文(plain text)然後得到密文(cipher text)
  • 解密(decrypt)給定的密文並將其還原成原來的明文

這裡要提醒的是, 所謂的明文, 可以是任何的input, 不論是文件, 媒體檔案, 二進位檔案等都可以.

在開始談加密演算法之前, 有個簡單的原理可以先了解一下: Kerckhoffs’s principle(柯克霍夫原理).

其內容大概是這樣:

A cryptosystem should be secure even if the attacker knows all details about the system, with the exception of the secret key. In particular, the system should be secure when the attacker knows the encryption and decryption algorithms.

意思是說:

一個密碼系統只要金鑰(secret key)還沒被洩漏出去, 則無論此密碼系統的任何細節被人知道了, 其也應是安全的. 在實務面上, 儘管攻擊者知道密碼系統的加密/解密演算法, 這個系統也應是安全的.

基於以上原理, 只要你沒有洩漏金鑰, 攻擊者就沒辦法攻破你的系統. 那攻擊者要如何攻進你的系統呢? 方式有很多, 其中一種就是可以從你的通訊中攔截下來的密文去嘗試各種的password組合. 一旦成功解密了那段密文, 就等於password被知道了, 如此一來密文的其他部分也可能被解開來, 進而洩漏出想保密的資訊. 所以, 對一個強健的加密演算法來說, 其應該要讓攻擊者的攻擊難度提高, 或是說讓對方在實務上不可行(例如嘗試所有組合). 以現代常用的演算法來說, 幾乎都已經強大到儘管攻擊者有上千的CPU一起進行破解作業, 也都需要耗費以年為單位的時間才有可能得到正確結果了, 這就是一種實務上不可行的例子.

以下兩張表格簡單地描述了一下各種不同的加密演算法的強度. 其中比較重要的一個因子就是金鑰長度, 通常越長越安全(當然這是有代價的).

Symmetric/Private Key Algorithms at a glance
Asymmetric/Public Key Algorithms at a glance

第一張表格主要在講對稱式加密演算法, 可以看到對於不同長度的金鑰來說, 破解時間與其成正比成長.

第二張表格主要針對非對稱式加密演算法, 比較各個不同的非對稱金鑰演算法家族. 跟對稱式相比, 非對稱式所需要的金鑰長度又更長了, 不過橢圓曲線演算法的長度要求卻是當中相較短的.

接下來會談到的加密演算法機制主要有三種:

  • Private/Symmetric key encryption algorithms
  • Public/Asymmetric key encryption algorithms
  • Hashing algorithms

Private/Symmetric Key Encryption Algorithms

對稱式加密, 又稱為私鑰加密. 其之所以稱為私鑰加密是因為事實上在這種加/解密過程中, 從頭到尾都只有一把金鑰參與其中, 且此金鑰僅有參與安全溝通的參與者知道(當然, 也可能使用兩個可以簡單地互相推算的金鑰). 至於金鑰的交換, 可能可以透過mail, 口耳相傳, 透過訊息或是任何其他可信任的金鑰交換機制.

比較常聽到的對稱加密演算法如: DES, 3DES, AES. 這些基本上都比非對稱式加密要來得快, 以下圖來說, 通訊的雙方都需要知道接下來要用在通訊過程中的金鑰. 一旦雙方都具備金鑰了, sender(Alice)就可以透過這把金鑰對明文進行加密然後寄給receiver(Bob). Receiver收到密文後, 就可以用同一把金鑰進行解密, 然後得到原來的明文.

Overview of Private/Symmetric Key Encryption Algorithms

AES(Advanced Encryption Standard)

AES是對稱式加密中較為流行且安全的演算法. NIST(National Institutes for Standards and Technology)於2001年11月份發布於FIPS PUB(The Federal Information Processing Standard Publication) 197, 然後於2002年5月26成為有效的標準. 到了2006年, AES已經成為對稱式加密中最流行的演算法之一.

此演算法是對稱加密家族中的區塊加密(Block Ciphers)的其中一種. 其基於Rijndael演算法衍生而來. 對於區塊加密來說, 其可以有很多不同的工作模式. 這些工作模式也是隨著時間演進而來的, 在使用上, 必須根據輸入資料與應用程式的性質來選擇不同的模式. 以下就列出比較常見的模式:

  • Electronic Codebook (ECB)
  • Cipher Block Chaining (CBC)
  • Output Feedback (OFB)
  • Counter (CTR)
  • Galois/Counter Mode (GCM) — Recommended over others

對AES來說, 其區塊的長度固定為128 bits, 而金鑰長度則可以是128/192/256 bits. 至於Rijndael演算法, 其區塊與金鑰的長度均可以為128/192/256 bits. 加密過程中的金鑰是由Rijndael演算法的金鑰生成方案產生的.

因為這邊只是要簡單地介紹各種演算法, 所以就不在這邊紀錄block cipher的運作原理了, 之後會再找時間補寫一篇.

Public/Asymmetric Key Encryption Algorithms

公開金鑰加密演算法, 又稱為非對稱式加密演算法, 是SSL的骨幹技術之一, 也是構成PKI(Public Key Infrastructure)的重要元素之一. 對於想要透過非對稱式加密來確保通訊安全的使用者來說, 首先要做的就是建立一對金鑰, 一個public key(公鑰)與一個private key(私鑰). 公鑰是可以對全世界公開的, 而私鑰則只有自己可以知道. 在基於非對稱式加密保護的溝通中, 任何個體都擁有自己的私鑰, 並且同時擁有其他個體的公鑰(所以金鑰管理在這就變成一個很大的問題).

至於被稱為非對稱式加密的原因, 是因為加密/解密使用的金鑰是不同的. 若使用私鑰加密, 則只能用相應的公鑰來解密; 反之亦然. 至於要用哪一把金鑰來加密, 則視目的而定, 所謂的目的, 通常會有兩種, 保密性(confidentiality)與認證(authentication). 簡單的使用情境示意圖如下:

Overview of Public/Asymmetric Key Encryption Algorithms

保密性(confidentiality)
舉個例子, 若你想要送出一個加密後的訊息給特定的接受者並且讓特定的接受者可以讀取這些加密過的訊息, 那就使用這些接受者的公鑰來加密. 如此一來, 這些訊息就只有持有該公鑰相對應的私鑰之接受者本人有辦法解讀了. 這種情境是為了達到保密性(confidentiality)的目的.

認證(authentication)
這種情境通常就是指所謂的數位簽章. 要產生數位簽章, 可以使用私鑰進行加密, 而後其他人可以用相應的公鑰來進行驗證. 此情境的目的就是認證(authentication). 任何人都應該要能夠驗證收到的訊息是真正被寄送者簽章過並且送出的.

RSA與DSA是公鑰加密演算法中能見度比較高的演算法. 其中, RSA在業界或是生活上算是最常見的一種, 其被應用在SSL, SSH, IPSec等等. DSA則是在數位簽章中比較常見.

非對稱式演算法基本上是比對稱式演算法要來得慢的, 因為其在數學運算上的處理會更為龐大. 其背後需要解決的數學問題的複雜度是具有一定難度的, 常見的主要數學問題如: 整數分解(又稱質因數分解), 離散演算法以及橢圓曲線.

RSA

RSA是非對稱式加密中最常見的演算法, 以其發明者的名字字首命名(Rivest, Shamir and Adleman). 此演算法是基於質因數分解問題的難度來建立其考靠性的. 換句話說, 對一個極大整數做因數分解的難度越高, 則RSA演算法的可靠度就越高. 若有人可以找到一種快速解決質因數分解問題的演算法的話, RSA的可靠度就會急速下降, 但目前這樣的可能性是很小的. 就當前的時間點來講, 只要金鑰夠長, 經由RSA加密後的訊息基本上是不太可能被破解的.

關於RSA, 這邊不會做更多介紹, 不過會簡單帶過其概念:

For three very large positive integers e, d and n such that with modular exponentiation for all integer m:

RSA decryption

And that even knowing e and n or even m it can be extremely difficult to find d. The public key is represented by the integers n and e; and, the private key, by the integer d.

RSA常被用於SSH, IPSec等地方, 其在加密與簽章的表現算是很出色的. 在效能上來講, RSA是比DSA來得慢的, 且對於金鑰交換機制來說, 也不是那麼的好.

Elliptic Curve Cryptography

除了RSA之外, 還有另一個常用的公開金鑰加密演算法: 橢圓曲線加密. 不同於RSA, 橢圓曲線加密是基於橢圓曲線數學來實現的, 主要是依賴於解決橢圓曲線離散對數的難題上.

橢圓曲線加密是當今已知最快的公開加密金鑰演算法, 其優勢之一是更低的計算耗能, 這也是為什麼橢圓曲線加密會是行動裝置上比較推薦的加密解決方案. 另一個優點是相較其它公開加密金鑰演算法, 橢圓曲線演算法的金鑰長度相對短了很多, 但仍然可以提供相當或是更高等的安全性.

Hashing Algorithms

Hash (雜湊演算法)是一種單向函式(one-way function), 其用來將不同長度的輸入轉換成固定長度的唯一字串, 用以作為輸入的唯一特徵值(digest). 此特徵值的長度取決於所使用的hash function之種類, 如:

  • MD5: 128 bits (16 bytes)
  • SHA1: 160 bits (20 bytes)
  • SHA2: 包含了 SHA-224/SHA-256/SHA-384/SHA-512 等, 其長度分別為 224 bits (28 bytes)/256 bits (32 bytes)/384 bits (48 bytes)/512 bits (64 bytes)

Hash function 之所以是單向的, 是因為輸出的特徵值沒辦法恢復成原來的輸入值. 每個輸出的特徵值基本上都是唯一的, 且只要輸入有些微的差異, 所產生的特徵值就有可能天差地遠. 所以hash value也可以用來確認訊息的完整性.

在hash演算法中, 比較常被探討的問題就是碰撞(Collision)了, 所謂的碰撞就是當兩個輸入產生了相同輸出的情況, 這會導致 hash 的目的被破壞. 若一個hash演算法的碰撞機率高的話, 就不應該採用.

在目前的時間點, 常見的hash演算法有以下幾種:

  • MD5: 由於不耐碰撞, 已不推薦使用(not collision resistant)
  • SHA1: 儘管這個演算法的碰撞機率不高, 但還是證實可被破解了, 所以很多系統也已經不再使用.
  • SHA2: 作為SHA1的替代解決方案.
  • SHA3: 新的雜湊演算法, 但並不是要用來取代SHA2的, 具有優異的速度表現.

目前, 幾乎所有的SSL憑證都提升到SHA2等級以上了, 主流的瀏覽器也將SHA1憑證註記為不安全的.

Hash Collision Demo

以下會透過簡單的範例來說明MD5 collision, 首先請先下載以下兩個檔案:

Commands for download demo files
Download demo files

然後可以分別使用以下三組指令來觀察不同的hash演算法所算出的結果:

Commands for calculate digests
Digest result for MD5 (collision)
Digest result for SHA1 (no collision)
Digest result for SHA2 (no collision)

很明顯地, MD5出現了碰撞, 而另外兩者則沒有(SHA256就是SHA2).

References

--

--

Carl

Stand for something or you will fall for anything.