[New - Windows NT]
[New - Windows 95, OEM Service Release 2]
CryptExportKey功能用于以安全的方式从加密服务提供商导出加密密钥。
要导出的键的句柄被传递到函数中,该函数向调用者返回一个键blob。这个关键点可以通过非安全运输方式发送或存储在非安全存储位置。直到预期的收件人使用CryptImportKey函数之后,关键的blob才是无用的,然后将其导入到收件人的CSP中。
BOOL CRYPTFUNC CryptExportKey(
HCRYPTKEY【的hKeyru-Latn】, | |
HCRYPTKEY【hExpKey】, | |
DWORD【dwBlobType】, | |
DWORD【dwFlags中】, | |
BYTE *【pbData】, | |
DWORD *【pdwDataLen】 | |
); |
参数
【的hKeyru-Latn】
[in]要导出的键的句柄。
【hExpKey】
[in]属于目标用户的加密密钥的句柄。使用此密钥对创建的密钥块中的关键数据进行加密。这确保只有目标用户才能使用密钥blob。
这通常是目的地用户的密钥交换公钥。然而,某些协议要求为此目的使用属于目标用户的会话密钥。
如果【dwBlobType】指定的键blob类型是PUBLICKEYBLOB,则该参数未使用,应设置为零。
如果dwBlobType指定的键blob是PRIVATEKEYBLOB,那么这通常是用于加密密钥blob的会话密钥的句柄。一些CSP允许此参数为零,在这种情况下,应用程序应手动加密私钥blob以保护它。
【dwBlobType】
[in]要导出的键blob的类型。这必须是以下常量之一。这些常数在交换加密密钥一节中讨论。
*SIMPLEBLOB
*PUBLICKEYBLOB
*PRIVATEKEYBLOB
【dwFlags中】
[in]标志值。此参数保留供将来使用,并且应始终为零。
【pbData】
[out]函数放置键blob的缓冲区。可以通过为此参数调用CryptExportKey为NULL来确定此缓冲区所需的大小。
通常,SIMPLEBLOB将为256字节或更少,PUBLICKEYBLOB将为1000字节或更少,PRIVATEKEYBLOBS将为5000字节或更少。
【pdwDataLen】
[in/out]关键blob数据长度的地址。在调用此函数之前,调用者应将此参数设置为【pbData】缓冲区的长度(以字节为单位)。返回时,该地址将包含由键blob占用的字节数。
如果【pbData】指定的缓冲区不足以容纳数据,则该函数返回ERROR_MORE_DATA错误代码(通过GetLastError),并将所需的缓冲区大小(以字节为单位)存储到【pdwDataLen】指向的变量中。
如果【pbData】为NULL,则不会返回任何错误,并且函数将以【pdwDataLen】指向的变量存储数据的大小(以字节为单位)。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要检索扩展错误信息,请使用GetLastError功能。
下表列出了GetLastError函数最常返回的错误代码。由“NTE”开头的错误代码由您使用的特定CSP生成。
错误 | 描述 |
ERROR_INVALID_HANDLE | 其中一个参数指定一个无效句柄。 |
ERROR_INVALID_PARAMETER | 其中一个参数包含无效值。这通常是一个非法的指针。 |
NTE_BAD_FLAGS | 【dwFlags中】参数不为零。 |
NTE_BAD_KEY | 由【的hKeyru-Latn】和【hExpKey】指定的一个或两个密钥无效。 |
NTE_BAD_KEY_STATE | 您没有权限导出密钥。也就是说,当【的hKeyru-Latn】键被创建时,没有指定CRYPT_EXPORTABLE标志。 |
NTE_BAD_PUBLIC_KEY | 【dwBlobType】指定的关键blob类型是PUBLICKEYBLOB,但【hExpKey】不包含公钥句柄。 |
NTE_BAD_TYPE | 【dwBlobType】参数指定一个未知的blob类型。 |
NTE_BAD_UID | 创建【的hKeyru-Latn】密钥时指定的CSP上下文无法找到。 |
NTE_NO_KEY | 正在导出会话密钥,并且【hExpKey】参数未指定公钥。 |
例
#include < wincrypt.h >
HCRYPTPROV hProv; //处理CSP
HCRYPTKEY hKey; //处理会话密钥
HCRYPTKEY hXchgKey; //处理接收者的交换公钥
BYTE *pbKeyBlob = NULL;
DWORD dwBlobLen;
...
//确定键blob的大小并分配内存。
if(!CryptExportKey(hKey,hXchgKey,SIMPLEBLOB,0,NULL,& dwBlobLen)){
printf("Error %x computing blob length!\n", GetLastError());
...
}
if((pbKeyBlob = malloc(dwBlobLen)) == NULL) {
printf("Out of memory!\n");
...
}
//将键导出到一个简单的键blob。
if(!CryptExportKey(hKey,hXchgKey,SIMPLEBLOB,0,pbKeyBlob,& dwBlobLen)){
printf("Error %x during CryptExportKey!\n", GetLastError());
...
}
也可以看看