[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