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 中,因此在将此 BLOBCryptImportKey 一起使用时无需指定标志。

此外,当 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)除以 8 的字节长度(little-endian 格式)。
Q Q 值直接位于 P 值之后,应始终是 DHPUBKEY_VER3 bitlenQ 字段除以 8 的字节长度(little-endian 格式)。 如果 bitlenQ 值为 0,则 BLOB 中不存在该值。
G G 值直接位于 Q 值之后,应始终是 DHPUBKEY_VER3 bitlenP 字段(位长度为 P)除以 8 的字节长度。 如果数据的长度比 P 除以 8 短一个或多个字节,则必须用必要的字节(零值)填充数据,以使数据达到所需长度(little-endian 格式)。
J J 值直接位于 G 值之后,应始终是 DHPUBKEY_VER3 bitlenJ 字段除以 8 的字节长度(little-endian 格式)。 如果 bitlenQ 值为 0,则 BLOB 中不存在该值。
Y Y 值 ((G^X) mod P) 直接位于 J 值之后,应始终是 DHPUBKEY_VER3 bitlenP 字段(位长度为 P)的长度除以 8 的字节长度。 如果计算 (G^X) mod P 生成的数据长度比 P 除以 8 短一个或多个字节,则必须用必要的字节(零值)填充数据,以使数据达到所需的长度(little-endian 格式)。 将此结构与 dwParam 值 KP_PUB_PARAMS 的 CryptSetKeyParam 一起使用时,BLOB 中不包含此值。

 

注意

公钥 BLOB 未加密,而是以纯文本形式包含公钥。