DSS 提供程序密钥 BLOB
BLOB 与 数字签名标准 (DSS) 提供程序一起使用,以将密钥从 加密服务提供商 (CSP) 导出密钥并将其导入其中。
公钥 BLOB
DSS 公钥 作为 BLOB 导出和导入,这是一个字节序列,结构如下。
PUBLICKEYSTRUC publickeystruc;
DSSPUBKEY dsspubkey;
BYTE p[dsspubkey.bitlen/8];
BYTE q[20];
BYTE g[dsspubkey.bitlen/8];
BYTE y[dsspubkey.bitlen/8];
DSSSEED seedstruct;
下表介绍了这些组件。 所有值均采用 little-endian 格式。
字段 | 说明 |
---|---|
dsspubkey | DSSPUBKEY 结构。 magic 成员的值必须为 0x31535344。 此十六进制数是 DSS1 的 ASCII 编码。 |
g | BYTE 序列。 生成器 g. 长度必须与 p 相同。 如果其长度与 p 不同,则必须用0x00个字节填充它。 |
p | BYTE 序列。 质取模,p. 必须将最高有效字节中的最有效位设置为 1。 |
publickeystruc | PUBLICKEYSTRUC 结构。 |
q | BYTE 序列。 质数 q,长度为 20 字节。 必须将最高有效字节中的最有效位设置为 1。 |
种子结构 | DSSSEED 结构。 用于验证质数的种子和计数器值。 |
y | BYTE 序列。 公钥,y。 长度必须与 p 相同。 如果其长度与 p 不同,则必须用0x00个字节填充它。 |
私钥 BLOB
DSS 私钥 作为一个字节序列导出和导入,如下所示。
PUBLICKEYSTRUC publickeystruc;
DSSPUBKEY dsspubkey;
BYTE p[dsspubkey.bitlen/8];
BYTE q[20];
BYTE g[dsspubkey.bitlen/8];
BYTE x[20];
DSSSEED seedstruct;
下表描述了每个组件。 所有值均采用 little-endian 格式。
字段 | 说明 |
---|---|
dsspubkey | DSSPUBKEY 结构。 magic 成员必须设置为 0x32535344。 此十六进制数是 DSS2 的 ASCII 编码。 |
g | BYTE 序列。 生成器 g. 长度必须与 p 相同。 如果其长度与 p 不同,则必须用0x00个字节填充它。 |
publickeystruc | PUBLICKEYSTRUC 结构。 |
p | BYTE 序列。 质取模,p. 必须将最高有效字节中的最有效位设置为 1。 |
q | BYTE 序列。 质数 q. q 的长度为 20 个字节。 必须将最高有效字节中的最有效位设置为 1。 |
种子结构 | DSSSEED 结构。 用于验证质数的种子和计数器值。 |
x | BYTE 序列。 机密指数 x。 长度必须始终为 20 个字节。 如果 x 的长度小于 20 个字节,则必须用0x00填充它。 |
调用 CryptExportKey 时,开发人员可以选择是否对密钥进行加密密钥。 如果 hExpKey 参数包含会话密钥的有效句柄,则会加密 PRIVATEKEYBLOB。 除 BLOB 的 PUBLICKEYSTRUC 部分外,所有内容均已加密。
注意
加密算法和加密密钥参数不与私钥 BLOB 一起存储。 应用程序必须管理和存储此信息。 如果为 hExpKey 传递零,则将在不加密的情况下导出私钥。
注意
导出不加密的私钥很危险,因为它们很容易被未经授权的实体拦截和使用。