Función CryptDuplicateKey (wincrypt.h)

Importante Esta API está en desuso. El software nuevo y existente debe empezar a usar las API cryptography Next Generation. Microsoft puede quitar esta API en futuras versiones.
 
La función CryptDuplicateKey realiza una copia exacta de una clave y el estado de la clave.

Sintaxis

BOOL CryptDuplicateKey(
  [in]  HCRYPTKEY hKey,
  [in]  DWORD     *pdwReserved,
  [in]  DWORD     dwFlags,
  [out] HCRYPTKEY *phKey
);

Parámetros

[in] hKey

Identificador de la clave que se va a duplicar.

[in] pdwReserved

Reservado para uso futuro y debe ser NULL.

[in] dwFlags

Reservado para uso futuro y debe ser cero.

[out] phKey

Dirección del identificador a la clave duplicada. Cuando haya terminado de usar la clave, libere el identificador llamando a la función CryptDestroyKey .

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es distinto de cero (TRUE).

Si se produce un error en la función, el valor devuelto es cero (FALSE). Para obtener información de error extendida, llame a GetLastError.

El código de error precedido por "NTE" lo genera el CSP en particular que se usa. Algunos códigos de error posibles se enumeran en la tabla siguiente.

Código devuelto Descripción
ERROR_CALL_NOT_IMPLEMENTED
Dado que se trata de una nueva función, es posible que los CSP existentes no lo implementen. Este error se devuelve si el CSP no admite esta función.
ERROR_INVALID_PARAMETER
Uno de los parámetros contiene un valor que no es válido. Suele ser un puntero que no es válido.
NTE_BAD_KEY
Un identificador de la clave original no es válido.

Comentarios

CryptDuplicateKey realiza una copia de una clave y el estado exacto de la clave. Un escenario en el que se puede usar esta función es cuando una aplicación necesita cifrar dos mensajes independientes con la misma clave, pero con valores de sal diferentes. La clave original se genera y, a continuación, se realiza una clave duplicada mediante la función CryptDuplicateKey . A continuación, los distintos valores de sal se establecen en las claves originales y duplicadas con llamadas independientes a la función CryptSetKeyParam .

Se debe llamar a CryptDestroyKey para destruir las claves creadas mediante CryptDuplicateKey. Destruir la clave original no hace que se destruya la clave duplicada. Una vez realizada una clave duplicada, es independiente de la clave original. No hay ningún estado compartido entre las dos claves.

Ejemplos

En el ejemplo siguiente se muestra la creación de una clave de sesión que es un duplicado de una clave de sesión existente. Para obtener un ejemplo que incluya el contexto completo de este ejemplo, vea Ejemplo de programa C: duplicación de una clave de sesión.

//--------------------------------------------------------------------
// Declare and initialize variables.

HCRYPTKEY    hDuplicateKey;

// Duplicate the key. hOriginalKey is a previously 
// assigned HCRYPTKEY variable.

if (CryptDuplicateKey(
     hOriginalKey, 
     NULL, 
     0, 
     &hDuplicateKey))
{
   printf("The session key has been duplicated. \n");
}
else
{
   printf("Error using CryptDuplicateKey.\n");
   exit(1);
}

// Insert code that uses the duplicate key here.

// When you have finished using the key, the handle must be released.

if (CryptDestroyKey(hDuplicateKey))
{
  printf("The handle has been released.\n");
}
else
{
  printf("The handle could not be released.\n");
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado wincrypt.h
Library Advapi32.lib
Archivo DLL Advapi32.dll

Consulte también

CryptDestroyKey

CryptSetKeyParam

Funciones de generación y intercambio de claves