[New - Windows NT]
[New - Windows 95, OEM Service Release 2]
CryptVerifySignature函数用于验证哈希对象的签名。
在调用此函数之前,必须调用CryptCreateHash函数来获取哈希对象的句柄。然后使用CryptHashData和/或CryptHashSessionKey函数将数据和/或会话密钥添加到散列对象。
一旦这个功能完成,可以使用【马】句柄调用的唯一哈希函数是CryptDestroyHash函数。
BOOL CRYPTFUNC CryptVerifySignature(
HCRYPTHASH【马】, | |
BYTE *【pbSignature】, | |
DWORD【dwSigLen】, | |
HCRYPTKEY【hPubKey】, | |
LPCTSTR【sDescription】, | |
DWORD【dwFlags中】 | |
); |
参数
【马】
[in]要验证的哈希对象的句柄。
【pbSignature】
[in]要验证的签名数据的地址。
【dwSigLen】
[in] 【pbSignature】签名数据中的字节数。
【hPubKey】
[in]用于验证签名的公钥的句柄。此公钥必须属于最初用于创建数字签名的密钥对。
【sDescription】
[in]描述签名数据的字符串。当创建签名时,这必须与传递给CryptSignHash函数的字符串完全相同。如果此字符串不匹配,签名验证将失败。
当调用此函数时,一些CSP(而不是Microsoft RSA Base Provider)将向用户显示此描述字符串,并显示签名是否正确验证。这为用户提供了完全独立于应用程序的方式的验证结果。
【dwFlags中】
[in]标志值。此参数保留供将来使用,并且应始终为零。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要检索扩展错误信息,请使用GetLastError功能。
下表列出了GetLastError函数最常返回的错误代码。由“NTE”开头的错误代码由您使用的特定CSP生成。
描述 | |
ERROR_INVALID_HANDLE | 其中一个参数指定一个无效句柄。 |
ERROR_INVALID_PARAMETER | 其中一个参数包含无效值。这通常是一个非法的指针。 |
NTE_BAD_FLAGS | 【dwFlags中】参数为非零。 |
NTE_BAD_HASH | 由【马】参数指定的散列对象无效。 |
NTE_BAD_KEY | 【hPubKey】参数不包含有效公钥的句柄。 |
NTE_BAD_SIGNATURE | 签名未能验证。这可能是因为数据本身已经改变,描述字符串不匹配,或错误的公钥由【hPubKey】指定。 如果散列或签名算法与用于创建签名的算法不匹配,也可以返回此错误。 |
NTE_BAD_UID | 创建哈希对象时指定的CSP上下文无法找到。 |
NTE_NO_MEMORY | CSP在运行过程中耗尽了内存。 |
例
#include < wincrypt.h >
HCRYPTPROV hProv = 0;
#define BUFFER_SIZE 256
BYTE pbBuffer[BUFFER_SIZE];
HCRYPTHASH hHash = 0;
HCRYPTKEY hPubKey = 0;
BYTE *pbSignature = NULL;
DWORD dwSigLen;
LPTSTR szDescription = NULL;
//获取默认提供程序的句柄。
if(!CryptAcquireContext(& hProv,NULL,NULL,PROV_RSA_FULL,0)){
printf("Error %x during CryptAcquireContext!\n", GetLastError());
goto done;
}
//使用'BUFFER_SIZE'字节的测试数据加载'pbBuffer'。这必须
//是原始签名的数据。
...
//由前一次调用创建的签名指向“pbSignature”
//到CryptSignHash。将'dwSigLen'设置为字节数
//签名。
...
//点'szDescription'在描述数据的一些文本
// 签。这必须是原来相同的描述文字
//传递给CryptSignHash。
...
//获取创建数字签名的用户的公钥
//并使用CryptImportKey将其导入CSP。这将返回
//'hPubKey'中公钥的句柄。
...
//创建哈希对象。
IF(!CryptCreateHash(hProv,CALG_MD5,0,0,{} hHash 989796005)){
printf("Error %x during CryptCreateHash!\n", GetLastError());
goto done;
}
//哈希缓冲区
if(!CryptHashData(hHash,pbBuffer,BUFFER_SIZE,0)){
printf("Error %x during CryptHashData!\n", GetLastError());
goto done;
}
//验证数字签名。
if(!CryptVerifySignature(hHash,pbSignature,dwSigLen,hPubKey,szDescription,0)){
if(GetLastError() == NTE_BAD_SIGNATURE) {
printf("Signature failed to validate!\n");
} else {
printf("Error %x during CryptSignHash!\n", GetLastError());
}
} else {
printf("Signature validated OK\n");
}
完成:
...
//发布公钥
if(hPubKey != 0) CryptDestroyKey(hPubKey);
//销毁哈希对象。
if(hHash != 0) CryptDestroyHash(hHash);
//发布提供者句柄。
if(hProv != 0) CryptReleaseContext(hProv, 0);
也可以看看
CryptCreateHash, CryptDestroyHash, CryptHashData, CryptHashSessionKey, CryptSignHash