Fungsi CryptDuplicateHash (wincrypt.h)
Fungsi CryptDuplicateHash membuat salinan hash yang tepat ke titik ketika duplikasi dilakukan. Hash duplikat mencakup status hash.
Hash dapat dibuat dengan cara sepotong demi sepotong. Fungsi CryptDuplicateHash dapat digunakan untuk membuat hash terpisah dari dua konten berbeda yang dimulai dengan konten yang sama.
Sintaks
BOOL CryptDuplicateHash(
[in] HCRYPTHASH hHash,
[in] DWORD *pdwReserved,
[in] DWORD dwFlags,
[out] HCRYPTHASH *phHash
);
Parameter
[in] hHash
Tangani hash yang akan diduplikasi.
[in] pdwReserved
Dicadangkan untuk digunakan di masa mendatang dan harus nol.
[in] dwFlags
Dicadangkan untuk digunakan di masa mendatang dan harus nol.
[out] phHash
Alamat handel hash duplikat. Setelah Anda selesai menggunakan hash, lepaskan handel dengan memanggil fungsi CryptDestroyHash .
Mengembalikan nilai
Jika fungsi berhasil, fungsi mengembalikan TRUE.
Jika fungsi gagal, fungsi akan mengembalikan FALSE. Untuk informasi kesalahan yang diperluas, hubungi GetLastError.
Kode kesalahan yang diawali oleh "NTE" dihasilkan oleh penyedia layanan kriptografi (CSP) tertentu yang Anda gunakan. Beberapa kemungkinan kode kesalahan mengikuti.
Menampilkan kode | Deskripsi |
---|---|
|
Karena ini adalah fungsi baru, CSP yang ada tidak dapat menerapkannya. Kesalahan ini dikembalikan jika CSP tidak mendukung fungsi ini. |
|
Salah satu parameter berisi nilai yang tidak valid. Ini paling sering merupakan pointer yang tidak valid. |
|
Handel ke hash asli tidak valid. |
Keterangan
CryptDuplicateHash membuat salinan hash dan status hash yang tepat. Fungsi ini dapat digunakan jika aplikasi panggilan diperlukan untuk menghasilkan dua hash tetapi kedua hash harus dimulai dengan beberapa data umum yang di-hash. Misalnya, hash mungkin dibuat, data umum di-hash, duplikat yang dibuat dengan fungsi CryptDuplicateHash , dan kemudian data yang unik untuk setiap hash akan ditambahkan.
Fungsi CryptDestroyHash harus dipanggil untuk menghancurkan hash apa pun yang dibuat dengan CryptDuplicateHash. Menghancurkan hash asli tidak menyebabkan hash duplikat dihancurkan. Setelah hash duplikat dibuat, hash tersebut terpisah dari hash asli. Tidak ada status bersama di antara dua hash.
Contoh
Contoh berikut menunjukkan pembuatan salinan hash yang tepat. Untuk contoh yang menyertakan konteks lengkap untuk contoh ini, lihat Contoh Program C: Menduplikasi Hash.
//-------------------------------------------------------------------
// Declare and initialize variables.
HCRYPTPROV hCryptProv = NULL;
HCRYPTHASH hOriginalHash = NULL;
HCRYPTHASH hDuplicateHash = NULL;
//-------------------------------------------------------------------
// Acquire a CSP context.
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
0))
{
printf("CryptAcquireContext succeeded. \n");
}
else
{
printf("Error during CryptAcquireContext.\n");
exit(1);
}
//-------------------------------------------------------------------
// Create a hash.
if (CryptCreateHash(
hCryptProv,
CALG_SHA1,
0,
0,
&hOriginalHash))
{
printf("An empty hash object has been created. \n");
}
else
{
printf("Error during CryptCreateHash.\n");
exit(1);
}
//-------------------------------------------------------------------
// Hash a BYTE string.
if (CryptHashData(
hOriginalHash,
(BYTE*)"Some Common Data",
sizeof("Some Common Data"), 0))
{
printf("An original hash has been created. \n");
}
else
{
printf("Error during CryptHashData.\n");
exit(1);
}
//-------------------------------------------------------------------
// Duplicate the hash.
if (CryptDuplicateHash(
hOriginalHash,
NULL,
0,
&hDuplicateHash))
{
printf("The hash has been duplicated. \n");
}
else
{
printf("Error during CryptDuplicateHash.\n");
exit(1);
}
//-------------------------------------------------------------------
// At this point, the two hash objects are exactly the same.
// The two hash objects can be handled separately.
// When all processing on the hash object is completed,
// both objects should be destroyed, and the cryptographic
// context should be released.
//-------------------------------------------------------------------
// Destroy the original hash.
if(CryptDestroyHash(hOriginalHash))
{
printf("The original hash has been destroyed. \n");
}
else
{
printf("Error during CryptDestroyHash on the original "
"hash object.\n");
exit(1);
}
//-------------------------------------------------------------------
// Destroy the duplicate hash.
if (CryptDestroyHash(hDuplicateHash))
{
printf("The duplicate hash has been destroyed. \n");
}
else
{
printf("Error during CryptDestroyHash on the duplicated hash object.\n");
exit(1);
}
//-------------------------------------------------------------------
// Release the CSP.
if(hCryptProv)
CryptReleaseContext(hCryptProv,0);
Persyaratan
Persyaratan | Nilai |
---|---|
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 |