CryptGenKey

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

[New - Windows NT]

[New - Windows 95, OEM Service Release 2]

CryptGenKey函数生成用于CSP模块的随机加密密钥。钥匙的句柄在【phKey】中返回。然后可以根据需要使用任何其他需要密钥句柄的CryptoAPI功能。

调用此函数时需要调用应用程序来指定算法。由于该算法类型与密钥保持捆绑,所以当执行实际的加密操作时,应用程序不需要稍后指定算法。

BOOL CRYPTFUNC CryptGenKey(

HCRYPTPROV【pbBuffer】, 
ALG_ID【寒冷的】, 
DWORD【dwFlags中】, 
HCRYPTKEY *【phKey】 
); 

参数

【pbBuffer】

[in]应用程序的CSP的句柄。应用程序使用CryptAcquireContext函数获取此句柄。

【寒冷的】

[in]要生成密钥的算法的标识符。

此参数的有效值将有所不同,具体取决于所使用的CSP。有关可能的算法标识符的列表,请参阅“备注”部分。

【dwFlags中】

[in]指定生成的密钥类型的标志。该参数可以为零,或者您可以使用二元OR运算符来组合它们来指定以下一个或多个标志。

CRYPT_EXPORTABLE

如果设置了该标志,则可以使用CryptExportKey功能将密钥从CSP传送到密钥库中。因为会话密钥通常必须是可导出的,所以通常在创建会话密钥时设置它们。

如果未设置此标志,那么密钥将【不】可导出。对于会话密钥,这意味着该密钥将仅在当前会话中可用,并且只有创建它的应用程序才能使用它。对于公钥/私钥对,这意味着私钥不能被传输或备份。

此标志仅适用于会话密钥和私钥blob。它不适用于总是可导出的公钥。

CRYPT_CREATE_SALT

如果设置了此标志,则会自动为该键分配一个随机盐值。您可以使用CryptGetKeyParam参数设置为KP_SALT的CryptGetKeyParam函数来检索此盐值。

如果未设置此标志,则键值将为零。

当输出具有非零盐值的键(通过CryptExportKey)时,还必须获取盐值并与键blob一起保存。

CRYPT_USER_PROTECTED

如果设置了此标志,则当使用此键尝试某些操作时,将通过对话框或其他方法通知用户。精确的行为由使用的CSP指定。

Microsoft RSA基础提供程序忽略此标志。

【phKey】

[out]该函数将新生成的密钥的句柄复制到的地址。

备注

要生成与对称加密算法(即会话密钥)一起使用的密钥,请使用【寒冷的】参数指定算法。可用的算法对于每个CSP最有可能是不同的。如果您使用的是Microsoft RSA Base Provider,可以使用以下值之一来指定算法:

* __ CALG_RC2 RC2块密码

* __ CALG_RC4 RC4流加密

当为对称块密码生成密钥时,默认情况下,密钥将以密码块链接(CBC)模式设置,初始化向量为零。此密码模式为批量加密数据提供了良好的默认方法。要更改这些参数,请使用CryptSetKeyParam功能。

除了生成对称算法的密钥之外,CryptGenKey函数还可以生成公钥算法的密钥。公钥算法的使用仅限于密钥交换和数字签名。每个CryptoAPI客户端通常拥有每个这些操作的一个密钥对。要生成其中一个密钥对,请将【寒冷的】参数设置为以下值之一:

* AT_KEYEXCHANGE __密钥交换

* AT_SIGNATURE __数字签名

返回值

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

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

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

错误描述
ERROR_INVALID_HANDLE其中一个参数指定一个无效句柄。
ERROR_INVALID_PARAMETER其中一个参数包含无效值。这通常是一个非法的指针。
NTE_BAD_ALGID【寒冷的】参数指定此CSP不支持的算法。
NTE_BAD_FLAGS【dwFlags中】参数包含无效值。
NTE_BAD_UID【pbBuffer】参数不包含有效的上下文句柄。
NTE_FAIL该函数以某种意想不到的方式失败。

#include < wincrypt.h >

HCRYPTPROV hProv = 0;

HCRYPTKEY hKey = 0;

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

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;

}

//使用'hKey'来做某事

...

完成:

//销毁会话密钥。

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

//发布提供者句柄。

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

也可以看看

CryptAcquireContext, CryptDestroyKey, CryptExportKey, CryptGetKeyParam, CryptImportKey, CryptSetKeyParam