[New - Windows NT]
[New - Windows 95, OEM Service Release 2]
CryptImportKey功能用于将密钥从密钥块传输到CSP。
BOOL CRYPTFUNC CryptImportKey(
HCRYPTPROV【pbBuffer】, | |
BYTE *【pbData】, | |
DWORD【dwDataLen】, | |
HCRYPTKEY【hImpKey】, | |
DWORD【dwFlags中】, | |
HCRYPTKEY *【phKey】 | |
); |
参数
【pbBuffer】
[in]应用程序的CSP的句柄。应用程序使用CryptAcquireContext函数获取此句柄。
【pbData】
[in]包含键blob的缓冲区。该关键点是由CryptExportKey函数生成的,无论是通过相同的应用程序或在远程计算机上运行的另一个应用程序。
此密钥blob包含标准头,后跟加密密钥。
【dwDataLen】
[in]键blob的长度(以字节为单位)。
【hImpKey】
[in]此参数的含义取决于CSP类型和正在导入的键blob的类型而有所不同。
如果密钥blob未加密(例如,PUBLICKEYBLOB)或密钥交换密钥对(例如,SIMPLEBLOB)加密密钥blob,则不使用该参数,并且应为零。
如果正在导入【签】键blob,则此键用于验证键blob的签名。在这种情况下,此参数应包含创建密钥blob的方的密钥交换公钥的句柄。
如果密钥blob使用会话密钥加密(例如,加密的PRIVATEKEYBLOB),则该参数应包含此会话密钥的句柄。
【dwFlags中】
[in]标志值。此参数目前仅在将公钥/私钥对导入到CSP(以PRIVATEKEYBLOB的形式)中时使用。在这种情况下,如果设置了CRYPT_EXPORTABLE标志,则允许后续应用程序将私钥导出CSP。
【phKey】
[out]功能将手柄复制到导入的键的地址。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要检索扩展错误信息,请使用GetLastError功能。
下表列出了GetLastError函数最常返回的错误代码。由“NTE”开头的错误代码由您使用的特定CSP生成。
错误 | 描述 |
ERROR_INVALID_HANDLE | 其中一个参数指定一个无效句柄。 |
ERROR_INVALID_PARAMETER | 其中一个参数包含无效值。这通常是一个非法的指针。 |
NTE_BAD_ALGID | 您尝试导入的简单键blob不使用预期的密钥交换算法进行加密。 |
NTE_BAD_DATA | 该CSP不支持使用您尝试导入的公钥的算法。 |
NTE_BAD_FLAGS | 【dwFlags中】参数为非零。 |
NTE_BAD_TYPE | 此CSP不支持关键blob类型,可能无效。 |
NTE_BAD_UID | 【pbBuffer】参数不包含有效的上下文句柄。 |
NTE_BAD_VER | 关键blob的版本号与CSP版本不匹配。这通常表明CSP需要升级。 |
例
#include < wincrypt.h >
FILE *hSourceFile = NULL;
HCRYPTPROV hProv = 0;
HCRYPTKEY hKey = 0;
BYTE *pbKeyBlob = NULL;
DWORD dwBlobLen;
//打开文件,获取文件句柄'hSourceFile'。
...
//获取默认提供程序的句柄。
if(!CryptAcquireContext(& hProv,NULL,NULL,PROV_RSA_FULL,0)){
printf("Error %x during CryptAcquireContext!\n", GetLastError());
goto done;
}
//从文件读取密钥blob长度并分配内存。
fread(&dwBlobLen, sizeof(DWORD), 1, hSourceFile);
pbKeyBlob = malloc(dwBlobLen);
//从文件中读取密钥blob。
fread(pbKeyBlob, 1, dwBlobLen, hSourceFile);
//将关键字blob导入CSP。
if(!CryptImportKey(hProv,pbKeyBlob,dwBlobLen,0,0,& hKey)){
printf("Error %x during CryptImportKey!\n", GetLastError());
free(pbKeyBlob);
goto done;
}
//空闲内存
free(pbKeyBlob);
//使用'hKey'执行加密操作。
...
完成:
//销毁会话密钥。
if(hKey) CryptDestroyKey(hKey);
//发布提供者句柄。
if(hProv) CryptReleaseContext(hProv, 0);
也可以看看