Función CryptDecrypt (wincrypt.h)
Se han realizado cambios importantes para admitir la interoperabilidad de correo electrónico seguro/multipropósito de extensiones de correo de Internet (S/MIME) en CryptoAPI que afectan al control de mensajes sobres. Para obtener más información, vea la sección Comentarios de CryptMsgOpenToEncode.
Sintaxis
BOOL CryptDecrypt(
[in] HCRYPTKEY hKey,
[in] HCRYPTHASH hHash,
[in] BOOL Final,
[in] DWORD dwFlags,
[in, out] BYTE *pbData,
[in, out] DWORD *pdwDataLen
);
Parámetros
[in] hKey
Identificador de la clave que se va a usar para el descifrado. Una aplicación obtiene este identificador mediante la función CryptGenKey o CryptImportKey .
Esta clave especifica el algoritmo de descifrado que se va a usar.
[in] hHash
Identificador de un objeto hash. Si los datos se van a descifrar y aplicar un algoritmo hash simultáneamente, se pasa un identificador a un objeto hash en este parámetro. El valor hash se actualiza con el texto no cifrado descifrado. Esta opción es útil al descifrar y comprobar simultáneamente una firma.
Antes de llamar a CryptDecrypt, la aplicación debe obtener un identificador para el objeto hash mediante una llamada a la función CryptCreateHash . Una vez completado el descifrado, el valor hash se puede obtener mediante la función CryptGetHashParam , también se puede firmar mediante la función CryptSignHash o se puede usar para comprobar una firma digital mediante la función CryptVerifySignature .
Si no se va a realizar ningún hash, este parámetro debe ser cero.
[in] Final
Valor booleano que especifica si se trata de la última sección de una serie que se va a descifrar. Este valor es TRUE si es el último o solo bloque. Si no es el último bloque, este valor es FALSE. Para obtener más información, vea la sección Comentarios.
[in] dwFlags
Se definen los siguientes valores de marca.
Valor | Significado |
---|---|
|
Use el relleno óptimo de cifrado asimétrico (OAEP) (PKCS #1 versión 2). Esta marca solo es compatible con el proveedor criptográfico mejorado de Microsoft con cifrado y descifrado RSA. Esta marca no se puede combinar con la marca CRYPT_DECRYPT_RSA_NO_PADDING_CHECK . |
|
Realice el descifrado en el BLOB sin comprobar el relleno. Esta marca solo es compatible con el proveedor criptográfico mejorado de Microsoft con cifrado y descifrado RSA. Esta marca no se puede combinar con la marca CRYPT_OAEP . |
[in, out] pbData
Puntero a un búfer que contiene los datos que se van a descifrar. Una vez realizado el descifrado, el texto no cifrado se vuelve a colocar en este mismo búfer.
PdwDataLen especifica el número de bytes cifrados de este búfer.
[in, out] pdwDataLen
Puntero a un valor DWORD que indica la longitud del búfer pbData . Antes de llamar a esta función, la aplicación que llama establece el valor DWORD en el número de bytes que se van a descifrar. Tras la devolución, el valor DWORD contiene el número de bytes del texto no cifrado descifrado.
Cuando se usa un cifrado de bloques , esta longitud de datos debe ser un múltiplo del tamaño del bloque a menos que se descifre la sección final de los datos y el parámetro Final sea TRUE.
Valor devuelto
Si la función se ejecuta correctamente, la función devuelve un valor distinto de cero (TRUE).
Si se produce un error en la función, devuelve cero (FALSE). Para obtener información de error extendida, llame a GetLastError.
Los códigos de error precedidos por NTE se generan mediante el CSP concreto que se usa. A continuación se indican algunos códigos de error posibles.
Valor | Descripción |
---|---|
|
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. |
|
La clave de sesiónhKey especifica un algoritmo que este CSP no admite. |
|
Los datos que se van a descifrar no son válidos. Por ejemplo, cuando se usa un cifrado de bloques y la marca Final es FALSE, el valor especificado por pdwDataLen debe ser un múltiplo del tamaño del bloque. Este error también se puede devolver cuando se encuentra que el relleno no es válido. |
|
El parámetro dwFlags es distinto de cero. |
|
El parámetro hHash contiene un identificador que no es válido. |
|
El parámetro hKey no contiene un identificador válido para una clave. |
|
El tamaño del búfer de salida es demasiado pequeño para contener el texto no cifrado generado. |
|
No se encuentra el contexto de CSP que se especificó cuando se creó la clave. |
|
La aplicación intentó descifrar los mismos datos dos veces. |
|
Error en la función de alguna manera inesperada. |
Comentarios
Si se va a descifrar una gran cantidad de datos, se puede realizar en secciones llamando a CryptDecrypt repetidamente. El parámetro Final debe establecerse en TRUE solo en la última llamada a CryptDecrypt, de modo que el motor de descifrado pueda finalizar correctamente el proceso de descifrado. Las siguientes acciones adicionales se realizan cuando Final es TRUE:
- Si la clave es una clave de cifrado de bloque, los datos se rellenan en un múltiplo del tamaño de bloque del cifrado. Para buscar el tamaño de bloque de un cifrado, use CryptGetKeyParam para obtener el valor KP_BLOCKLEN de la clave.
- Si el cifrado funciona en modo de encadenamiento, la siguiente operación CryptDecrypt restablece el registro de comentarios del cifrado al valor KP_IV de la clave.
- Si el cifrado es un cifrado de secuencia, la siguiente llamada a CryptDecrypt restablece el cifrado a su estado inicial.
No hay ninguna manera de establecer el registro de comentarios del cifrado en el valor KP_IV de la clave sin establecer el parámetro Final en TRUE. Si esto es necesario, como en el caso de que no desee agregar un bloque de relleno adicional o cambiar el tamaño de cada bloque, puede simularlo creando un duplicado de la clave original mediante la función CryptDuplicateKey y pasando la clave duplicada a la función CryptDecrypt . Esto hace que la KP_IV de la clave original se coloque en la clave duplicada. Después de crear o importar la clave original, no puede usar la clave original para el cifrado porque se cambiará el registro de comentarios de la clave. El pseudocódigo siguiente muestra cómo se puede hacer esto.
// Set the IV for the original key. Do not use the original key for
// encryption or decryption after doing this because the key's
// feedback register will get modified and you cannot change it.
CryptSetKeyParam(hOriginalKey, KP_IV, newIV)
while(block = NextBlock())
{
// Create a duplicate of the original key. This causes the
// original key's IV to be copied into the duplicate key's
// feedback register.
hDuplicateKey = CryptDuplicateKey(hOriginalKey)
// Decrypt the block with the duplicate key.
CryptDecrypt(hDuplicateKey, block)
// Destroy the duplicate key. Its feedback register has been
// modified by the CryptEncrypt function, so it cannot be used
// again. It will be re-duplicated in the next iteration of the
// loop.
CryptDestroyKey(hDuplicateKey)
}
El proveedor criptográfico mejorado de Microsoft admite el cifrado directo con claves públicasRSA y descifrado con claves privadas RSA. El cifrado usa relleno PKCS #1. En el descifrado, se comprueba este relleno. La longitud de los datos de texto cifrado que se van a descifrar debe ser la misma longitud que el módulo de la clave RSA utilizada para descifrar los datos. Si el texto cifrado tiene ceros en los bytes más significativos, estos bytes deben incluirse en el búfer de datos de entrada y en la longitud del búfer de entrada. El texto cifrado debe estar en formato little-endian .
Ejemplos
Para obtener un ejemplo que usa esta función, vea Ejemplo de programa C: descifrar un archivo.
Requisitos
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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de