CryptGetKeyParam

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

[New - Windows NT]

[New - Windows 95, OEM Service Release 2]

CryptGetKeyParam功能允许应用程序检索管理键操作的数据。请注意,本功能或任何其他功能无法获得基本键控材料。

BOOL CRYPTFUNC CryptGetKeyParam(

HCRYPTKEY【的hKeyru-Latn】, 
DWORD【dwParam】, 
BYTE *【pbData】, 
DWORD *【pdwDataLen】, 
DWORD【dwFlags中】 
); 

参数

【的hKeyru-Latn】

[in]查询参数的键的句柄。

【dwParam】

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

【pbData】

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

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

【pdwDataLen】

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

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

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

【dwFlags中】

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

备注

对于所有键类型,可以将【dwParam】值设置为以下关键参数类型之一:

参数描述
KP_ALGID关键算法【pbData】缓冲区将包含一个ALG_ID值,表示在创建密钥时指定了算法。
KP_BLOCKLEN如果会话密钥由【的hKeyru-Latn】指定,则该参数返回密码的块长度(以比特为单位)。【pbData】缓冲区将包含一个DWORD值,表示块长度。对于流密码,此值将始终为零。

如果【的hKeyru-Latn】指定了公钥/私钥对,则该参数返回密钥对的加密粒度(以比特为单位)。例如,Microsoft RSA Base Provider生成512位RSA密钥对,因此返回值为512的这些密钥。如果公钥算法不支持加密,则此参数返回的值未定义。

KP_SALT盐值。【pbData】缓冲区将包含一个BYTE数组,指示当前的盐值。盐值的大小将根据所使用的CSP和算法而有所不同。在设置此参数之前,应使用CryptGetKeyParam进行读取,以确定大小。

盐值不适用于公钥/私钥对。

KP_PERMISSIONS密钥权限【pbData】缓冲区将包含设置了零个或多个权限标志的DWORD值。有关这些标志的描述,请参阅本节末尾的表格。

如果块密码会话密钥由【的hKeyru-Latn】指定,则【dwParam】值也可以设置为以下参数类型之一。

参数描述
KP_IV初始化向量。【pbData】缓冲区将包含一个BYTE数组,指示当前的初始化向量。该数组包含< 【块长度】 > / 8元素。例如,如果块长度为64位,则初始化向量将由8个字节组成。
KP_PADDING填充模式。【pbData】缓冲区将包含一个DWORD值,表示密码使用的填充方法。以下是当前定义的填充模式:

PKCS5_PADDING __ PKCS 5(秒6.2)填充方法。

KP_MODE密码模式。【pbData】缓冲区将包含一个DWORD值,表示密码的模式。有关密码模式的列表,请参见下表。
KP_MODE_BITS要反馈的位数。【pbData】缓冲区将包含一个DWORD值,表示当使用OFB或CFB密码模式时,每个周期处理的位数。

下表列出了KP_MODE参数的可能值。这些密码模式在加密和解密数据部分中讨论。

密码模式描述
CRYPT_MODE_ECB电子码簿
CRYPT_MODE_CBC密码块链接。
CRYPT_MODE_OFB输出反馈模式。
CRYPT_MODE_CFB密码反馈模式。

下表列出了读取KP_PERMISSIONS参数时获取的位字段中的标志。这些权限标志被Microsoft RSA Base Provider忽略。但是,自定义CSP可以使用这些标志来限制对键的操作。

权限标志描述
CRYPT_ENCRYPT允许加密
CRYPT_DECRYPT允许解密。
CRYPT_EXPORT允许输出键。
CRYPT_READ允许读取参数。
CRYPT_WRITE允许设置参数。
CRYPT_MAC允许MAC与密钥一起使用。

返回值

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

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

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

错误描述
ERROR_INVALID_HANDLE其中一个参数指定一个无效句柄。
ERROR_INVALID_PARAMETER其中一个参数包含无效值。这通常是一个非法的指针。
NTE_BAD_FLAGS【dwFlags中】参数不为零。
NTE_BAD_KEY或NTE_NO_KEY【的hKeyru-Latn】参数指定的密钥无效。
NTE_BAD_TYPE【dwParam】参数指定未知参数号。
NTE_BAD_UID创建密钥时指定的CSP上下文无法找到。

#include < wincrypt.h >

HCRYPTPROV hProv = 0;

HCRYPTKEY hKey = 0;

DWORD dwMode;

BYTE pbData[16];

DWORD dwCount;

DWORD i;

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

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

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

goto done;

}

//创建随机块密码会话密钥。

IF(!CryptGenKey(hProv,CALG_RC2,CRYPT_EXPORTABLE,{}的hKey 989796005)){

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

goto done;

}

//读取密码模式。

dwCount = sizeof(DWORD);

if(!CryptGetKeyParam(hKey,KP_MODE,& dwMode,& dwCount,0)){

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

goto done;

}

assert(dwCount==sizeof(BYTE));

//打印出密码模式。

printf("Default cipher mode:%d\n", dwMode);

//读初始化向量。

dwCount = 16;

if(!CryptGetKeyParam(hKey,KP_IV,pbData,& dwCount,0)){

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

goto done;

}

//打印出初始化向量。

printf("Default IV:");

for(i=0;i<dwCount;i++) printf("%2.2x ",pbData[i]);

printf("\n");

完成:

//销毁会话密钥。

if(hKey != 0) CryptDestroyKey(hKey);

//发布提供者句柄。

if(hProv != 0) CryptReleaseContext(hProv, 0);

也可以看看

CryptSetKeyParam