Função CryptUnprotectMemory (dpapi.h)

A função CryptUnprotectMemory descriptografa a memória que foi criptografada usando a função CryptProtectMemory .

Sintaxe

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

Parâmetros

[in, out] pDataIn

Um ponteiro para o bloco de memória a ser descriptografado. O parâmetro cbData especifica o número de bytes que a função tentará descriptografar. Se os dados contidos no espaço de memória forem menores do que o número de bytes especificados, a função tentará descriptografar dados fora do bloco pretendido. Se for maior que cbData bytes, somente os primeiros bytes cbData serão descriptografados.

[in] cbDataIn

Número de bytes de memória apontados pelo parâmetro pData a ser descriptografado. O número de bytes deve ser um múltiplo da constante CRYPTPROTECTMEMORY_BLOCK_SIZE definida em Wincrypt.h.

[in] dwFlags

Esse parâmetro pode ser um dos sinalizadores a seguir. Você deve especificar o mesmo sinalizador ao criptografar e descriptografar a memória.

Valor Significado
CRYPTPROTECTMEMORY_SAME_PROCESS
Criptografar e descriptografar a memória no mesmo processo. Um aplicativo em execução em um processo diferente não poderá descriptografar os dados.
CRYPTPROTECTMEMORY_CROSS_PROCESS
Criptografar e descriptografar a memória em processos diferentes. Um aplicativo em execução em um processo diferente poderá descriptografar os dados.
CRYPTPROTECTMEMORY_SAME_LOGON
Use as mesmas credenciais de logon para criptografar e descriptografar a memória em processos diferentes. Um aplicativo em execução em um processo diferente poderá descriptografar os dados. No entanto, o processo deve ser executado como o mesmo usuário que criptografou os dados e na mesma sessão de logon.

Valor retornado

Se a função for bem-sucedida, a função retornará TRUE.

Se a função falhar, ela retornará FALSE. Para obter informações de erro estendidas, chame GetLastError.

Comentários

O uso de CryptProtectMemory e CryptUnprotectMemory para criptografia de senha não é seguro porque os dados existem como texto não criptografado na memória antes de serem criptografados e, a qualquer momento, o chamador os descriptografa para uso.

Você deve criptografar e descriptografar a memória durante a mesma sessão de inicialização. Se o computador for reiniciado antes de você chamar a função CryptUnprotectMemory , você não poderá descriptografar os dados.

Você deve passar o mesmo sinalizador para CryptUnprotectMemory e CryptProtectMemory. Se você passar sinalizadores diferentes, a função CryptUnprotectMemory terá êxito; no entanto, o resultado é imprevisível.

Quando terminar de usar as informações confidenciais, limpe-as da memória chamando a função SecureZeroMemory .

Exemplos

O exemplo a seguir chama a função CryptUnprotectMemory para descriptografar dados que estão na memória. O exemplo pressupõe que a variável pEncryptedText aponta para uma cadeia de caracteres que foi criptografada usando a função 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 com suporte Windows Vista [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho dpapi.h
Biblioteca Crypt32.lib
DLL Crypt32.dll

Confira também

CryptProtectMemory

CryptUnprotectData

RtlDecryptMemory

RtlEncryptMemory