密碼學 - 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
8CK_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)兩大類。
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_KDF
、CKD_SHA224_KDF
、CKD_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_SUPPORTED
或 CKR_DOMAIN_PARAMS_INVALID
等錯誤,確保跨裝置的互通性。
參考資料
本文件內容主要參考以下 PKCS #11 密碼學權杖介面標準:
- PKCS #11 V2.40 Cryptographic Token Interface Standard (OASIS Standard)
- PKCS #11 V2.20 Cryptographic Token Interface Standard