密碼學 - PKCS#11 Key Agreement

PKCS#11 是一套由 RSA Laboratories 發布的標準化密碼學權杖介面(Cryptographic Token Interface Standard),現由 OASIS 組織維護。它旨在提供一個通用的應用程式介面(API),讓軟體應用程式能夠與各種密碼學硬體(如硬體安全模組 HSM、智慧卡)進行互動,而無需關心底層硬體的實作細節。

在眾多功能中,金鑰協議(Key Agreement)是一個核心的安全操作,它允許多個參與方基於各自的私鑰與對方的公鑰,在不安全的通道上安全地協商並產生一個共享的秘密金鑰。這個共享金鑰後續可用於對稱加密、訊息驗證碼(MAC)的產生等操作。

本文將探討 PKCS#11 中的金鑰協議機制,特別是如何使用 C_DeriveKey 函式來實現金鑰派生,以及相關的機制參數設定。

核心操作:C_DeriveKey

在 PKCS#11 標準中,執行金鑰協議與後續金鑰派生的核心函式為 C_DeriveKey。此函式透過指定的機制,使用一方的私鑰(作為基礎金鑰)與另一方的公開資訊來派生出一個共享的秘密金鑰。

其函式原型大致如下:

1
2
3
4
5
6
7
8
CK_RV C_DeriveKey(  
CK_SESSION_HANDLE hSession,
CK_MECHANISM_PTR pMechanism,
CK_OBJECT_HANDLE hBaseKey,
CK_ATTRIBUTE_PTR pTemplate,
CK_ULONG ulAttributeCount,
CK_OBJECT_HANDLE_PTR phKey
);
  • hSession: 會話控制代碼。
  • pMechanism: 指向金鑰協議機制的指標。
  • hBaseKey: 本地私鑰的控制代碼。
  • pTemplate: 新產生金鑰的屬性樣板。
  • phKey: 返回新產生金鑰的控制代碼。

支援的金鑰協議機制

PKCS#11 標準定義了多種金鑰協議機制,主要可以分為 Diffie-Hellman(DH)和其基於橢圓曲線的變體 Elliptic Curve Diffie-Hellman(ECDH)兩大類。index image

Diffie-Hellman (DH) 機制

  • CKM_DH_PKCS_DERIVE: 基於 PKCS #3 的標準 DH 金鑰派生。
  • CKM_X9_42_DH_DERIVE: 基於 ANSI X9.42 標準的 DH 金鑰派生。
  • CKM_X9_42_DH_HYBRID_DERIVE
  • CKM_X9_42_MQV_DERIVE: MQV (Menezes-Qu-Vanstone) 協議,提供更高的安全性。
  • CKM_KEA_KEY_DERIVE

Elliptic Curve Diffie-Hellman (ECDH) 機制

  • CKM_ECDH1_DERIVE: 標準的 ECDH 金鑰派生。
  • CKM_ECDH1_COFACTOR_DERIVE: 考慮了協因子的 ECDH 派生,可抵抗某些特定攻擊。
  • CKM_ECMQV_DERIVE: 基於橢圓曲線的 MQV 協議。

金鑰協議的參數設定

執行 C_DeriveKey 時,需要精心設定兩類主要的參數:定義新金鑰屬性的秘密金鑰樣板,以及定義協議細節的機制參數

1. 秘密金鑰樣板 (Secret Key Template)

派生出的新金鑰屬性將由一個屬性樣板(Attribute Template)決定,其中包含:

  • CKA_CLASS: 定義物件類別,此處應為 CKO_SECRET_KEY(秘密金鑰)。
  • CKA_KEY_TYPE: 指定金鑰類型,例如 CKK_GENERIC_SECRET(通用秘密金鑰)或特定演算法的金鑰類型(如 CKK_AES)。
  • CKA_TOKEN: 一個布林值,指示金鑰是否為權杖物件(永久儲存於硬體中)。若設為 CK_FALSE,則代表僅為會話物件,會話結束後即銷毀。
  • CKA_LABEL: 金鑰的標籤,可自訂,如 DERIVED_SESSION_KEY
  • CKA_VALUE_LEN: 金鑰的長度(以位元組為單位),其數值需符合硬體與演算法的限制。

2. 機制參數 (Mechanism Parameters)

機制參數是 CK_MECHANISM 結構的一部分,用於傳遞協議所需的特定資訊:

  • 對方公鑰 (Public Value): 這是另一方的公鑰,是金鑰協議的核心輸入。
    對於 ECDH,公鑰的格式需要特別注意,可能是原始(RAW)、點(ECPoint)或壓縮格式(Compressed),雙方必須對格式有一致的約定。
  • 共享資料 (SharedData / UKM): 指在金鑰協議雙方之間共享的額外資訊,可選。
    這些資訊會被納入金鑰派生過程,以確保金鑰的唯一性。
  • 金鑰派生函式 (KDF): 用於從原始的共享秘密值中派生出最終金鑰的函式。

金鑰派生函式 (Key Derivation Function - KDF)

KDF 在金鑰協議中扮演著後處理的角色,它將 DH 或 ECDH 協議產生的原始共享秘密(通常是一個數字)轉換成具有良好密碼學特性的、特定長度的加密金鑰。

PKCS#11 支援多種 KDF,例如:

  • CKD_NULL: 不進行任何派生,直接使用原始共享秘密作為金鑰(需注意長度與格式)。
  • 基於 SHA 雜湊演算法的 KDF:CKD_SHA1_KDFCKD_SHA224_KDFCKD_SHA256_KDF 等。
  • CKD_SHA1_KDF_ASN1 / CKD_SHA1_KDF_CONCATENATE: 基於特定格式的 KDF。

查詢裝置支援的機制

在開發應用程式時,了解目標硬體支援哪些機制至關重要。PKCS#11 提供了相應的查詢功能:

  • C_GetMechanismList(): 列出裝置支援的所有機制的 ID。
  • C_GetMechanismInfo(): 取得特定機制的詳細資訊,如金鑰長度限制(ulMinKeySize, ulMaxKeySize)及支援的操作旗標(Flags)。

旗標(Flags)說明了該機制的能力,例如 CKF_DERIVE(支援金鑰派生)、CKF_EC_F_P(支援質數體曲線)、CKF_EC_NAMEDCURVE(支援命名曲線)等。正確解析這些旗標有助於避免因使用不支援的參數而導致的 CKR_CURVE_NOT_SUPPORTEDCKR_DOMAIN_PARAMS_INVALID 等錯誤,確保跨裝置的互通性。

參考資料

本文件內容主要參考以下 PKCS #11 密碼學權杖介面標準:

  • PKCS #11 V2.40 Cryptographic Token Interface Standard (OASIS Standard)
  • PKCS #11 V2.20 Cryptographic Token Interface Standard

也許你也會想看看