[New - Windows NT]
[New - Windows 95, OEM Service Release 2]
通过CryptSetKeyParam功能,应用程序可以自定义按键操作的各个方面。
通常,此函数用于设置对称密钥上的会话特定参数。请注意,此函数无法访问基本密钥材料。
Microsoft RSA Base Provider在密钥交换或签名密钥上没有可设置的参数。然而,定制提供者可以定义可以在这些键上设置的参数。
BOOL CRYPTFUNC CryptSetKeyParam(
HCRYPTKEY【的hKeyru-Latn】, | |
DWORD【dwParam】, | |
BYTE *【pbData】, | |
DWORD【dwFlags中】 | |
); |
参数
【的hKeyru-Latn】
[in]设置参数的键的句柄。
【dwParam】
[in]参数号。有关参数的列表,请参阅“备注”部分。
【pbData】
[in]参数数据缓冲区。在调用CryptSetKeyParam之前将参数数据放在此缓冲区中。此数据的形式将根据参数编号而有所不同。
【dwFlags中】
[in]标志值。此参数保留供将来使用,并且应始终为零。
备注
对于所有会话密钥类型,可以将【dwParam】值设置为以下关键参数类型之一;
参数 | 描述 |
KP_SALT | 盐值。【pbData】缓冲区应包含一个指定新的盐值的BYTE数组。该值是会话密钥的一部分。盐值的大小将根据所使用的CSP而有所不同,因此在设置此参数之前,应使用CryptGetKeyParam读取其值,以确定其大小。 当怀疑用于派生键的基本数据不太理想时,通常会使用盐值来使会话密钥更加独特。这使得字典攻击更加困难。 使用Microsoft RSA Base Provider时,此参数默认为零。 |
KP_PERMISSIONS | 密钥权限标志。【pbData】缓冲区应包含一个指定零个或多个权限标志的DWORD值。有关这些标志的描述,请参阅CryptGetKeyParam函数。 使用Microsoft RSA Base Provider时,此参数默认为0xFFFFFFFF。 |
如果块密码会话密钥由【的hKeyru-Latn】指定,则【dwParam】值也可以设置为以下参数类型之一。
参数 | 描述 |
KP_IV | 初始化向量。【pbData】缓冲区应包含一个指定初始化向量的BYTE数组。该数组应包含< 【块长度】 > / 8元素。例如,如果块长度为64位,则初始化向量将由8个字节组成。 使用Microsoft RSA Base Provider时,此参数默认为零。 |
KP_PADDING | 填充模式。【pbData】缓冲区应包含一个DWORD值,指定密码使用的填充方法。以下是当前定义的填充模式: PKCS5_PADDING __ PKCS 5(秒6.2)填充方法。 使用Microsoft RSA Base Provider时,此参数默认为PKCS5_PADDING。 |
KP_MODE | 密码模式。【pbData】缓冲区应包含一个DWORD值,指定要使用的密码模式。请参阅CryptGetKeyParam功能列表 定义的密码模式。 使用Microsoft RSA Base Provider时,此参数默认为CRYPT_MODE_CBC。 |
KP_MODE_BITS | 要反馈的位数。【pbData】缓冲区包含一个DWORD值,表示当使用OFB或CFB密码模式时每个周期处理的比特数。 使用Microsoft RSA Base Provider时,此参数的默认值为8。 |
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要检索扩展错误信息,请使用GetLastError功能。
下表列出了GetLastError函数最常返回的错误代码。由“NTE”开头的错误代码由您使用的特定CSP生成。
错误 | 描述 |
ERROR_INVALID_HANDLE | 其中一个参数指定一个无效句柄。 |
ERROR_BUSY | CSP上下文正在被另一个进程使用。 |
ERROR_INVALID_PARAMETER | 其中一个参数包含无效值。这通常是一个非法的指针。 |
NTE_BAD_FLAGS | 【dwFlags中】参数为非零值,或【pbData】缓冲区包含无效值。 |
NTE_BAD_TYPE | 【dwParam】参数指定一个未知参数。 |
NTE_BAD_UID | 创建【的hKeyru-Latn】密钥时指定的CSP上下文无法找到。 |
NTE_FAIL | 该函数以某种意想不到的方式失败。 |
例
#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))
printf("Error %x during CryptGenKastError());
goto done;
}
//设置密码模式。
dwMode = CRYPT_MODE_ECB;
if(!CryptSetKeyParam(hKey,KP_MODE,& dwMode,0)){
printf("Error %x during CryptSetKeyParam!\n", GetLastError());
goto done;
}
//生成随机初始化向量。
if(!CryptGenRandom(hProv,8,pbData)){
printf("Error %x during CryptGenRandom!\n", GetLastError());
goto done;
}
//设置初始化向量。
if(!CryptSetKeyParam(hKey,KP_IV,pbData,0)){
printf("Error %x during CryptGetKeyParam!\n", GetLastError());
goto done;
}
//用'hKey'做某事
...
完成:
//销毁会话密钥。
if(hKey != 0) CryptDestroyKey(hKey);
//发布提供者句柄。
if(hProv != 0) CryptReleaseContext(hProv, 0);
也可以看看