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 未加密。 它们包含 纯文本 形式的公钥。

 

私钥 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 传递零,则将在不加密的情况下导出私钥。

 

注意

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