Diffie-Hellman 第 3 版公鑰 BLOB
Diffie-Hellman 第 3 版公鑰 BLOB (類型 PUBLICKEYBLOB)可用來匯出和匯入 DH 公鑰的相關信息。 格式如下:
BLOBHEADER blobheader;
// As explained under "Data Structures"
DHPUBKEY_VER3 dhpubkeyver3;
BYTE p[dhpubkeyver3.bitlenP/8];
// Where P is the prime modulus
BYTE q[dhpubkeyver3.bitlenQ/8];
// Where Q is a large factor of P-1
BYTE g[dhpubkeyver3.bitlenP/8];
// Where G is the generator parameter
BYTE j[dhpubkeyver3.bitlenJ/8];
// Where J is (P-1)/Q
BYTE y[dhpubkeyver3.bitlenP/8];
// Where Y is (G^X) mod P
當CRYPT_BLOB_VER3旗標搭配 CryptExportKey 使用時,就會匯出此 BLOB 格式。 因為版本位於 BLOB 中,因此在搭配 CryptImportKey 使用此 BLOB 時不需要指定旗標。
此外,當 dwParam 值KP_PUB_PARAMS用來在 DH 金鑰上設定金鑰參數時,此 BLOB 格式會與 CryptSetKeyParam 函式搭配使用。 當CRYPT_PREGEN旗標用來產生索引鍵時,就會完成此動作。 在此情況下,會忽略 y 值,因此不應包含在 BLOB 中。
下表描述金鑰 BLOB 的每個元件。
欄位 | 描述 |
---|---|
blobheader | BLOBHEADER 結構。 bType 成員必須具有 PUBLICKEYBLOB 的值。 |
dhpubkeyver3 | DHPUBKEY_VER3結構。 magic 成員應該設定為公鑰0x33484400。 請注意,十六進位值只是 “DH3” 的 ASCII 編碼方式。 |
P | P 值直接位於DHPUBKEY_VER3結構之後,而且應該一律是DHPUBKEY_VER3 bitlenP 欄位的長度(P 的位長度)除以八個(小尾格式)。 |
Q | Q 值直接位於 P 值之後,而且應該一律是DHPUBKEY_VER3 bitlenQ 欄位的長度除以八個(小尾格式)。 如果 bitlenQ 值為 0,則值不存在於 BLOB 中。 |
G | G 值位於 Q 值後面,而且一律應該是DHPUBKEY_VER3 bitlenP 欄位的長度(P 的位長度)除以 8。 如果數據的長度比 P 短一或多個字節除以 8,數據必須以必要的位元組(零值)填補,讓數據成為所需的長度(小端 格式)。 |
J | J 值直接位於 G 值後面,而且應該一律是DHPUBKEY_VER3 bitlenJ 欄位的長度除以八個(小尾格式)。 如果 bitlenQ 值為 0,則值不存在於 BLOB 中。 |
Y | Y 值 (G^X) mod P 位於 J 值後面,且一律應為 DHPUBKEY_VER3 bitlenP 字段的位元組長度(P 的位長度)除以 8。 如果計算產生的數據長度 (G^X) mod P 比 P 短一或多個字節除以 8,則必須以必要的位元組(零值)填補數據,讓數據成為所需的長度(小到尾 格式)。 當此結構搭配 CryptSetKeyParam 搭配 dwParam 值KP_PUB_PARAMS使用時,BLOB 中不會包含此值。 |
注意
公鑰 BLOB 不會加密,但會以純文字形式包含公鑰。