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

下表描述了 密钥 BLOB 的每个组件。

字段 说明
blobheader BLOBHEADER 结构。
dhprivkeyver3 DHPRIVKEY_VER3结构。 magic 成员应设置为私钥0x34484400。 请注意,十六进制值只是“DH4”的 ASCII 编码。
P P 值直接位于 DHPRIVKEY_VER3 结构之后,应始终是 DHPRIVKEY_VER3bitlenP 字段的长度(以字节为单位), (P) 的位长度除以 8 (little-endian 格式) 。
Q Q 值直接位于 P 值之后,应始终是 DHPRIVKEY_VER3bitlenQ 字段的长度(以字节为单位)除以 8 (little endian 格式) 。 如果 bitlenQ 值为 0,则 BLOB 中不存在该值。
G G 值直接位于 Q 值之后,应始终是 DHPRIVKEY_VER3bitlenP 字段的长度 (P) 除以 8 的位长度。 如果数据的长度比 P 除以 8 短一个或多个字节,则必须用零值) 的必要字节 (填充数据,使数据成为所需长度 (little endian 格式) 。
J J 值直接位于 G 值之后,应始终是 DHPRIVKEY_VER3bitlenJ 字段的长度(以字节为单位)除以 8 (little endian 格式) 。 如果 bitlenJ 值为 0,则 BLOB 中不存在该值。
Y Y 值( (G^X) mod P)直接位于 J 值之后,应始终是 DHPRIVKEY_VER3bitlenP 字段的长度 (P) 的位长度除以 8。 如果 (G^X) mod P 计算得出的数据长度比 P 除以 8 短一个或多个字节,则必须用零值) 的必要字节 (填充数据,使数据成为所需的长度 (little endian 格式) 。
x X 值是一个随机大整数,因此 DH 密钥对的公共部分 Y 等于:Y = (G^X) mod P

 

调用 CryptExportKey 时,开发人员可以选择是否对密钥进行加密密钥。 如果 hExpKey 参数包含会话密钥的有效句柄,则会加密密钥。 除了 BLOB 的 BLOBHEADER 部分,所有内容都已加密。 请注意,加密算法和加密密钥参数不随 私钥 BLOB 一起存储。 应用程序必须管理和存储此信息。 如果为 hExpKey 传递零,则将在不加密的情况下导出私钥。

注意

导出没有加密的私钥很危险,因为它们容易受到未经授权的实体的拦截和使用。