CryptDuplicateHash-Funktion (wincrypt.h)
Die CryptDuplicateHash-Funktion erstellt eine exakte Kopie eines Hashs bis zu dem Punkt, an dem die Duplizierung abgeschlossen ist. Der doppelte Hash enthält den Status des Hashs.
Ein Hash kann Stück für Stück erstellt werden. Die CryptDuplicateHash-Funktion kann verwendet werden, um separate Hashes von zwei verschiedenen Inhalten zu erstellen, die mit demselben Inhalt beginnen.
Syntax
BOOL CryptDuplicateHash(
[in] HCRYPTHASH hHash,
[in] DWORD *pdwReserved,
[in] DWORD dwFlags,
[out] HCRYPTHASH *phHash
);
Parameter
[in] hHash
Handle des zu duplizierenden Hashs.
[in] pdwReserved
Für die zukünftige Verwendung reserviert und muss null sein.
[in] dwFlags
Für die zukünftige Verwendung reserviert und muss null sein.
[out] phHash
Adresse des Handle des duplizierten Hashs. Wenn Sie den Hash verwendet haben, lassen Sie das Handle los, indem Sie die Funktion CryptDestroyHash aufrufen.
Rückgabewert
Wenn die Funktion erfolgreich ist, gibt die Funktion TRUE zurück.
Wenn die Funktion fehlschlägt, gibt sie FALSE zurück. Rufen Sie GetLastError auf, um erweiterte Fehlerinformationen zu erhalten.
Der von "NTE" vorangestellte Fehlercode wird vom jeweiligen Kryptografiedienstanbieter (CSP) generiert, den Sie verwenden. Es folgen einige mögliche Fehlercodes.
Rückgabecode | Beschreibung |
---|---|
|
Da es sich um eine neue Funktion handelt, können vorhandene CSPs sie nicht implementieren. Dieser Fehler wird zurückgegeben, wenn der CSP diese Funktion nicht unterstützt. |
|
Einer der Parameter enthält einen ungültigen Wert. Dies ist in den meisten Fällen ein nicht gültiger Zeiger. |
|
Ein Handle für den ursprünglichen Hash ist ungültig. |
Hinweise
CryptDuplicateHash erstellt eine Kopie eines Hashs und des genauen Zustands des Hashs. Diese Funktion kann verwendet werden, wenn eine aufrufende Anwendung zwei Hashes generieren musste, aber beide Hashes mit einigen gängigen Daten beginnen mussten. Beispielsweise kann ein Hash erstellt werden, die allgemeinen Daten hashed, ein Duplikat mit der CryptDuplicateHash-Funktion erstellt werden, und dann würden die für jeden Hash eindeutigen Daten hinzugefügt.
Die CryptDestroyHash-Funktion muss aufgerufen werden, um alle Hashes zu zerstören, die mit CryptDuplicateHash erstellt werden. Das Zerstören des ursprünglichen Hashs führt nicht dazu, dass der doppelte Hash zerstört wird. Nachdem ein doppelter Hash erstellt wurde, ist er vom ursprünglichen Hash getrennt. Es gibt keinen freigegebenen Zustand zwischen den beiden Hashes.
Beispiele
Das folgende Beispiel zeigt das Erstellen einer exakten Kopie eines Hashs. Ein Beispiel, das den vollständigen Kontext für dieses Beispiel enthält, finden Sie unter Beispiel C-Programm: Duplizieren eines Hashs.
//-------------------------------------------------------------------
// 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);
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows XP [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | wincrypt.h |
Bibliothek | Advapi32.lib |
DLL | Advapi32.dll |