CryptExportKey

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

[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());

...

}

也可以看看

CryptImportKey