CryptVerifySignatureA 函数 (wincrypt.h)

重要 此 API 已弃用。 新的和现有的软件应开始使用 加密下一代 API。 Microsoft 可能会在将来的版本中删除此 API。
 
CryptVerifySignature 函数验证哈希对象的签名。

在调用此函数之前,必须调用 CryptCreateHash 来创建哈希对象的句柄。 然后使用 CryptHashDataCryptHashSessionKey 向哈希对象添加数据或会话键

CryptVerifySignature 完成后,只能使用 hHash 句柄调用 CryptDestroyHash

语法

BOOL CryptVerifySignatureA(
  [in] HCRYPTHASH hHash,
  [in] const BYTE *pbSignature,
  [in] DWORD      dwSigLen,
  [in] HCRYPTKEY  hPubKey,
  [in] LPCSTR     szDescription,
  [in] DWORD      dwFlags
);

参数

[in] hHash

要验证的哈希对象的句柄。

[in] pbSignature

要验证的签名数据的地址。

[in] dwSigLen

pbSignature 签名数据中的字节数。

[in] hPubKey

用于对签名进行身份验证的 公钥 的句柄。 此公钥必须属于最初用于创建数字签名密钥对

[in] szDescription

此参数不应再使用,并且必须设置为 NULL 以防止安全漏洞。 但是,在 Microsoft 基本加密提供程序中仍支持它实现向后兼容性。

[in] dwFlags

定义了以下标志值。

含义
CRYPT_NOHASHOID
0x00000001
此标志与 RSA 提供程序一起使用。 验证签名时,不应存在或检查 OID) (哈希 对象标识符 。 如果未设置此标志,则会按照 PKCS #7 中 DigestInfo 的定义中的指定验证默认签名中的哈希 OID。
CRYPT_TYPE2_FORMAT
0x00000002
未使用此标志。
CRYPT_X931_FORMAT
0x00000004
对符合 FIPS 186-2 的 RSA (rDSA) 使用 X.931 支持。

返回值

如果函数成功,则返回值为 TRUE

如果函数失败,则返回值为 FALSE。 有关扩展的错误信息,请调用 GetLastError

“NTE”开头的错误代码由你使用的特定 CSP 生成。 一些可能的错误代码随之而来。

返回代码 说明
ERROR_INVALID_HANDLE
其中一个参数指定无效的句柄。
ERROR_INVALID_PARAMETER
其中一个参数包含无效的值。 这通常是无效的指针。
NTE_BAD_FLAGS
dwFlags 参数为非零。
NTE_BAD_HASH
hHash 参数指定的哈希对象无效。
NTE_BAD_KEY
hPubKey 参数不包含有效公钥的句柄。
NTE_BAD_SIGNATURE
签名无效。 这可能是因为数据本身已更改、说明字符串不匹配,或者 hPubKey 指定了错误的公钥。

如果哈希算法或签名算法与用于创建签名的算法不匹配,则也可能返回此错误。

NTE_BAD_UID
无法找到在创建哈希对象时指定的 CSP (加密服务提供程序) 上下文。
NTE_NO_MEMORY
CSP 在操作期间内存不足。

注解

CryptVerifySignature 函数完成哈希。 此调用后,不能将更多数据添加到哈希中。 对 CryptHashDataCryptHashSessionKey 的其他调用失败。 使用哈希完成应用程序后,应调用 CryptDestroyHash 来销毁哈希对象。

如果使用 .NET Framework API 生成签名,并尝试使用 CryptVerifySignature 函数对其进行验证,则函数将失败,GetLastError 将返回NTE_BAD_SIGNATURE。 这是因为本机 Win32 API 和 .NET Framework API 之间的字节顺序不同。

本机加密 API 使用 little-endian 字节顺序,而 .NET Framework API 使用 big-endian 字节顺序。 如果要验证使用 .NET Framework API 生成的签名,则必须在调用 CryptVerifySignature 函数之前交换签名字节的顺序来验证签名。

示例

有关使用 CryptVerifySignature 函数的示例,请参阅 示例 C 程序:对哈希进行签名和验证哈希签名

注意

wincrypt.h 标头将 CryptVerifySignature 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名的使用与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 wincrypt.h
Library Advapi32.lib
DLL Advapi32.dll

另请参阅

CryptCreateHash

CryptDestroyHash

CryptHashData

CryptHashSessionKey

CryptSignHash

哈希和数字签名函数