Функция CryptUnprotectMemory (dpapi.h)
Функция CryptUnprotectMemory расшифровывает память, зашифрованную с помощью функции CryptProtectMemory .
Синтаксис
DPAPI_IMP BOOL CryptUnprotectMemory(
[in, out] LPVOID pDataIn,
[in] DWORD cbDataIn,
[in] DWORD dwFlags
);
Параметры
[in, out] pDataIn
Указатель на блок памяти для расшифровки. Параметр cbData указывает количество байтов, которые функция попытается расшифровать. Если данные, содержащиеся в пространстве памяти, меньше указанного числа байтов, функция попытается расшифровать данные за пределами предполагаемого блока. Если он больше байтов cbData , расшифровываются только первые байты cbData .
[in] cbDataIn
Количество байтов памяти, на которую указывает параметр pData для расшифровки. Число байтов должно быть кратно константе CRYPTPROTECTMEMORY_BLOCK_SIZE , определенной в Wincrypt.h.
[in] dwFlags
Этот параметр может быть одним из следующих флагов. При шифровании и расшифровке памяти необходимо указать тот же флаг.
Возвращаемое значение
Если функция выполняется успешно, функция возвращает значение TRUE.
Если функция завершается сбоем, она возвращает значение FALSE. Для получения дополнительных сведений об ошибке вызовите Метод GetLastError.
Комментарии
Использование CryptProtectMemory и CryptUnprotectMemory для шифрования паролем небезопасно, так как данные существуют в виде открытого текста в памяти перед их шифрованием и в любое время вызывающий объект расшифровывает их для использования.
Необходимо зашифровать и расшифровать память во время одного сеанса загрузки. Если компьютер перезагрузится перед вызовом функции CryptUnprotectMemory , вы не сможете расшифровать данные.
Необходимо передать один и тот же флаг в CryptUnprotectMemory и CryptProtectMemory. Если передать разные флаги, функция CryptUnprotectMemory будет выполнена успешно; однако результат непредсказуем.
Завершив использование конфиденциальной информации, очистите ее из памяти, вызвав функцию SecureZeroMemory .
Примеры
В следующем примере вызывается функция CryptUnprotectMemory для расшифровки данных, которые хранятся в памяти. В примере предполагается, что переменная pEncryptedText указывает на строку, которая была зашифрована с помощью функции 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;
}
Требования
Минимальная версия клиента | Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2003 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | dpapi.h |
Библиотека | Crypt32.lib |
DLL | Crypt32.dll |