[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);
也可以看看