共用方式為


Diffie-Hellman 第 3 版私鑰 BLOB

匯出 Diffie-Hellman 第 3 版私鑰 BLOB 時,其格式如下:

BLOBHEADER        blobheader;
DHPRIVKEY_VER3   dhprivkeyver3;
BYTE p[dhprivkeyver3.bitlenP/8]; 
            // Where P is the prime modulus
BYTE q[dhprivkeyver3.bitlenQ/8]; 
            // Where Q is a large factor of P-1
BYTE g[dhprivkeyver3.bitlenP/8]; 
            // Where G is the generator parameter
BYTE j[dhprivkeyver3.bitlenJ/8]; 
            // Where J is (P-1)/Q
BYTE y[dhprivkeyver3.bitlenP/8]; 
            // Where Y is (G^X) mod P
BYTE x[dhprivkeyver3.bitlenX/8]; 
            // Where X is the private exponent

當CRYPT_BLOB_VER3旗標搭配 CryptExportKey 使用時,就會匯出此 BLOB 格式。 因為版本位於 BLOB 中,因此在搭配 CryptImportKey 使用此 BLOB 時不需要指定旗標。

下表描述金鑰 BLOB 的每個元件

欄位 描述
blobheader BLOBHEADER 結構。
dhprivkeyver3 DHPRIVKEY_VER3結構。 magic 成員應該設定為私鑰的0x34484400。 請注意,十六進位值只是 “DH4” 的 ASCII 編碼方式。
P P 值直接位於DHPRIVKEY_VER3結構之後,而且應該一律是DHPRIVKEY_VER3 bitlenP 位元段的位元組長度(P 的位長度)除以八個(小尾格式)。
Q Q 值直接位於 P 值後面,而且一律為DHPRIVKEY_VER3 bitlenQ 欄位的長度除以八個(小尾格式)。 如果 bitlenQ 值為 0,則值不存在於 BLOB 中。
G G 值位於 Q 值後面,且一律為 DHPRIVKEY_VER3 bitlenP 欄位的位元組長度(P 的位長度)除以 8。 如果數據的長度比 P 短一或多個字節除以 8,數據必須以必要的位元組(零值)填補,讓數據成為所需的長度(小端 格式)。
J J 值直接位於 G 值之後,而且應該一律是DHPRIVKEY_VER3 bitlenJ 欄位的長度除以八個(小尾格式)。 如果 bitlenJ 值為 0,則 BLOB 中沒有該值。
Y Y 值 (G^X) mod P 位於 J 值後面,而且一律是 DHPRIVKEY_VER3 bitlenP 字段 (P 位長度) 除以 8 的位元組長度。 如果計算產生的數據長度 (G^X) mod P 比 P 短一或多個字節除以 8,則必須以必要的位元組(零值)填補數據,讓數據成為所需的長度(小到尾 格式)。
X X 值是隨機大整數,因此 DH 金鑰組 Y 的公用部分等於:Y = (G^X) mod P

 

呼叫 CryptExportKey 時,開發人員可以選擇是否要加密密鑰。 如果 hExpKey 參數包含工作階段金鑰的有效句柄,則會加密密鑰。 除了 BLOB 的 BLOBHEADER 部分,所有專案都會加密。 請注意,加密演算法和加密金鑰參數不會與 私鑰 BLOB 一起儲存。 應用程式必須管理和儲存此資訊。 如果 hExpKey 傳遞零,則會在不加密的情況下匯出私鑰。

注意

在沒有加密的情況下導出私鑰會很危險,因為它們隨後容易受到未經授權的實體的攔截和使用。