DSS 版本 3 公钥 BLOB

DSS 版本 3 PUBLICKEYBLOB 类型的公钥 BLOB 用于导出和导入有关 DH 公钥的信息。 它们采用以下格式:

BLOBHEADER blobheader; 
        // As explained under "Data Structures"
DSSPUBKEY_VER3 dsspubkeyver3;
BYTE p[dsspubkeyver3.bitlenP/8]; 
       // Where P is the prime modulus
BYTE q[dsspubkeyver3.bitlenQ/8]; 
       // Where Q is a large factor of P-1
BYTE g[dsspubkeyver3.bitlenP/8]; 
       // Where G is the generator parameter
BYTE j[dsspubkeyver3.bitlenJ/8]; 
       // Where J is (P-1)/Q
BYTE y[dsspubkeyver3.bitlenP/8]; 
       // Where Y is (G^X) mod P

当CRYPT_BLOB_VER3标志与 CryptExportKey 一起使用时,将导出此 BLOB 格式。 由于版本位于 BLOB 中,因此在将此 BLOB 与 CryptImportKey 一起使用时无需指定标志。

此外,当 dwParam 值KP_PUB_PARAMS用于设置 DSS 密钥上的键参数时,此 BLOB 格式与 CryptSetKeyParam 函数一起使用。 当已使用 CRYPT_PREGEN 标志生成密钥时,会执行此操作。 在这种情况下,y 值将被忽略,因此不应包含在 BLOB 中。

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

字段 说明
Blobheader BLOBHEADER 结构。 bType 成员的值必须为 PUBLICKEYBLOB。
Dsspubkeyver3 DSSPUBKEY_VER3结构。 magic 成员应设置为“DSS3”, (0x33535344) 公钥。 请注意,十六进制值只是“DSS3”的 ASCII 编码。
P P 值直接位于 DSSPUBKEY_VER3 结构之后,应始终是 P) (位长度除以八 (little-endian 格式) 的DSSPUBKEY_VER3 bitlenP 字段的长度(以字节为单位)。
Q Q 值直接位于 P 值之后,应始终是 DSSPUBKEY_VER3bitlenQ 成员的长度(以字节为单位)除以八 (little-endian 格式) 。
G G 值直接位于 Q 值之后,应始终是 P) 除以 8 的DSSPUBKEY_VER3 bitlenP 成员的长度 (位长度(以字节为单位)。 如果数据的长度比 P 除以 8 少一个或多个字节,则必须用零值) 的必要字节 (填充数据,以使数据成为所需的长度 (little-endian 格式) 。
J J 值直接位于 G 值之后,应始终是 DSSPUBKEY_VER3bitlenJ 成员的长度(以字节为单位)除以八 (little-endian 格式) 。 如果 bitlenQ 值为 0,则 BLOB 中不存在该值。
Y Y 值( (G^X) mod P)直接位于 J 值之后,应始终是 P) 除以 8 的DSSPUBKEY_VER3 bitlenP 成员 (位长度的长度(以字节为单位)。 如果计算 (G^X) mod P 生成的数据的长度比 P 少一个或多个字节除以 8,则必须用零值) 的必要字节 (填充数据,以使数据成为所需的长度 (little-endian 格式) 。 注意:当此结构与具有 dwParam 值的 CryptSetKeyParam 一起使用时KP_PUB_PARAMS,则此值不包括在 BLOB 中。

 

备注

公钥 BLOB 未加密,但包含纯文本形式的公钥。