CryptGetHashParam

【勇芳软件工作室】汉化HomePreviousNext

[New - Windows NT]

[New - Windows 95, OEM Service Release 2]

CryptGetHashParam功能允许应用程序检索管理散列对象操作的数据。也可以使用此函数检索实际的哈希值。

BOOL CRYPTFUNC CryptGetHashParam(

HCRYPTHASH【马】, 
DWORD【dwParam】, 
BYTE *【pbData】, 
DWORD *【pdwDataLen】, 
DWORD【dwFlags中】 
); 

参数

【马】

[in]查询参数的哈希对象的句柄。

【dwParam】

[in]参数号。有关参数的列表,请参阅“备注”部分。

【pbData】

[out]参数数据缓冲区。该函数将指定的参数数据复制到此缓冲区。此数据的形式将根据参数编号而有所不同。

如果您正在做的是确定返回的参数数据所需的字节数,则此参数可以为NULL。

【pdwDataLen】

[in/out]参数数据长度的地址。在调用此函数之前,调用者应将此参数设置为【pbData】缓冲区的长度(以字节为单位)。返回时,该地址将包含复制到缓冲区的参数数据的字节数。

如果由【pbData】指定的缓冲区不足以容纳数据,则该函数返回ERROR_MORE_DATA错误代码(通过GetLastError),并将所需的缓冲区大小(以字节为单位)存储在【pdwDataLen】中指向的变量中。

如果【pbData】为NULL,则不会返回错误,并且该函数将以【pdwDataLen】指向的变量存储数据的大小(以字节为单位)。

【dwFlags中】

[in]标志值。此参数保留供将来使用,并且应始终为零。

备注

【dwParam】值可以设置为以下哈希参数类型之一:

HP_ALGID

哈希算法。【pbData】缓冲区将包含一个ALG_ID值,表示在创建哈希对象时指定的算法。有关哈希算法的列表,请参阅CryptCreateHash函数。

HP_HASHSIZE

散列值大小。【pbData】缓冲区将包含一个DWORD值,表示哈希值中的字节数。该值通常为16或20,这取决于哈希算法。

应用程序应该在HP_HASHVAL参数之前检索此参数,以便可以分配正确的内存量。

HP_HASHVAL

散列值。【pbData】缓冲区将包含由【马】指定的散列对象的哈希值或消息摘要。该值是通过CryptHashDataCryptHashSessionKey函数基于较早提供给散列对象的数据生成的。

一旦检索到此参数,则哈希对象将被标记为“已完成”,并且不会再添加更多的数据。

请注意,一些CSP可以添加可以通过此函数查询的其他参数。

返回值

如果函数成功,返回值不为零。

如果函数失败,返回值为零。要检索扩展错误信息,请使用GetLastError功能。

下表列出了GetLastError函数最常返回的错误代码。由“NTE”开头的错误代码由您使用的特定CSP生成。

错误描述
ERROR_INVALID_HANDLE其中一个参数指定一个无效句柄。
ERROR_INVALID_PARAMETER其中一个参数包含无效值。这通常是一个非法的指针。
NTE_BAD_FLAGS【dwFlags中】参数为非零。
NTE_BAD_HASH【马】参数指定的散列对象无效。
NTE_BAD_TYPE【dwParam】参数指定未知参数号。
NTE_BAD_UID创建哈希时指定的CSP上下文无法找到。

#include < wincrypt.h >

HCRYPTPROV hProv = 0;

HCRYPTHASH hHash = 0;

BYTE *pbHash = NULL;

DWORD dwHashLen;

#define BUFFER_SIZE 256

BYTE pbBuffer[BUFFER_SIZE];

DWORD dwCount;

DWORD i;

//获取默认提供程序的句柄。

if(!CryptAcquireContext(& hProv,NULL,NULL,PROV_RSA_FULL,0)){

printf("Error %x during CryptAcquireContext!\n", GetLastError());

goto done;

}

//创建哈希对象。

IF(!CryptCreateHash(hProv,CALG_MD5,0,0,{} hHash 989796005)){

printf("Error %x during CryptBeginHash!\n", GetLastError());

goto done;

}

//将缓冲区填入测试数据。

for(i = 0 ; i < BUFFER_SIZE ; i++) {

pbBuffer[i] = (BYTE)i;

}

//缓冲区中的哈希。

if(!CryptHashData(hHash,pbBuffer,BUFFER_SIZE,0)){

printf("Error %x during CryptHashData!\n", GetLastError());

goto done;

}

//读取哈希值大小并分配内存。

dwCount = sizeof(DWORD);

如果(!CryptGetHashParam(hHash,HP_HASHSIZE,(BYTE *)& dwHashLen,

& dwCount,0)){

printf("Error %x during reading hash size!\n", GetLastError());

goto done;

}

if((pbHash = malloc(dwHashLen)) == NULL) {

printf("Out of memory!\n");

goto done;

}

//读取哈希值。

if(!CryptGetHashParam(hHash,HP_HASHVAL,pbHash,& dwHashLen,0)){

printf("Error %x during reading hash value!\n", GetLastError());

goto done;

}

//打印哈希值。

for(i = 0 ; i < dwHashLen ; i++) {

printf("%2.2x ",pbHash[i]);

}

printf("\n");

完成:

//空闲内存

if(pbHash !=NULL) free(pbHash);

//销毁哈希对象。

if(hHash) CryptDestroyHash(hHash);

//发布CSP句柄。

if(hProv) CryptReleaseContext(hProv,0);

也可以看看

CryptCreateHash, CryptGetKeyParam, CryptHashData, CryptHashSessionKey, CryptSetHashParam