Fungsi CryptDecrypt (wincrypt.h)
Perubahan penting untuk mendukung interoperabilitas email Secure/Multipurpose Internet Mail Extensions (S/MIME) telah dilakukan ke CryptoAPI yang memengaruhi penanganan pesan yang diselimuti. Untuk informasi selengkapnya, lihat bagian Keterangan dari CryptMsgOpenToEncode.
Sintaks
BOOL CryptDecrypt(
[in] HCRYPTKEY hKey,
[in] HCRYPTHASH hHash,
[in] BOOL Final,
[in] DWORD dwFlags,
[in, out] BYTE *pbData,
[in, out] DWORD *pdwDataLen
);
Parameter
[in] hKey
Handel ke kunci yang akan digunakan untuk dekripsi. Aplikasi mendapatkan handel ini dengan menggunakan fungsi CryptGenKey atau CryptImportKey .
Kunci ini menentukan algoritma dekripsi yang akan digunakan.
[in] hHash
Handel ke objek hash. Jika data akan didekripsi dan di-hash secara bersamaan, handel ke objek hash diteruskan dalam parameter ini. Nilai hash diperbarui dengan teks biasa yang didekripsi. Opsi ini berguna saat mendekripsi dan memverifikasi tanda tangan secara bersamaan.
Sebelum memanggil CryptDecrypt, aplikasi harus mendapatkan handel ke objek hash dengan memanggil fungsi CryptCreateHash . Setelah dekripsi selesai, nilai hash dapat diperoleh dengan menggunakan fungsi CryptGetHashParam , juga dapat ditandatangani dengan menggunakan fungsi CryptSignHash , atau dapat digunakan untuk memverifikasi tanda tangan digital dengan menggunakan fungsi CryptVerifySignature .
Jika tidak ada hash yang harus dilakukan, parameter ini harus nol.
[in] Final
Nilai Boolean yang menentukan apakah ini adalah bagian terakhir dalam seri yang didekripsi. Nilai ini TRUE jika ini adalah blok terakhir atau satu-satunya. Jika ini bukan blok terakhir, nilai ini adalah FALSE. Untuk informasi selengkapnya, lihat Keterangan.
[in] dwFlags
Nilai bendera berikut ditentukan.
Nilai | Makna |
---|---|
|
Gunakan Padding Enkripsi Asimetris Optimal (OAEP) (PKCS #1 versi 2). Bendera ini hanya didukung oleh Penyedia Kriptografi yang Ditingkatkan Microsoft dengan enkripsi/dekripsi RSA. Bendera ini tidak dapat digabungkan dengan bendera CRYPT_DECRYPT_RSA_NO_PADDING_CHECK . |
|
Lakukan dekripsi pada BLOB tanpa memeriksa padding. Bendera ini hanya didukung oleh Penyedia Kriptografi yang Ditingkatkan Microsoft dengan enkripsi/dekripsi RSA. Bendera ini tidak dapat digabungkan dengan bendera CRYPT_OAEP . |
[in, out] pbData
Penunjuk ke buffer yang berisi data yang akan didekripsi. Setelah dekripsi dilakukan, teks biasa ditempatkan kembali ke buffer yang sama ini.
Jumlah byte terenkripsi dalam buffer ini ditentukan oleh pdwDataLen.
[in, out] pdwDataLen
Penunjuk ke nilai DWORD yang menunjukkan panjang buffer pbData . Sebelum memanggil fungsi ini, aplikasi panggilan menetapkan nilai DWORD ke jumlah byte yang akan didekripsi. Setelah dikembalikan, nilai DWORD berisi jumlah byte dari plaintext yang didekripsi.
Ketika cipher blok digunakan, panjang data ini harus berupa kelipatan ukuran blok kecuali ini adalah bagian akhir data yang akan didekripsi dan parameter Final adalah TRUE.
Nilai kembali
Jika fungsi berhasil, fungsi mengembalikan bukan nol (TRUE).
Jika fungsi gagal, fungsi mengembalikan nol (FALSE). Untuk informasi kesalahan yang diperluas, hubungi GetLastError.
Kode kesalahan yang diawali oleh NTE dihasilkan oleh CSP tertentu yang digunakan. Beberapa kemungkinan kode kesalahan mengikuti.
Nilai | Deskripsi |
---|---|
|
Salah satu parameter menentukan handel yang tidak valid. |
|
Salah satu parameter berisi nilai yang tidak valid. Ini paling sering merupakan pointer yang tidak valid. |
|
Kunci sesihKey menentukan algoritma yang tidak didukung CSP ini. |
|
Data yang akan didekripsi tidak valid. Misalnya, ketika cipher blok digunakan dan bendera Finaladalah FALSE, nilai yang ditentukan oleh pdwDataLen harus kelipatan ukuran blok. Kesalahan ini juga dapat dikembalikan ketika padding ditemukan tidak valid. |
|
Parameter dwFlags bukan nol. |
|
Parameter hHash berisi handel yang tidak valid. |
|
Parameter hKey tidak berisi handel yang valid ke kunci. |
|
Ukuran buffer output terlalu kecil untuk menahan teks biasa yang dihasilkan. |
|
Konteks CSP yang ditentukan ketika kunci dibuat tidak dapat ditemukan. |
|
Aplikasi mencoba mendekripsi data yang sama dua kali. |
|
Fungsi gagal dengan cara yang tidak terduga. |
Keterangan
Jika sejumlah besar data akan didekripsi, data dapat dilakukan di bagian dengan memanggil CryptDecrypt berulang kali. Parameter Final harus diatur ke TRUE hanya pada panggilan terakhir ke CryptDecrypt, sehingga mesin dekripsi dapat menyelesaikan proses dekripsi dengan benar. Tindakan tambahan berikut dilakukan saat Final adalah TRUE:
- Jika kunci adalah kunci cipher blok, data dilapisi ke kelipatan ukuran blok cipher. Untuk menemukan ukuran blok cipher, gunakan CryptGetKeyParam untuk mendapatkan nilai KP_BLOCKLEN kunci.
- Jika sandi beroperasi dalam mode penautan, operasi CryptDecrypt berikutnya mengatur ulang daftar umpan balik cipher ke nilai KP_IV kunci.
- Jika cipher adalah cipher aliran, panggilan CryptDecrypt berikutnya mengatur ulang cipher ke status awalnya.
Tidak ada cara untuk mengatur register umpan balik cipher ke nilai KP_IV kunci tanpa mengatur parameter Final ke TRUE. Jika ini diperlukan, seperti dalam kasus di mana Anda tidak ingin menambahkan blok padding tambahan atau mengubah ukuran setiap blok, Anda dapat mensimulasikan ini dengan membuat duplikat kunci asli dengan menggunakan fungsi CryptDuplicateKey , dan meneruskan kunci duplikat ke fungsi CryptDecrypt . Hal ini menyebabkan KP_IV kunci asli ditempatkan di kunci duplikat. Setelah membuat atau mengimpor kunci asli, Anda tidak dapat menggunakan kunci asli untuk enkripsi karena daftar umpan balik kunci akan diubah. Pseudocode berikut menunjukkan bagaimana hal ini dapat dilakukan.
// Set the IV for the original key. Do not use the original key for
// encryption or decryption after doing this because the key's
// feedback register will get modified and you cannot change it.
CryptSetKeyParam(hOriginalKey, KP_IV, newIV)
while(block = NextBlock())
{
// Create a duplicate of the original key. This causes the
// original key's IV to be copied into the duplicate key's
// feedback register.
hDuplicateKey = CryptDuplicateKey(hOriginalKey)
// Decrypt the block with the duplicate key.
CryptDecrypt(hDuplicateKey, block)
// Destroy the duplicate key. Its feedback register has been
// modified by the CryptEncrypt function, so it cannot be used
// again. It will be re-duplicated in the next iteration of the
// loop.
CryptDestroyKey(hDuplicateKey)
}
Penyedia Kriptografi yang Ditingkatkan Microsoft mendukung enkripsi langsung dengan kunci publikRSA dan dekripsi dengan kunci privat RSA. Enkripsi menggunakan PKCS #1 padding. Pada dekripsi, padding ini diverifikasi. Panjang data ciphertext yang akan didekripsi harus memiliki panjang yang sama dengan modulus kunci RSA yang digunakan untuk mendekripsi data. Jika ciphertext memiliki nol dalam byte yang paling signifikan, byte ini harus disertakan dalam buffer data input dan dalam panjang buffer input. Ciphertext harus dalam format little-endian .
Contoh
Untuk contoh yang menggunakan fungsi ini, lihat Contoh Program C: Mendekripsi File.
Persyaratan
Klien minimum yang didukung | Windows XP [hanya aplikasi desktop] |
Server minimum yang didukung | Windows Server 2003 [hanya aplikasi desktop] |
Target Platform | Windows |
Header | wincrypt.h |
Pustaka | Advapi32.lib |
DLL | Advapi32.dll |
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk