Bagikan melalui


Fungsi CryptUnprotectMemory (dpapi.h)

Fungsi CryptUnprotectMemory mendekripsi memori yang dienkripsi menggunakan fungsi CryptProtectMemory .

Sintaks

DPAPI_IMP BOOL CryptUnprotectMemory(
  [in, out] LPVOID pDataIn,
  [in]      DWORD  cbDataIn,
  [in]      DWORD  dwFlags
);

Parameter

[in, out] pDataIn

Penunjuk ke blok memori untuk didekripsi. Parameter cbData menentukan jumlah byte yang akan coba didekripsi oleh fungsi. Jika data yang terkandung dalam ruang memori lebih kecil dari jumlah byte yang ditentukan, fungsi akan mencoba mendekripsi data di luar blok yang dimaksudkan. Jika lebih besar dari byte cbData , maka hanya byte cbData pertama yang akan didekripsi.

[in] cbDataIn

Jumlah byte memori yang ditunjukkan oleh parameter pData untuk didekripsi. Jumlah byte harus kelipatan konstanta CRYPTPROTECTMEMORY_BLOCK_SIZE yang ditentukan dalam Wincrypt.h.

[in] dwFlags

Parameter ini bisa menjadi salah satu bendera berikut. Anda harus menentukan bendera yang sama saat mengenkripsi dan mendekripsi memori.

Nilai Makna
CRYPTPROTECTMEMORY_SAME_PROCESS
Mengenkripsi dan mendekripsi memori dalam proses yang sama. Aplikasi yang berjalan dalam proses yang berbeda tidak akan dapat mendekripsi data.
CRYPTPROTECTMEMORY_CROSS_PROCESS
Mengenkripsi dan mendekripsi memori dalam proses yang berbeda. Aplikasi yang berjalan dalam proses yang berbeda akan dapat mendekripsi data.
CRYPTPROTECTMEMORY_SAME_LOGON
Gunakan kredensial masuk yang sama untuk mengenkripsi dan mendekripsi memori dalam proses yang berbeda. Aplikasi yang berjalan dalam proses yang berbeda akan dapat mendekripsi data. Namun, proses harus berjalan sebagai pengguna yang sama yang mengenkripsi data dan dalam sesi masuk yang sama.

Mengembalikan nilai

Jika fungsi berhasil, fungsi mengembalikan TRUE.

Jika fungsi gagal, fungsi akan mengembalikan FALSE. Untuk informasi kesalahan yang diperluas, hubungi GetLastError.

Keterangan

Menggunakan CryptProtectMemory dan CryptUnprotectMemory untuk enkripsi kata sandi tidak aman karena data ada sebagai teks biasa dalam memori sebelum dienkripsi dan kapan saja pemanggil mendekripsinya untuk digunakan.

Anda harus mengenkripsi dan mendekripsi memori selama sesi boot yang sama. Jika komputer dimulai ulang sebelum Anda memanggil fungsi CryptUnprotectMemory , Anda tidak akan dapat mendekripsi data.

Anda harus meneruskan bendera yang sama ke CryptUnprotectMemory dan CryptProtectMemory. Jika Anda meneruskan bendera yang berbeda, fungsi CryptUnprotectMemory berhasil; namun, hasilnya tidak dapat diprediksi.

Setelah Anda selesai menggunakan informasi sensitif, bersihkan dari memori dengan memanggil fungsi SecureZeroMemory .

Contoh

Contoh berikut memanggil fungsi CryptUnprotectMemory untuk mendekripsi data yang ada di memori. Contoh mengasumsikan variabel pEncryptedText menunjuk ke string yang telah dienkripsi menggunakan fungsi 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;
}

Persyaratan

   
Klien minimum yang didukung Windows Vista [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2003 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header dpapi.h
Pustaka Crypt32.lib
DLL Crypt32.dll

Lihat juga

CryptProtectMemory

CryptUnprotectData

RtlDecryptMemory

RtlEncryptMemory