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
Library Crypt32.lib
[DLL] Crypt32.dll

関連項目

CryptProtectMemory

CryptUnprotectData

RtlDecryptMemory

RtlEncryptMemory