生成和检索 DSS 密钥
DSS 密钥可以通过调用 CryptGenKey 函数生成。 对 CryptGenKey 的调用要求在 Algid 参数中传递AT_SIGNATURE或CALG_DSS_SIGN。 此调用将生成 P(质模)、Q(prime)、G(生成器)、X(机密指数)和 Y(公钥)值,并将其保存在 密钥 BLOB 到本地存储中。
生成 DSS 签名密钥对
- 调用 CryptAcquireContext 函数以获取Microsoft DSS 加密提供程序的句柄。
- 调用 CryptGenKey 以生成密钥。 必须为 Algid 参数传入AT_SIGNATURE或CALG_DSS_SIGN,dwFlags 参数的上限 16 位必须设置为所需的密钥大小。 如果高 16 位为零,则将使用默认密钥大小 1,024 位。 hKey 参数中返回 HCRYPTKEY 句柄。
检索指向以前生成的签名密钥的指针
- 调用 CryptAcquireContext 以获取Microsoft DSS 加密提供程序的句柄。
- 调用 CryptGetUserKey 函数,并将 dwKeySpec 参数设置为AT_SIGNATURE或CALG_DSS_SIGN。
检索 P、Q 和 G 值
- 调用 CryptAcquireContext 以获取Microsoft DSS 加密提供程序的句柄。
- 调用 CryptGetUserKey,并将 dwKeySpec 参数设置为AT_SIGNATURE或CALG_DSS_SIGN。
- 调用 CryptGetKeyParam,并将 hKey 参数设置为上一步中检索的指针。 dwParam 参数必须设置为所需的标志;KP_P、KP_Q 或KP_G。 该值在 pbData 参数中返回,数据长度在 pdwDataLen 参数中返回。 该值返回时没有标头信息,并且采用 小端 格式。
生成 DSS 签名
必须先使用 SHA 算法对要签名的数据 哈希处理。 对数据进行哈希处理后,通过调用 CryptSignHash 函数生成 DSS 签名。
生成 DSS 签名
- 调用 CryptAcquireContext 以获取Microsoft DSS 加密提供程序的句柄。
- 调用 CryptCreateHash,并将 Algid 参数设置为CALG_SHA以获取 SHA 哈希对象的句柄。
- 调用 CryptHashData,并将 hHash 参数设置为上一步中检索的句柄。 这会创建数据的哈希,并在 CryptCreateHash 函数调用的 phHash 参数中返回哈希的句柄。
- 调用 CryptSignHash,并将 hHash 参数设置为上一步中检索的句柄。 可以在 dwKeySpec 参数中传递AT_SIGNATURE或CALG_DSS_SIGN。 签名将返回到 pbSignature 参数中提供的地址,签名的长度将返回到 pdwSigLen 参数中提供的地址。 NULL 指针可以传入 pbSignature 参数,在这种情况下,不会生成签名,但签名的长度将返回到 pdwSigLen 参数中提供的地址。
验证 DSS 签名
若要验证 DSS 签名,必须导入签名者的 DSS 公钥,签名的数据 必须经过哈希处理,然后才能验证签名。
验证 DSS 签名
调用 CryptAcquireContext 以获取Microsoft DSS 加密提供程序的句柄。
调用 CryptImportKey 以导入签名者的 DSS 公钥。
调用 CryptCreateHash,并将 Algid 参数设置为CALG_SHA以获取 SHA 哈希对象的句柄。
调用 CryptHashData,并将 hHash 参数设置为上一步中检索的句柄,并使用指向已签名数据的 pbData。 这会创建数据的哈希,并在 CryptCreateHash 函数调用的 phHash 参数中返回哈希的句柄。
使用以下设置调用 CryptVerifySignature:
hHash 设置为上一步骤中执行的哈希的句柄。
pbSignature 指向要验证的签名。
dwSigLen 设置为签名的长度。
hPubKey 设置为步骤 2 中导入的公钥的句柄。
dwFlags 设置为零。
导出 DSS 密钥
向收件人验证签名的人员发送 签名数据 时,必须向收件人提供签名者的公钥,并且通常与签名的数据一起发送。 因此,必须能够以 密钥 BLOB 格式导出 DSS 密钥。
导出 DSS 公钥
- 调用 CryptAcquireContext 以获取Microsoft DSS 加密提供程序的句柄。
- 调用 CryptGetUserKey,并将 dwKeySpec 参数设置为AT_SIGNATURE或CALG_DSS_SIGN。
- 调用 CryptExportKey,hKey 设置为上一步中检索的句柄,dwBlobType 设置为 PUBLICKEYBLOB,dwFlags 设置为零。 DSS 公钥 BLOB 在 pbData中返回,pdwDataLen中返回 密钥 BLOB 的长度。 NULL 指针可以传入 pbData,在本例中,只返回 DSS 密钥 BLOB 的长度。 调用 CryptExportKey 时返回的 BLOB 采用 DSS 提供程序密钥 BLOB中所述的格式。
导出 DSS 私钥
- 遵循与导出 DSS 公钥相同的过程,但调用 CryptExportKey时,dwBlobType 设置为 PRIVATEKEYBLOB。 调用 CryptExportKey 时返回的 BLOB 采用 DSS 提供程序密钥 BLOB中所述的格式。