Compartir a través de


Función CryptUnprotectMemory (dpapi.h)

La función CryptUnprotectMemory descifra la memoria cifrada mediante la función CryptProtectMemory .

Sintaxis

DPAPI_IMP BOOL CryptUnprotectMemory(
  [in, out] LPVOID pDataIn,
  [in]      DWORD  cbDataIn,
  [in]      DWORD  dwFlags
);

Parámetros

[in, out] pDataIn

Puntero al bloque de memoria que se va a descifrar. El parámetro cbData especifica el número de bytes que la función intentará descifrar. Si los datos contenidos en el espacio de memoria son menores que el número de bytes especificados, la función intentará descifrar los datos fuera del bloque previsto. Si es mayor que cbData bytes, solo se descifrarán los primeros bytes cbData .

[in] cbDataIn

Número de bytes de memoria a los que apunta el parámetro pData que se va a descifrar. El número de bytes debe ser un múltiplo de la CRYPTPROTECTMEMORY_BLOCK_SIZE constante definida en Wincrypt.h.

[in] dwFlags

Este parámetro puede ser una de las marcas siguientes. Debe especificar la misma marca al cifrar y descifrar la memoria.

Valor Significado
CRYPTPROTECTMEMORY_SAME_PROCESS
Cifre y descifre la memoria en el mismo proceso. Una aplicación que se ejecuta en un proceso diferente no podrá descifrar los datos.
CRYPTPROTECTMEMORY_CROSS_PROCESS
Cifre y descifre la memoria en diferentes procesos. Una aplicación que se ejecuta en un proceso diferente podrá descifrar los datos.
CRYPTPROTECTMEMORY_SAME_LOGON
Use las mismas credenciales de inicio de sesión para cifrar y descifrar la memoria en diferentes procesos. Una aplicación que se ejecuta en un proceso diferente podrá descifrar los datos. Sin embargo, el proceso debe ejecutarse como el mismo usuario que cifró los datos y en la misma sesión de inicio de sesión.

Valor devuelto

Si la función se ejecuta correctamente, la función devuelve TRUE.

Si se produce un error en la función, devuelve FALSE. Para obtener información de error extendida, llame a GetLastError.

Comentarios

El uso de CryptProtectMemory y CryptUnprotectMemory para el cifrado de contraseñas no es seguro porque los datos existen como texto no cifrado en la memoria antes de que se cifre y en cualquier momento el autor de la llamada lo descifra para su uso.

Debe cifrar y descifrar la memoria durante la misma sesión de arranque. Si el equipo se reinicia antes de llamar a la función CryptUnprotectMemory , no podrá descifrar los datos.

Debe pasar la misma marca a CryptUnprotectMemory y CryptProtectMemory. Si pasa marcas diferentes, la función CryptUnprotectMemory se realiza correctamente; sin embargo, el resultado es impredecible.

Cuando haya terminado de usar la información confidencial, desactive la memoria llamando a la función SecureZeroMemory .

Ejemplos

En el ejemplo siguiente se llama a la función CryptUnprotectMemory para descifrar los datos que están en memoria. En el ejemplo se supone que la variable pEncryptedText apunta a una cadena que se ha cifrado mediante la función CryptProtectMemory .

#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>
#include <strsafe.h>
#pragma comment(lib, "crypt32.lib")

void main()
{
    LPWSTR pEncryptedText;  // contains the encrypted text
    DWORD cbEncryptedText;  // number of bytes to which 
	                        // pEncryptedText points

    if (CryptUnprotectMemory(pEncryptedText, cbEncryptedText, 
		CRYPTPROTECTMEMORY_SAME_PROCESS))
    {
        // Use the decrypted string.
    }
    else
    {
        wprintf(L"CryptUnprotectMemory failed: %d\n", 
			GetLastError());
    }

    // Clear and free memory after using
    // the decrypted string or if an error occurs. 
    SecureZeroMemory(pEncryptedText, cbEncryptedText);
    LocalFree(pEncryptedText);
    pEncryptedText = NULL;
}

Requisitos

   
Cliente mínimo compatible Windows Vista [aplicaciones de escritorio | aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado dpapi.h
Library Crypt32.lib
Archivo DLL Crypt32.dll

Consulte también

CryptProtectMemory

CryptUnprotectData

RtlDecryptMemory

RtlEncryptMemory