CryptSetKeyParam

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

[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_BUSYCSP上下文正在被另一个进程使用。
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);

也可以看看

CryptGenKey, CryptGetKeyParam