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