CryptGenRandom-Funktion (wincrypt.h)
Syntax
BOOL CryptGenRandom(
[in] HCRYPTPROV hProv,
[in] DWORD dwLen,
[in, out] BYTE *pbBuffer
);
Parameter
[in] hProv
Handle eines Kryptografiedienstanbieters (CSP ), der durch einen Aufruf von CryptAcquireContext erstellt wurde.
[in] dwLen
Anzahl der Bytes der zu generierenden Zufallsdaten.
[in, out] pbBuffer
Puffer zum Empfangen der zurückgegebenen Daten. Dieser Puffer muss mindestens dwLen-Bytes lang sein.
Optional kann die Anwendung diesen Puffer mit Daten füllen, die als zufälliger Hilfswert verwendet werden können.
Rückgabewert
Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich null (TRUE).
Wenn die Funktion fehlschlägt, ist der Rückgabewert 0 (FALSE). Rufen Sie GetLastError auf, um erweiterte Fehlerinformationen zu erhalten.
Die von "NTE" vorangestellten Fehlercodes werden von dem jeweiligen verwendeten CSP generiert. Einige mögliche Fehlercodes sind in der folgenden Tabelle aufgeführt.
Rückgabecode | Beschreibung |
---|---|
|
Einer der Parameter gibt ein ungültiges Handle an. |
|
Einer der Parameter enthält einen ungültigen Wert. Dies ist in den meisten Fällen ein ungültiger Zeiger. |
|
Der hProv-Parameter enthält kein gültiges Kontexthandle. |
|
Die Funktion ist auf unerwartete Weise fehlgeschlagen. |
Hinweise
Die von dieser Funktion erzeugten Daten sind kryptografisch zufällig. Es ist weitaus zufälliger als die Daten, die vom typischen Zufallszahlengenerator generiert werden, z. B. dem, der mit Ihrem C-Compiler geliefert wird.
Diese Funktion wird häufig verwendet, um zufällige Initialisierungsvektoren und Salzwerte zu generieren.
Software-Zufallszahlengeneratoren funktionieren grundsätzlich genauso. Sie beginnen mit einer Zufallszahl, die als Seed bezeichnet wird, und verwenden dann einen Algorithmus, um eine pseudo-zufällige Sequenz von Bits basierend darauf zu generieren. Der schwierigste Teil dieses Prozesses ist es, einen Seed zu erhalten, der wirklich zufällig ist. Dies basiert in der Regel auf der Latenz von Benutzereingaben oder dem Jitter durch eine oder mehrere Hardwarekomponenten.
Bei Microsoft-CSPs verwendet CryptGenRandom den gleichen Zufallszahlengenerator, der auch von anderen Sicherheitskomponenten verwendet wird. Dadurch können zahlreiche Prozesse zu einem systemweiten Seed beitragen. CryptoAPI speichert einen zufälligen Zwischenwert mit jedem Benutzer. Um den Ausgangswert für den Zufallszahlengenerator zu bilden, stellt eine aufrufende Anwendung Bits bereit, die für instance, Maus- oder Tastatur-Timing-Eingaben vorhanden sein könnten, die dann sowohl mit dem gespeicherten Startwert als auch mit verschiedenen Systemdaten und Benutzerdaten wie prozess-ID und Thread-ID, der Systemuhr, der Systemzeit, dem Systemzähler kombiniert werden. Arbeitsspeicher status, kostenlose Datenträgercluster, der Hashbenutzerumgebungsblock. Dieses Ergebnis wird verwendet, um den Pseudorandomzahlengenerator (PRNG) zu seeden. In Windows Vista mit Service Pack 1 (SP1) und höher wird eine Implementierung der in der NIST-Sonderveröffentlichung 800-90 angegebenen AES-Zählermodus-basierten PRNG verwendet. In Windows Vista, Windows Storage Server 2003 und Windows XP wird die in Federal Information Processing Standard (FIPS) 186-2 angegebene PRNG verwendet. Wenn eine Anwendung Zugriff auf eine gute zufallsbasierte Quelle hat, kann sie den pbBuffer-Puffer vor dem Aufruf von CryptGenRandom mit zufallsbasierten Daten füllen. Der CSP verwendet diese Daten dann, um seinen internen Seed weiter zufällig zu erstellen. Es ist akzeptabel, den Schritt der Initialisierung des pbBuffer-Puffers auszulassen, bevor CryptGenRandom aufgerufen wird.
Beispiele
Das folgende Beispiel zeigt die Generierung von 8 zufälligen Bytes. Diese können verwendet werden, um kryptografische Schlüssel zu erstellen oder für jede Anwendung, die Zufallszahlen verwendet. Ein Beispiel, das den vollständigen Kontext für dieses Beispiel enthält, finden Sie unter Beispiel-C-Programm: Duplizieren eines Sitzungsschlüssels.
//--------------------------------------------------------------------
// Declare and initialize variables.
HCRYPTPROV hCryptProv;
BYTE pbData[16];
//--------------------------------------------------------------------
// This code assumes that a cryptographic context has been acquired
// For code details, see "Example C Program: Duplicating a Session
// Key."
//--------------------------------------------------------------------
// Generate a random initialization vector.
if(CryptGenRandom(
hCryptProv,
8,
pbData))
{
printf("Random sequence generated. \n");
}
else
{
printf("Error during CryptGenRandom.\n");
exit(1);
}
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 |