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)。 请注意,十六进制值只是 ASCII“DSS3”编码。 |
P | P 值直接位于 DSSPUBKEY_VER3 结构之后,应始终是DSSPUBKEY_VER3 bitlenP 字段(位长度 P)除以 8(little-endian 格式)的长度(以字节为单位)。 |
Q | Q 值直接位于 P 值之后,应始终是 DSSPUBKEY_VER3bitlenQ 成员的长度(除以 8(little-endian 格式)。 |
G | G 值直接位于 Q 值之后,应始终为 DSSPUBKEY_VER3bitlenP 成员(P 位长度)除以 8 的长度(以字节为单位)。 如果数据的长度比 P 短一个或多个字节除以 8,则必须用必要的字节(零值)填充数据,以使数据成为所需的长度(小尾 格式)。 |
J | J 值直接位于 G 值之后,应始终是 DSSPUBKEY_VER3bitlenJ 成员的长度(除以 8(little-endian 格式)。 如果 bitlenQ 值为 0,则 BLOB 中不存在该值。 |
Y | Y 值(G^X) mod P 直接位于 J 值之后,应始终是 DSSPUBKEY_VER3bitlenP 成员(位长度 P)除以 8 的长度(以字节为单位)。 如果计算(G^X)mod P 生成的数据的长度比 P 短一个或多个字节除以 8,则必须用必要的字节(零值)填充数据,以使数据成为所需的长度(小端 格式)。
注意: 将此结构与 CryptSetKeyParam 与 dwParam 值一起使用时KP_PUB_PARAMS,则 BLOB 中不包含此值。 |
注意
公钥 BLOB 不是加密的,而是以纯文本形式包含公钥。