加密是密碼學的主要應用:它讓資料變得無法理解,以確保機密性。加密使用一個稱為密碼(cipher)的演算法,以及一個稱為金鑰(key)的秘密值;若不知道秘密金鑰,你就無法解密,也學不到加密訊息的任何一個位元資訊——任何攻擊者亦然。

本章聚焦於對稱加密:解密用的金鑰與加密用的金鑰相同。路線是從最弱的形式(只擋得住最不識字之攻擊者的古典密碼)出發,一路走到永遠安全的最強形式。

本章脈絡#

  1. 基本概念——明文、密文、加密與解密這兩個函式。
  2. 古典密碼——凱撒與維吉尼亞密碼,以及它們如何被破解。
  3. 密碼如何運作——把密碼拆成「置換」與「運作模式」兩個元件,並解釋古典密碼為何註定不安全。
  4. 完美加密:一次性密碼本——唯一達成完美保密的密碼,以及它為何不實用。
  5. 加密安全性——攻擊模型、安全目標,以及兩者組合出的安全概念(IND-CPA 等)。
  6. 非對稱式加密——公鑰與私鑰。
  7. 當密碼不只做加密——AE、FPE、FHE、可搜尋加密、可調整加密。

常見錯誤#

加密演算法及其實作可能以許多方式無法保護機密性。原因可能是未能符合安全需求(例如「要達到 IND-CPA 安全」),也可能是設定的需求不符現實(例如你只以 IND-CPA 安全為目標,但攻擊者實際上能執行選擇密文查詢)。

遺憾的是,許多工程師根本沒想過密碼學的安全需求,只是想要「安全」,卻不了解那到底意味著什麼。這通常就是災難的配方。

弱密碼#

第一個例子是可以用密碼分析技術攻破的密碼,2G 行動通訊標準就是如此。

2G 手機的加密使用一種稱為 A5/1 的密碼,結果證明它比預期的更弱,使得任何具備相應技能與工具的人都能攔截通話。電信業者不得不設法繞過這個問題。

話說回來,攻擊 A5/1 並不容易,研究人員花了十多年才提出有效的密碼分析方法。而且該攻擊是一種時間—記憶體權衡(TMTO,time-memory trade-off):先花上數天或數週進行計算以建立龐大的查找表,之後才用這些表來執行實際攻擊。以 A5/1 而言,預先計算的表超過 1TB。

2G 標準另外定義了 A5/2,供歐盟與美國以外的地區使用。A5/2 是刻意設計得更弱,以防止強加密被普遍使用。

3G 與 LTE 等後續行動加密標準指定了更強的密碼。但這不代表它們的加密不會被攻破——只代表它不會因為系統中的對稱密碼被破解而攻破。

錯誤的模型#

第二個例子是一個忽略了旁道的無效攻擊模型。

許多使用加密的通訊協定會確保自己採用在 CPA 或 CCA 模型下被認為安全的密碼。然而,有些攻擊既不需要 CPA 模型的加密查詢,也不需要 CCA 模型的解密查詢——它們只需要有效性查詢(validity queries),用來得知某個密文是否有效。這類查詢通常會被送到負責解密密文的系統。

填充預言機攻擊(padding oracle attacks)就是這樣的攻擊,攻擊者藉此得知密文是否符合要求的格式。

具體來說,在填充預言機攻擊中,一個密文只有在其明文具有正確的填充(padding,附加在明文後方以簡化加密的一串位元組)時才有效。填充不正確時解密會失敗,而攻擊者往往能偵測到解密失敗並加以利用——例如出現 Java 例外 javax.crypto.BadPaddingException,就表示觀察到了不正確的填充。

2010 年,研究人員在數個 Web 應用伺服器中發現了填充預言機攻擊。其有效性查詢就只是把一段密文送給某個系統、觀察它是否拋出錯誤。靠著這些查詢,他們在不知道金鑰的情況下解開了原本安全的密文

密碼學家常常忽略這類攻擊,因為它們通常取決於應用程式的行為、以及使用者能如何與應用互動。但若你在設計與部署密碼學時沒有預想到這類攻擊、沒有把它們納入模型,你可能會遇上很不愉快的意外。

延伸閱讀#

本書後續會更深入討論加密及其各種形式,尤其是現代安全密碼的運作方式。不過我們無法涵蓋一切,許多引人入勝的主題不會被討論到:

  • 想了解加密的理論基礎、更深入理解不可區分性(IND)的概念,應閱讀 1982 年提出語意安全概念的論文:Goldwasser 與 Micali 的〈Probabilistic Encryption and How to Play Mental Poker Keeping Secret All Partial Information〉。
  • 對實體攻擊與密碼學硬體有興趣的話,CHES 研討會的論文集是主要參考。
  • 加密的型態遠不止本章所列,還包括基於屬性的加密(attribute-based encryption)、廣播加密(broadcast encryption)、功能性加密(functional encryption)、基於身分的加密(identity-based encryption)、訊息鎖定加密(message-locked encryption)與代理重加密(proxy re-encryption)等。這些主題的最新研究可查閱密碼學論文電子檔案庫 https://eprint.iacr.org/