CryptVerifySignatureA 函数 (wincrypt.h)
在调用此函数之前,必须调用 CryptCreateHash 来创建哈希对象的句柄。 CryptHashData 或 CryptHashSessionKey 用于向哈希对象添加数据或 会话 键。
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
定义了以下标志值。
返回值
如果函数成功,则返回值 TRUE。
如果函数失败,则返回值 FALSE。 有关扩展错误信息,请调用 GetLastError。
前面为“NTE”的错误代码由所使用的特定 CSP 生成。 下面是一些可能的错误代码。
返回代码 | 描述 |
---|---|
|
其中一个参数指定无效的句柄。 |
|
其中一个参数包含无效的值。 这通常是无效的指针。 |
|
dwFlags 参数为非零。 |
|
hHash 参数指定的哈希对象无效。 |
|
hPubKey 参数不包含有效 公钥的句柄。 |
|
签名无效。 这可能是因为数据本身已更改,说明字符串不匹配,或者 hPubKey指定了错误的公钥。
如果哈希算法或签名算法与用于创建签名的算法不匹配,也可以返回此错误。 |
|
找不到创建哈希对象时指定的 加密服务提供程序(CSP)上下文。 |
|
在操作期间,CSP 内存不足。 |
言论
CryptVerifySignature 函数完成哈希。 在此调用后,无法再向哈希添加任何数据。 对 CryptHashData 或 CryptHashSessionKey 的其他调用失败。 使用哈希完成应用程序后,应调用 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 [仅限桌面应用] |
目标平台 | 窗户 |
标头 | wincrypt.h |
库 | Advapi32.lib |
DLL | Advapi32.dll |