密碼學基礎

最後更新: 2026-09-03 15:56:39 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

密碼學將數學原語套用於機密性、完整性、對等端驗證與不可否認性等安全目標。安全的原語本身不會使協定安全,因為編碼、金鑰管理、隨機性、狀態與攻擊者能力也會決定結果。

位元、XOR 與模算術 #

密碼學規格會對精確大小的位元字串與位元組字串運作。互斥或是模二加法:

aba XOR b
000
011
101
110

XOR 具結合律、交換律與自反性,因此 (message XOR mask) XOR mask = message。這些恆等式說明串流密碼如何套用與移除金鑰串流,但不蘊含安全性:重複使用遮罩會暴露明文之間的關係。

模算術將整數分組為同餘類別。記號 a ≡ b (mod n) 表示 n 整除 a - b。加法與乘法仍留在這些類別內。整數 a 在模 n 下恰好具有乘法反元素,當且僅當 gcd(a, n) = 1;擴展歐幾里得演算法可找到該反元素。

質數模數產生有限域,其中每個非零元素都可逆。其他公開金鑰系統則在精心選取的有限群上運作,包括橢圓曲線群。實作必須使用所選標準定義的群、編碼、驗證與子群規則,而不要將任意整數或點視為有效金鑰。

機率與安全參數 #

密碼學保證具有機率性並由參數化。若祕密從 2^k 種可能性中均勻取樣,窮舉搜尋平均需要約 2^(k-1) 次猜測。理想的 n 位元雜湊需要約 2^n 的前像工作量,但碰撞只需 2^(n/2) 的工作量,因為生日界限。

安全參數表示預期工作因子,而不是每個物件的位元數。256 位元橢圓曲線群可以設定約 128 位元的古典安全性目標,而 256 位元雜湊則設定 256 位元前像抗性與 128 位元碰撞抗性。專用演算法攻擊、量子攻擊模型、實作洩漏、弱隨機產生與金鑰生命週期都可能降低有效強度。因此參數選擇必須遵循協定標準與目前的金鑰管理指引。

機率也控制失敗限制。驗證標籤可能以某個有界機率被偽造,而以 nonce 為基礎的模式會限制單一金鑰處理的訊息數量與總大小。系統必須強制執行這些使用限制,而不是假設僅憑大型金鑰就能安全地無限制使用。

一次性密碼本與串流密碼 #

對等長字串,一次性密碼本計算如下:

text
ciphertext = plaintext XOR pad
plaintext  = ciphertext XOR pad

只有在密碼本均勻隨機、保持祕密、至少與明文等長,且整體或部分都不重複使用時,才具資訊理論上的保密性。重複使用密碼本會得到 ciphertext1 XOR ciphertext2 = plaintext1 XOR plaintext2,即使一開始不知道任何明文,也會洩漏結構。安全地產生、分發與銷毀密碼本,使此建構對大多數軟體系統不切實際。

串流密碼以由精簡祕密金鑰與 nonce 衍生的偽隨機金鑰串流,取代真正隨機的密碼本。Nonce 通常可公開,但其唯一性要求是必要的。在同一個 ChaCha20-Poly1305 金鑰下重複 nonce,會重複 ChaCha20 金鑰串流,也會重複一次性驗證金鑰。AES-GCM 同樣會在 nonce 重複後失去強機密性與驗證保證。請使用會管理或驗證 nonce 的函式庫 API,並在模式的訊息或資料限制前輪替金鑰。

附加資料驗證加密 #

單獨加密無法偵測修改。附加資料驗證加密(AEAD)方案會回傳密文與驗證標籤,同時驗證:

  • 明文,保持機密;
  • 附加資料,保持可見但不能在不被察覺的情況下變更;以及
  • 方案要求的 nonce 與演算法輸入。

當中介者必須讀取標頭時,協定版本、記錄序號、租戶識別碼或路由欄位可以作為附加資料。兩個端點必須序列化完全相同的附加資料,因為差異會使標籤驗證失敗。

請透過維護中的密碼學函式庫使用標準 AEAD,例如 AES-GCM 或 ChaCha20-Poly1305。接收者不得釋出或處理未驗證的明文。標籤失敗是驗證失敗;重試、記錄與錯誤回應不得揭露部分明文或區分有用的內部失敗狀態。附加在密文後的未設金鑰摘要不提供這種保護。

雜湊、MAC 與金鑰衍生 #

外觀相近的原語具有不同用途:

原語祕密輸入主要用途
密碼學雜湊無穩定摘要、承諾元件或協定定義的轉錄雜湊
訊息驗證碼(MAC)共用金鑰金鑰持有者之間的完整性與來源驗證
金鑰衍生函式(KDF)祕密金鑰材料產生具有必要長度且繫結上下文的金鑰
密碼雜湊函式密碼與 salt使離線密碼猜測成本高昂

單純雜湊不能驗證資料,因為替換訊息的攻擊者可以計算新的摘要。HMAC 是標準化的 MAC 建構;不要以 hash(key || message) 取代它。HKDF 首先從輸入金鑰材料擷取固定長度的偽隨機金鑰,然後將它擴展為繫結上下文的輸出。其 salt 與 info 輸入不是密碼,且與密碼雜湊每個帳戶的隨機 salt 具有不同用途。

KDF 上下文標籤依協定、版本、方向、角色與用途分離金鑰。例如,加密金鑰與 MAC 金鑰不能僅因都來自一個共用祕密就使用相同位元組。請遵循外層協定定義的標籤與編碼,因為模糊的串接會破壞這種分離。

非對稱金鑰建立與簽章 #

Diffie-Hellman 與橢圓曲線 Diffie-Hellman 讓兩方在可觀察通道上推導共用祕密。純粹的 Diffie-Hellman 不會驗證任一方:主動攻擊者可以分別與兩個端點協商一個祕密。完整協定會將交換轉錄繫結至憑證、預先共用金鑰或先前驗證的公開金鑰,然後使用 KDF 衍生流量金鑰。

金鑰封裝機制(KEM)會為接收者的公開金鑰產生共用祕密與封裝。密碼學遷移期間,協定可以結合獨立安全的元件,但組合方式及其 KDF 必須來自經審查的協定規格。公開金鑰加密不能與金鑰協議或 KEM 互換。

數位簽章將私密簽署作業繫結至訊息,並允許使用公開金鑰驗證。Ed25519、ECDSA 與 RSA-PSS 等演算法定義訊息格式、雜湊、隨機性或確定性 nonce 產生,以及驗證規則。簽章不是「使用私密金鑰的加密」,而簽章驗證也不會使不受信任的公開金鑰變得真實。

從威脅模型開始 #

只有先陳述安全邊界後,才選擇原語:

  1. 識別受保護資產,以及是否需要機密性、完整性、對等端驗證、重放抗性或前向保密。
  2. 識別攻擊者能力,包括觀察、主動修改、選擇輸入、端點入侵、側通道、回滾與阻斷服務。
  3. 定義信任錨點、金鑰擁有權、金鑰輪替、入侵復原與已驗證的中繼資料。
  4. 選擇安全屬性符合這些要求的標準化協定與維護中實作。

TLS 可以保護傳輸中的資料,但遭入侵的端點、授權錯誤與應用程式層級重放仍在其邊界之外。簽章可以證明某金鑰授權訊息,卻不能說明該金鑰是否應受信任。明確的邊界可避免將一項屬性誤認為另一項。

OpenSSH randomart 說明相同區別。它是公開金鑰指紋的視覺呈現,不是已驗證的身分證明。請透過獨立驗證的通道比較完整指紋。

參考資料 #

評論

在 GitHub 上閱讀或評論(發表評論需要登入)