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 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 |