密碼學 - Wrap Algorithms

在資訊安全的領域中,金鑰(Key)的管理是確保資料機密性與完整性的核心。然而,金鑰本身也需要被保護,尤其是在傳輸或儲存於不安全的環境中時。這就是「Wrap Algorithms」發揮作用的地方。

本文將深入淺出地介紹什麼是 Wrap Algorithms、其運作原理以及在密碼學標準中的應用。

什麼是 Wrap Algorithm?

Wrap Algorithm 是一種「金鑰認證加密演算法」(Key Authenticated Encryption Algorithm)。其主要目的,是利用一個已知的對稱金鑰(通常稱為 Key Encryption Key, KEK),去加密(包裹)另一個需要被保護的對稱金鑰或私鑰。

這個過程不僅僅是單純的加密,它還提供了驗證機制。當金鑰被「解包裹」(Unwrap)時,可以驗證其完整性與真實性,確保它在儲存或傳輸過程中未被竄改。這使得 Wrap 演算法成為在不安全環境中保護敏感金鑰的理想選擇。

目前業界廣泛採用的標準主要基於美國國家標準暨技術研究院(NIST)所制定的規範,並收錄於相關的 RFC(Request for Comments)文件中,例如:

  • RFC 3394: 定義了 AES Key Wrap (AESWrap)。
  • RFC 5649: 定義了 AES Key Wrap with Padding (AESWrap-Pad),使其能處理非固定長度的金鑰。index image

AES Wrap 演算法詳解

AES Wrap 是最核心且最常見的金鑰包裹演算法。其運作流程精巧,透過多次迭代的 AES 加密來確保安全性。

演算法步驟

根據文件,其演算法可簡化為以下步驟:

  1. 初始化:
    • 將要被加密的金鑰(明文)以 8 個位元組(64 bits)為單位,分割成 n 組,表示為 P[1]P[n]
    • 設定一個 64 位元的初始向量(Initialization Vector, IV),稱為 AP[0]。在標準中,這個 IV 是一個固定的值 0xA6A6A6A6A6A6A6A6
  2. 迭代加密:
    • 演算法會進行 6 次大的迴圈(j 從 0 到 5)。
    • 在每次大迴圈中,會依序處理每一個金鑰區塊(i 從 1 到 n)。
    • 在核心步驟中,會將當前的 64 位元 A 與 64 位元的金鑰區塊 P[i] 串接成一個 128 位元的區塊,並使用 KEK 進行 AES 加密。
    • 加密後的 128 位元結果會被拆分為兩半:
      • 高 64 位元會與一個計數器(t)進行 XOR 運算,其結果會更新為新的 A
      • 低 64 位元則會取代原本的金鑰區塊 P[i]
  3. 輸出:
    • 經過所有迭代後,最終的 A 會成為密文的第一個區塊(C[0]),而更新後的 P[1] 到 P[n] 則依序成為後續的密文區塊(C[1] 到 C[n])。

這個過程的示意圖如下,可以清楚看到資料如何在每次的 AES 加密中被混合與更新:

AES Wrap with Padding

原始的 AES Wrap 演算法要求被加密的金鑰長度必須是 64 位元的整數倍。為了解決這個限制,AES Wrap with Padding 應運而生。它允許包裹任意長度的金鑰,其主要差異在於:

  • 如果金鑰長度不是 64 位元的整數倍,會先進行填充(Padding)使其對齊。
  • 使用一個替代的初始向量(Alternative IV, AIV),這個 AIV 會包含訊息長度的資訊,以確保在解包裹時能正確移除填充。

在 PKCS#11 標準中的應用

PKCS#11 是一個廣泛應用於硬體安全模組(HSM)的標準 API。Wrap/Unwrap 機制是其核心功能之一。

  • 主要函式:
    • C_WrapKey: 使用指定的包裹金鑰(Wrapping Key)來加密另一個金鑰。
    • C_UnwrapKey: 使用解包裹金鑰(Unwrapping Key)將已加密的金鑰解密並還原為可在 HSM 中使用的金鑰物件。
  • 相關機制 (Mechanism):
    PKCS#11 定義了多種 Wrap 機制,例如:
    • CKM_AES_KEY_WRAP
    • CKM_AES_KEY_WRAP_PAD
    • CKM_RSA_PKCS (用於非對稱加密包裹)
    • CKM_RSA_PKCS_OAEP
  • 金鑰屬性 (Attribute):
    為了讓金鑰能被包裹或用於包裹,必須設定特定的屬性:
    • 用於包裹的金鑰(KEK)必須將 CKA_WRAP 屬性設為 CK_TRUE
    • 要被包裹的金鑰必須將 CKA_EXTRACTABLE 屬性設為 CK_TRUE,表示該金鑰可以被匯出(即使是以加密形式)。

結論

Wrap Algorithms 在現代密碼學系統中扮演著不可或缺的角色。它不僅僅是加密,更提供了一套經過驗證、標準化的流程來安全地傳輸與儲存金鑰。從 AES Wrap 的精巧設計到 PKCS#11 的標準化應用,都體現了其在確保金鑰生命週期安全方面的重要性,是構建安全系統時必須了解的關鍵技術。

參考資料

  • RFC 3394 - The AES Key Wrap Algorithm
  • RFC 5649 - The AES Key Wrap Algorithm with Padding

也許你也會想看看