Fungsi CryptDeriveKey (wincrypt.h)
Fungsi ini sama dengan CryptGenKey, kecuali bahwa kunci sesi yang dihasilkan berasal dari data dasar alih-alih acak. CryptDeriveKey hanya dapat digunakan untuk menghasilkan kunci sesi. Ini tidak dapat menghasilkan pasangan kunci publik/privat .
Handel ke kunci sesi dikembalikan dalam parameter phKey
Sintaksis
BOOL CryptDeriveKey(
[in] HCRYPTPROV hProv,
[in] ALG_ID Algid,
[in] HCRYPTHASH hBaseData,
[in] DWORD dwFlags,
[in, out] HCRYPTKEY *phKey
);
Parameter
[in] hProv
Handel HCRYPTPROV
[in] Algid
Struktur ALG_ID yang mengidentifikasi enkripsi simetris algoritma yang kuncinya akan dihasilkan. Algoritma yang tersedia kemungkinan besar akan berbeda untuk setiap CSP. Untuk informasi selengkapnya tentang pengidentifikasi algoritma mana yang digunakan oleh penyedia yang berbeda untuk spesifikasi utama AT_KEYEXCHANGE dan AT_SIGNATURE, lihat ALG_ID.
Untuk informasi selengkapnya tentang nilai ALG_ID yang akan digunakan dengan Penyedia Kriptografi Microsoft Base, lihat Algoritma Penyedia Dasar . Untuk informasi selengkapnya tentang nilai ALG_ID yang akan digunakan dengan Penyedia Kriptografi Kuat Microsoft atau Penyedia Kriptografi Yang Ditingkatkan Microsoft, lihat Algoritma Penyedia yang Ditingkatkan.
[in] hBaseData
Handel ke objek hash yang telah diberi makan data dasar yang tepat.
Untuk mendapatkan handel ini, aplikasi harus terlebih dahulu membuat objek hash dengan CryptCreateHash lalu menambahkan data dasar ke objek hash dengan CryptHashData. Proses ini dijelaskan secara rinci dalam Hash dan Tanda Tangan Digital.
[in] dwFlags
Menentukan jenis kunci yang dihasilkan.
Ukuran kunci sesi dapat diatur saat kunci dihasilkan. Ukuran kunci, yang mewakili panjang modulus kunci dalam bit, diatur dengan 16 bit atas parameter ini. Dengan demikian, jika kunci sesi RC4
16 bit yang lebih rendah dari parameter ini bisa nol atau Anda dapat menentukan satu atau beberapa bendera berikut dengan menggunakan operator bitwise-ATAU untuk menggabungkannya.
Nilai | Arti |
---|---|
|
Biasanya, ketika kunci sesi dibuat dari nilai hash Jika bendera ini diatur, maka kunci diberi nilai garam berdasarkan bit nilai hash yang tidak digunakan. Anda dapat mengambil nilai garam Jika bendera ini tidak diatur, maka kunci diberi nilai garam nol. Ketika kunci dengan nilai garam nonzero diekspor (dengan menggunakan CryptExportKey), nilai garam juga harus diperoleh dan disimpan dengan kunci BLOB. |
|
Jika bendera ini diatur, kunci sesi dapat ditransfer keluar dari CSP ke blob kunci melalui fungsi CryptExportKey. Karena kunci umumnya harus dapat diekspor, bendera ini biasanya harus diatur.
Jika bendera ini tidak diatur, maka kunci sesi tidak dapat diekspor. Ini berarti kunci hanya tersedia dalam sesi saat ini dan hanya aplikasi yang membuatnya yang dapat menggunakannya. Bendera ini tidak berlaku untuk pasangan kunci publik/privat. |
|
Bendera ini menentukan bahwa nilai garam tanpa dialokasikan untuk kunci konten 40-bit. Untuk informasi selengkapnya, lihat Fungsionalitas Nilai Garam . |
|
Beberapa CSP menggunakan kunci sesi yang berasal dari beberapa nilai hash. Jika demikian, CryptDeriveKey harus dipanggil beberapa kali.
Jika bendera ini diatur, kunci sesi baru tidak dihasilkan. Sebagai gantinya, kunci yang ditentukan oleh phKey dimodifikasi. Perilaku tepat dari bendera ini tergantung pada jenis kunci yang dihasilkan dan pada CSP tertentu yang digunakan. Penyedia layanan kriptografi Microsoft mengabaikan bendera ini. |
|
Bendera ini hanya digunakan dengan penyedia |
[in, out] phKey
Penunjuk ke variabel HCRYPTKEY
Mengembalikan nilai
Jika fungsi berhasil, fungsi mengembalikan nonzero (TRUE).
Jika fungsi gagal, fungsi akan mengembalikan nol (FALSE). Untuk informasi kesalahan yang diperluas, panggil GetLastError.
Kode kesalahan yang diawali oleh "NTE" dihasilkan oleh CSP tertentu yang digunakan. Beberapa kemungkinan kode kesalahan tercantum dalam tabel berikut.
Mengembalikan kode | 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. |
|
Parameter |
|
Parameter |
|
Parameter |
|
Upaya dilakukan untuk menambahkan data ke objek hash yang sudah ditandai "selesai." |
|
Parameter hProv |
|
Fungsi gagal dengan cara yang tidak terduga. |
|
Penyedia tidak dapat melakukan tindakan karena konteks diperoleh sebagai senyap. |
Komentar
Ketika kunci dihasilkan untuk
Fungsi
Untuk memilih panjang kunci yang sesuai, metode berikut disarankan.
- Untuk menghitung algoritma yang didukung CSP dan untuk mendapatkan panjang kunci maksimum dan minimum untuk setiap algoritma, panggil CryptGetProvParam dengan PP_ENUMALGS_EX.
- Gunakan panjang minimum dan maksimum untuk memilih panjang kunci yang sesuai. Tidak selalu disarankan untuk memilih panjang maksimum karena ini dapat menyebabkan masalah performa.
- Setelah panjang kunci yang diinginkan dipilih, gunakan 16 bit atas parameter dwFlags untuk menentukan panjang kunci.
- Bentuk buffer 64 byte dengan mengulangi konstanta 0x36 64 kali. Biarkan k panjang nilai hash yang diwakili oleh parameter input hBaseData. Atur byte
k pertama dari buffer ke hasil operasi XOR dari byte k pertama dari buffer dengan nilai hash yang diwakili oleh parameter input hBaseData . - Bentuk buffer 64 byte dengan mengulangi konstanta 0x5C 64 kali. Atur byte
k pertama dari buffer ke hasil operasi XOR dari byte k pertama dari buffer dengan nilai hash yang diwakili oleh parameter input hBaseData . - Hash hasil langkah 1 dengan menggunakan algoritma hash yang sama seperti yang digunakan untuk menghitung nilai hash yang diwakili oleh parameter
hBaseData. - Hash hasil langkah 2 dengan menggunakan algoritma hash yang sama seperti yang digunakan untuk menghitung nilai hash yang diwakili oleh parameter
hBaseData. - Menggabungkan hasil langkah 3 dengan hasil langkah 4.
- Gunakan byte pertama n dari hasil langkah 5 sebagai kunci turunan.
Tabel berikut mencantumkan panjang kunci minimum, default, dan maksimum untuk kunci sesi menurut algoritma dan penyedia.
Penyedia | Algoritma | Panjang kunci minimum | Panjang kunci default | Panjang kunci maksimum |
---|---|---|---|---|
Basis MS | RC4 dan RC2 | 40 | 40 | 56 |
Basis MS | DES | 56 | 56 | 56 |
MS Ditingkatkan | RC4 dan RC2 | 40 | 128 | 128 |
MS Ditingkatkan | DES | 56 | 56 | 56 |
MS Ditingkatkan | 3DES 112 | 112 | 112 | 112 |
MS Ditingkatkan | 3DES | 168 | 168 | 168 |
MS Strong | RC4 dan RC2 | 40 | 128 | 128 |
MS Strong | DES | 56 | 56 | 56 |
MS Strong | 3DES 112 | 112 | 112 | 112 |
MS Strong | 3DES | 168 | 168 | 168 |
Basis DSS/DH | RC4 dan RC2 | 40 | 40 | 56 |
Basis DSS/DH | Cylink MEK | 40 | 40 | 40 |
Basis DSS/DH | DES | 56 | 56 | 56 |
DSS/DH Enh | RC4 dan RC2 | 40 | 128 | 128 |
DSS/DH Enh | Cylink MEK | 40 | 40 | 40 |
DSS/DH Enh | DES | 56 | 56 | 56 |
DSS/DH Enh | 3DES 112 | 112 | 112 | 112 |
DSS/DH Enh | 3DES | 168 | 168 | 168 |
Contoh
Untuk contoh yang menggunakan fungsi ini, lihat Contoh Program C: Mendapatkan Kunci Sesi dari Kata Sandi.
Persyaratan
Syarat | Nilai |
---|---|
klien minimum yang didukung | Windows XP [hanya aplikasi desktop] |
server minimum yang didukung |
Windows Server 2003 [hanya aplikasi desktop] |
Platform Target |
Windows |
Header |
wincrypt.h |
Pustaka |
Advapi32.lib |
DLL |
Advapi32.dll |
Lihat juga