密碼學將數學原語套用於機密性、完整性、對等端驗證與不可否認性等安全目標。安全的原語本身不會使協定安全,因為編碼、金鑰管理、隨機性、狀態與攻擊者能力也會決定結果。
位元、XOR 與模算術 #
密碼學規格會對精確大小的位元字串與位元組字串運作。互斥或是模二加法:
a | b | a XOR b |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
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 為基礎的模式會限制單一金鑰處理的訊息數量與總大小。系統必須強制執行這些使用限制,而不是假設僅憑大型金鑰就能安全地無限制使用。
一次性密碼本與串流密碼 #
對等長字串,一次性密碼本計算如下:
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 產生,以及驗證規則。簽章不是「使用私密金鑰的加密」,而簽章驗證也不會使不受信任的公開金鑰變得真實。
從威脅模型開始 #
只有先陳述安全邊界後,才選擇原語:
- 識別受保護資產,以及是否需要機密性、完整性、對等端驗證、重放抗性或前向保密。
- 識別攻擊者能力,包括觀察、主動修改、選擇輸入、端點入侵、側通道、回滾與阻斷服務。
- 定義信任錨點、金鑰擁有權、金鑰輪替、入侵復原與已驗證的中繼資料。
- 選擇安全屬性符合這些要求的標準化協定與維護中實作。
TLS 可以保護傳輸中的資料,但遭入侵的端點、授權錯誤與應用程式層級重放仍在其邊界之外。簽章可以證明某金鑰授權訊息,卻不能說明該金鑰是否應受信任。明確的邊界可避免將一項屬性誤認為另一項。
OpenSSH randomart 說明相同區別。它是公開金鑰指紋的視覺呈現,不是已驗證的身分證明。請透過獨立驗證的通道比較完整指紋。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)