Función CryptImportKey (wincrypt.h)
Sintaxis
BOOL CryptImportKey(
[in] HCRYPTPROV hProv,
[in] const BYTE *pbData,
[in] DWORD dwDataLen,
[in] HCRYPTKEY hPubKey,
[in] DWORD dwFlags,
[out] HCRYPTKEY *phKey
);
Parámetros
[in] hProv
Identificador de un CSP obtenido con la función CryptAcquireContext.
[in] pbData
Matriz BYTE que contiene un encabezado PUBLICKEYSTRUC de BLOB seguido de la clave cifrada. Esta clave BLOB se crea mediante la función
[in] dwDataLen
Contiene la longitud, en bytes, del BLOB de clave.
[in] hPubKey
Identificador de la clave criptográfica que descifra la clave almacenada en pbData. Esta clave debe proceder del mismo CSP al que hace referencia hProv. El significado de este parámetro difiere en función del tipo csp y del tipo de BLOB de clave que se importa:
- Si la clave BLOB se cifra con la clave par de claves de intercambio, por ejemplo, un SIMPLEBLOB, este parámetro puede ser el identificador de la clave de intercambio de claves.
- Si la clave BLOB se cifra con una clave de sesión, por ejemplo, un PRIVATEKEYBLOB cifrado, este parámetro contiene el identificador de esta clave de sesión.
- Si la clave BLOB no está cifrada, por ejemplo, una PUBLICKEYBLOB, este parámetro no se usa y debe ser cero.
- Si la clave BLOB se cifra con una clave de sesión en un CSP de Schannel, por ejemplo, un OPAQUEKEYBLO B cifrado o cualquier otro OPAQUEKEYBLOB específico del proveedor, este parámetro no se usa y debe establecerse en cero.
[in] dwFlags
Actualmente solo se usa cuando un par de claves pública y privada en forma de PRIVATEKEYBLOB se importa en el CSP.
Este parámetro puede ser uno de los siguientes valores.
Valor | Significado |
---|---|
|
La clave que se va a importar se vuelve a importar. Si no se usa esta marca, se producirá un error en las llamadas a CryptExportKey con el identificador de clave. |
|
Esta marca hace que el formato PKCS #1 versión 2 se compruebe con cifrado y descifrado RSA al importar SIMPLEBLOBs. |
|
Un |
|
Si se establece esta marca, el CSP notifica al usuario a través de un cuadro de diálogo o algún otro método cuando se intentan usar determinadas acciones mediante esta clave. El comportamiento preciso se especifica mediante el CSP o el tipo de CSP usado. Si el contexto del proveedor se adquirió con CRYPT_SILENT establecido, el uso de esta marca provoca un error y el último error se establece en NTE_SILENT_CONTEXT. |
|
Permite la importación de una clave RC2 superior a 16 bytes. Si no se establece esta marca, se producirá un error en las llamadas a la función de |
[out] phKey
Puntero a un valor de HCRYPTKEY que recibe el identificador de la clave importada. Cuando haya terminado de usar la clave, libere el identificador llamando a la función
Valor devuelto
Si la función se ejecuta correctamente, la función devuelve un valor distinto de cero.
Si se produce un error en la función, devuelve cero. Para obtener información de error extendida, llame a GetLastError.
Los códigos de error precedidos por "NTE" se generan mediante el CSP en particular que se usa. A continuación se indican algunos códigos de error posibles.
Código devuelto | Descripción |
---|---|
|
Algunos CSP establecen este error si se importa una clave privada en un contenedor mientras otro subproceso o proceso usa esta clave. |
|
Uno de los parámetros especifica un identificador que no es válido. |
|
Uno de los parámetros contiene un valor que no es válido. Suele ser un puntero que no es válido. |
|
El blob de clave simple que se va a importar no se cifra con el algoritmo de intercambio de claves esperado. |
|
Este CSP no admite el algoritmo que funciona con la clave pública que se va a importar o se intentó importar una clave de sesión cifrada con algo distinto de una de las claves públicas. |
|
El parámetro dwFlags especificado no es válido. |
|
Este CSP no admite el tipo de BLOB clave y, posiblemente, no es válido. |
|
El parámetro hProv no contiene un identificador de contexto válido. |
|
El número de versión de la clave BLOB no coincide con la versión de CSP. Esto suele indicar que el CSP debe actualizarse. |
Observaciones
Al importar una clave de Hash-Based código de autenticación de mensajes (HMAC), el autor de la llamada debe identificar la clave importada como un tipo PLAINTEXTKEYBLOB y establecer el identificador de algoritmo adecuado en el campo aiKeyAlg del encabezado PUBLICKEYSTRUC BLOB.
La función
Puede usar el tipo
Para obtener un ejemplo de importación de una clave de texto no cifrado, vea Programa C de ejemplo: Importación de una clave de texto no cifrado.
En el ejemplo siguiente se muestra cómo puede establecer los campos de encabezado.
keyBlob.header.bType = PLAINTEXTKEYBLOB;
keyBlob.header.bVersion = CUR_BLOB_VERSION;
keyBlob.header.reserved = 0;
// CALG_AES_128 is used as an example. You would set this to the
// algorithm id that corresponds to the one used by the key.
keyBlob.header.aiKeyAlg = CALG_AES_128;
La longitud de la clave se especifica en keyBlob.keyLength, seguido de los datos de clave reales.
Se admiten los siguientes tamaños de clave.
Algoritmo | Tamaño de clave admitido |
---|---|
CALG_DES | 64 bits |
CALG_3DES_112 | 128 bits |
CALG_3DES | 192 bits |
Ejemplos
En el ejemplo siguiente se muestra cómo importar una clave de un BLOB de clave. Para obtener un ejemplo completo de esta función, vea Programa C de ejemplo: Firma de un hash y Comprobación de la firma hash. Para obtener código adicional que use esta función, vea Programa C de ejemplo: Descifrar un archivo.
#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>
BOOL ImportKey(HCRYPTPROV hProv, LPBYTE pbKeyBlob, DWORD dwBlobLen)
{
HCRYPTKEY hPubKey;
//---------------------------------------------------------------
// This code assumes that a cryptographic provider (hProv)
// has been acquired and that a key BLOB (pbKeyBlob) that is
// dwBlobLen bytes long has been acquired.
//---------------------------------------------------------------
// Get the public key of the user who created the digital
// signature and import it into the CSP by using CryptImportKey.
// The key to be imported is in the buffer pbKeyBlob that is
// dwBlobLen bytes long. This function returns a handle to the
// public key in hPubKey.
if(CryptImportKey(
hProv,
pbKeyBlob,
dwBlobLen,
0,
0,
&hPubKey))
{
printf("The key has been imported.\n");
}
else
{
printf("Public key import failed.\n");
return FALSE;
}
//---------------------------------------------------------------
// Insert code that uses the imported public key here.
//---------------------------------------------------------------
//---------------------------------------------------------------
// When you have finished using the key, you must release it.
if(CryptDestroyKey(hPubKey))
{
printf("The public key has been released.");
}
else
{
printf("The public key has not been released.");
return FALSE;
}
return TRUE;
}
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows XP [solo aplicaciones de escritorio] |
servidor mínimo admitido | Windows Server 2003 [solo aplicaciones de escritorio] |
de la plataforma de destino de |
Windows |
encabezado de |
wincrypt.h |
biblioteca de |
Advapi32.lib |
DLL de |
Advapi32.dll |
Consulte también
de generación de claves y funciones de Exchange de