Функция 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

Этот параметр может быть одним из следующих флагов. При шифровании и расшифровке памяти необходимо указать тот же флаг.

Значение Значение
CRYPTPROTECTMEMORY_SAME_PROCESS
Шифрование и расшифровка памяти в одном процессе. Приложение, работающее в другом процессе, не сможет расшифровать данные.
CRYPTPROTECTMEMORY_CROSS_PROCESS
Шифрование и расшифровка памяти в разных процессах. Приложение, выполняющееся в другом процессе, сможет расшифровать данные.
CRYPTPROTECTMEMORY_SAME_LOGON
Используйте одни и те же учетные данные входа для шифрования и расшифровки памяти в разных процессах. Приложение, выполняющееся в другом процессе, сможет расшифровать данные. Однако процесс должен выполняться от имени того же пользователя, который зашифровал данные, и в том же сеансе входа.

Возвращаемое значение

Если функция выполняется успешно, функция возвращает значение 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

См. также раздел

CryptProtectMemory

CryptUnprotectData

RtlDecryptMemory

RtlEncryptMemory