DSS 版本 3 私钥 BLOB
导出版本 3 DSS 私钥时,其格式如下:
BLOBHEADER blobheader;
DSSPRIVKEY_VER3 dssprivkeyver3;
BYTE p[dssprivkeyver3.bitlenP/8];
// Where P is the prime modulus
BYTE q[dssprivkeyver3.bitlenQ/8];
// Where Q is a large factor of P-1
BYTE g[dssprivkeyver3.bitlenP/8];
// Where G is the generator parameter
BYTE j[dssprivkeyver3.bitlenJ/8];
// Where J is (P-1)/Q
BYTE y[dssprivkeyver3.bitlenP/8];
// Where Y is (G^X) mod P
BYTE x[dssprivkeyver3.bitlenX/8];
// Where X is the private exponent
当 CRYPT_BLOB_VER3 标志与 CryptExportKey 一起使用时,此 BLOB 格式将被导出。 由于版本位于 BLOB 中,因此在将此 BLOB 与 CryptImportKey 一起使用时无需指定标志。
下表描述了键 BLOB 的每个组件。
字段 | 说明 |
---|---|
Blobheader | BLOBHEADER 结构。 bType 成员必须具有 PUBLICKEYBLOB 的值。 |
Dssprivkeyver3 | DSSPRIVKEY_VER3 结构。 magic 成员应被设置为私钥 "DSS4" (0x34535344)。 请注意,十六进制值只是 "DSS4" 的 ASCII 编码。 |
P | P 值直接位于 DSSPRIVKEY_VER3 结构之后,应始终是 DSSPRIVKEY_VER3 bitlenP 字段(位长度为 P)除以 8 的字节长度(little-endian 格式)。 |
Q | Q 值直接位于 P 值之后,应始终是 DSSPRIVKEY_VER3 bitlenQ 字段除以 8 的字节长度(little-endian 格式)。 |
G | G 值直接位于 Q 值之后,应始终是 DSSPRIVKEY_VER3 bitlenP 字段(位长度为 P)除以 8 的字节长度。 如果数据的长度比 P 除以 8 短一个或多个字节,则必须用必要的字节(零值)填充数据,以使数据达到所需长度(little-endian 格式)。 |
J | J 值直接位于 G 值之后,应始终是 DSSPRIVKEY_VER3 bitlenJ 字段除以 8 的字节长度(little-endian 格式)。 如果 bitlenJ 值为 0,则 BLOB 中不存在该值。 |
Y | Y 值 ((G^X) mod P) 直接位于 J 值之后,应始终是 DSSPRIVKEY_VER3 bitlenP 字段(位长度为 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 传递的是零,则私钥在不加密的情况下被导出。
重要
导出未加密的私钥很危险,因为它们很容易被未经授权的实体拦截和使用。