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
このパラメーターには、次のいずれかのフラグを指定できます。 メモリの暗号化と暗号化解除を行う場合は、同じフラグを指定する必要があります。
戻り値
関数が成功した場合、関数は 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 |
ヘッダー | dpapi.h |
Library | Crypt32.lib |
[DLL] | Crypt32.dll |