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