다음을 통해 공유


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 매개 변수가 가리키는 메모리 바이트 수입니다. 바이트 수는 Wincrypt.h에 정의된 CRYPTPROTECTMEMORY_BLOCK_SIZE 상수의 배수여야 합니다.

[in] dwFlags

이 매개 변수는 다음 플래그 중 하나일 수 있습니다. 메모리를 암호화하고 암호 해독할 때 동일한 플래그를 지정해야 합니다.

의미
CRYPTPROTECTMEMORY_SAME_PROCESS
동일한 프로세스에서 메모리를 암호화하고 암호 해독합니다. 다른 프로세스에서 실행되는 애플리케이션은 데이터의 암호를 해독할 수 없습니다.
CRYPTPROTECTMEMORY_CROSS_PROCESS
다양한 프로세스에서 메모리를 암호화하고 암호 해독합니다. 다른 프로세스에서 실행되는 애플리케이션은 데이터의 암호를 해독할 수 있습니다.
CRYPTPROTECTMEMORY_SAME_LOGON
동일한 로그온 자격 증명을 사용하여 다른 프로세스에서 메모리를 암호화하고 암호 해독합니다. 다른 프로세스에서 실행되는 애플리케이션은 데이터의 암호를 해독할 수 있습니다. 그러나 프로세스는 데이터를 암호화한 동일한 사용자와 동일한 로그온 세션에서 실행되어야 합니다.

반환 값

함수가 성공하면 함수는 TRUE를 반환합니다.

함수가 실패하면 FALSE를 반환합니다. 확장된 오류 정보는 GetLastError를 호출합니다.

설명

암호 암호화 에 CryptProtectMemoryCryptUnprotectMemory 를 사용하는 것은 데이터가 암호화되기 전에 메모리에 일반 텍스트로 존재하고 호출자가 사용하기 위해 암호를 해독하기 때문에 안전하지 않습니다.

동일한 부팅 세션 동안 메모리를 암호화하고 암호 해독해야 합니다. CryptUnprotectMemory 함수를 호출하기 전에 컴퓨터를 다시 시작하면 데이터의 암호를 해독할 수 없습니다.

동일한 플래그를 CryptUnprotectMemoryCryptProtectMemory에 전달해야 합니다. 다른 플래그를 전달하면 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
헤더 dpapi.h
라이브러리 Crypt32.lib
DLL Crypt32.dll

추가 정보

CryptProtectMemory

CryptUnprotectData

RtlDecryptMemory

RtlEncryptMemory