Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Funktion "BCryptDeriveKey " leitet einen Schlüssel von einem BCRYPT_SECRET_HANDLE ab. Dies erfolgt in der Regel im Rahmen eines Geheimvertragsverfahrens.
Die Schlüsselableitung von einem geheimen Schlüssel, der direkt vom Aufrufer bereitgestellt wird, finden Sie unter "BCryptKeyDerivation".
Syntax
NTSTATUS BCryptDeriveKey(
[in] BCRYPT_SECRET_HANDLE hSharedSecret,
[in] LPCWSTR pwszKDF,
[in, optional] BCryptBufferDesc *pParameterList,
[out, optional] PUCHAR pbDerivedKey,
[in] ULONG cbDerivedKey,
[out] ULONG *pcbResult,
[in] ULONG dwFlags
);
Parameter
[in] hSharedSecret
Der geheime Handle zum Erstellen des Schlüssels aus. Dieses Handle wird von der Funktion BCryptSecretAgreement abgerufen.
[in] pwszKDF
Ein Zeiger auf eine mit Null beendete Unicode-Zeichenfolge, die die Schlüsselableitungsfunktion (Key Ableitungsfunktion , KDF) identifiziert, die zum Ableiten des Schlüssels verwendet werden soll. Dies kann eine der folgenden Zeichenfolgen sein.
BCRYPT_KDF_HASH (L"HASH")
Verwenden Sie die Hashtastenableitungsfunktion.
Wenn der cbDerivedKey-Parameter kleiner als die Größe des abgeleiteten Schlüssels ist, kopiert diese Funktion nur die angegebene Anzahl von Bytes in den PbDerivedKey-Puffer . Dies ist in der Regel schlecht, da sie die Sicherheitsstärke des resultierenden Schlüssels erheblich reduzieren kann.
Wenn der cbDerivedKey-Parameter größer als die Größe des abgeleiteten Schlüssels ist, kopiert diese Funktion den Schlüssel in den PbDerivedKey-Puffer und legt die Variable fest, auf die das pcbResult verweist, auf die tatsächliche Anzahl der kopierten Bytes.
Die parameter, die vom pParameterList-Parameter identifiziert werden, können oder müssen die folgenden Parameter enthalten, wie durch die Erforderliche oder optionale Spalte angegeben.
| Parameter | Beschreibung | Erforderlich oder optional |
|---|---|---|
| KDF_HASH_ALGORITHM | Eine mit Null beendete Unicode-Zeichenfolge, die den zu verwendenden Hashalgorithmus identifiziert. Dabei kann es sich um einen der standardmäßigen Hashalgorithmusbezeichner von CNG-Algorithmus-IDs oder um den Bezeichner für einen anderen registrierten Hashalgorithmus handeln. Wenn dieser Parameter nicht angegeben ist, wird der SHA1-Hashalgorithmus verwendet. |
Wahlfrei |
| KDF_SECRET_PREPEND | Ein Wert, der am Anfang der Nachrichteneingabe zur Hashfunktion hinzugefügt werden soll. Weitere Informationen finden Sie in den Hinweisen. | Wahlfrei |
| KDF_SECRET_APPEND | Ein Wert, der am Ende der Nachrichteneingabe zur Hashfunktion hinzugefügt werden soll. Weitere Informationen finden Sie in den Hinweisen. | Wahlfrei |
Der Aufruf der KDF erfolgt wie im folgenden Pseudocode dargestellt.
KDF-Output = Hash(
KDF-Prepend +
hSharedSecret +
KDF-Append)
BCRYPT_KDF_HMAC (L"HMAC")
Verwenden Sie die Schlüsselableitungsfunktion Hash-Based Nachrichtenauthentifizierungscode (HMAC).
Wenn der cbDerivedKey-Parameter kleiner als die Größe des abgeleiteten Schlüssels ist, kopiert diese Funktion nur die angegebene Anzahl von Bytes in den PbDerivedKey-Puffer . Dies ist in der Regel schlecht, da sie die Sicherheitsstärke des resultierenden Schlüssels erheblich reduzieren kann.
Wenn der cbDerivedKey-Parameter größer als die Größe des abgeleiteten Schlüssels ist, kopiert diese Funktion den Schlüssel in den PbDerivedKey-Puffer und legt die Variable fest, auf die das pcbResult verweist, auf die tatsächliche Anzahl der kopierten Bytes.
Die parameter, die vom pParameterList-Parameter identifiziert werden, können oder müssen die folgenden Parameter enthalten, wie durch die Erforderliche oder optionale Spalte angegeben.
| Parameter | Beschreibung | Erforderlich oder optional |
|---|---|---|
| KDF_HASH_ALGORITHM | Eine mit Null beendete Unicode-Zeichenfolge, die den zu verwendenden Hashalgorithmus identifiziert. Dabei kann es sich um einen der standardmäßigen Hashalgorithmusbezeichner von CNG-Algorithmus-IDs oder um den Bezeichner für einen anderen registrierten Hashalgorithmus handeln. Wenn dieser Parameter nicht angegeben ist, wird der SHA1-Hashalgorithmus verwendet. |
Wahlfrei |
| KDF_HMAC_KEY | Der Schlüssel, der für die Pseudo-Zufallsfunktion (PRF) verwendet werden soll. | Wahlfrei |
| KDF_SECRET_PREPEND | Ein Wert, der am Anfang der Nachrichteneingabe zur Hashfunktion hinzugefügt werden soll. Weitere Informationen finden Sie in den Hinweisen. | Wahlfrei |
| KDF_SECRET_APPEND | Ein Wert, der am Ende der Nachrichteneingabe zur Hashfunktion hinzugefügt werden soll. Weitere Informationen finden Sie in den Hinweisen. | Wahlfrei |
Der Aufruf der KDF erfolgt wie im folgenden Pseudocode dargestellt.
KDF-Output = HMAC-Hash(
KDF_HMAC_KEY,
KDF-Prepend +
hSharedSecret +
KDF-Append)
BCRYPT_KDF_TLS_PRF (L"TLS_PRF")
Verwenden Sie die Tls-Schlüsselableitungsfunktion ( Transport Layer Security , Pseudo-Random Function , PRF). Die Größe des abgeleiteten Schlüssels beträgt immer 48 Bytes, sodass der cbDerivedKey-Parameter 48 sein muss.
Die parameter, die vom pParameterList-Parameter identifiziert werden, können oder müssen die folgenden Parameter enthalten, wie durch die Erforderliche oder optionale Spalte angegeben.
| Parameter | Beschreibung | Erforderlich oder optional |
|---|---|---|
| KDF_TLS_PRF_LABEL | Eine ANSI-Zeichenfolge, die die PRF-Bezeichnung enthält. | Erforderlich |
| KDF_TLS_PRF_SEED | Der PRF-Samen. Der Seed muss 64 Byte lang sein. | Erforderlich |
| KDF_TLS_PRF_PROTOCOL | Ein DWORD-Wert , der die TLS-Protokollversion angibt, deren PRF-Algorithmus verwendet werden soll. Gültige Werte sind: SSL2_PROTOCOL_VERSION (0x0002) SSL3_PROTOCOL_VERSION (0x0300) TLS1_PROTOCOL_VERSION (0x0301) TLS1_0_PROTOCOL_VERSION (0x0301) TLS1_1_PROTOCOL_VERSION (0x0302) TLS1_2_PROTOCOL_VERSION (0x0303) DTLS1_0_PROTOCOL_VERSION (0xfeff) Windows Server 2008 und Windows Vista: TLS1_1_PROTOCOL_VERSION, TLS1_2_PROTOCOL_VERSION und DTLS1_0_PROTOCOL_VERSION werden nicht unterstützt. Windows Server 2008 R2, Windows 7, Windows Server 2008 und Windows Vista: DTLS1_0_PROTOCOL_VERSION wird nicht unterstützt. |
Wahlfrei |
| KDF_HASH_ALGORITHM | Die CNG-Algorithmus-ID des Hashs, der mit dem HMAC in der PRF verwendet werden soll, für die TLS 1.2-Protokollversion. Gültige Auswahlmöglichkeiten sind SHA-256 und SHA-384. Wenn nicht angegeben, wird SHA-256 verwendet. | Wahlfrei |
Der Aufruf der KDF erfolgt wie im folgenden Pseudocode dargestellt.
KDF-Output = PRF(
hSharedSecret,
KDF_TLS_PRF_LABEL,
KDF_TLS_PRF_SEED)
BCRYPT_KDF_SP80056A_CONCAT (L"SP800_56A_CONCAT")
Verwenden Sie die SP800-56A-Schlüsselableitungsfunktion. Dies wird auch als "SP800-56C rev2 one-step KDF" bezeichnet.
Die KDF akzeptiert eine genehmigte Hashfunktion als Parameter, aber diese API wählt die Hashfunktion intern aus und stimmt mit der Sicherheitsstärke des Hashalgorithmus mit dem Algorithmus überein, der zum Generieren des geheimen Handles verwendet wird. (d. h. ECDH P-256 verwendet SHA256, ECDH P-384 verwendet SHA384)
Die parameter, die vom pParameterList-Parameter identifiziert werden, können oder müssen die folgenden Parameter enthalten, wie durch die Erforderliche oder optionale Spalte angegeben. Alle Parameterwerte werden als undurchsichtige Bytearrays behandelt.
| Parameter | Beschreibung | Erforderlich oder optional |
|---|---|---|
| KDF_ALGORITHMID | Gibt das AlgorithmID-Unterfeld des OtherInfo-Felds in der SP800-56A-Schlüsselableitungsfunktion an. Gibt den beabsichtigten Zweck des abgeleiteten Schlüssels an. | Erforderlich |
| KDF_PARTYUINFO | Gibt das PartyUInfo-Unterfeld des OtherInfo-Felds in der SP800-56A-Schlüsselableitungsfunktion an. Das Feld enthält öffentliche Informationen, die vom Initiator beigetragen wurden. | Erforderlich |
| KDF_PARTYVINFO | Specifies the PartyVInfo subfield of the OtherInfo field in the SP800-56A key ableiten function. Das Feld enthält öffentliche Informationen, die vom Antwortenden beigetragen wurden. | Erforderlich |
| KDF_SUPPPUBINFO | Gibt das Unterfeld "SuppPubInfo " des Felds "OtherInfo " in der Funktion SP800-56A-Schlüsselableitung an. Das Feld enthält öffentliche Informationen, die sowohl initiator als auch responder bekannt sind. | Wahlfrei |
| KDF_SUPPPRIVINFO | Gibt das Unterfeld "SuppPrivInfo " des Felds "OtherInfo " in der Funktion SP800-56A-Schlüsselableitung an. Sie enthält private Informationen, die sowohl initiator als auch responder bekannt sind, z. B. einen freigegebenen geheimen Schlüssel. | Wahlfrei |
Der Aufruf der KDF erfolgt wie im folgenden Pseudocode dargestellt.
KDF-Output = SP_800-56A_KDF(
hSharedSecret,
KDF_ALGORITHMID,
KDF_PARTYUINFO,
KDF_PARTYVINFO,
KDF_SUPPPUBINFO,
KDF_SUPPPRIVINFO)
Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: Dieser Wert wird nicht unterstützt.
BCRYPT_KDF_RAW_SECRET (L"TRUNCATE")
Gibt die Little-Endian-Darstellung des rohen Geheimschlüssels ohne Änderung zurück. Die Verwendung dieser Option ist in der Regel nicht empfehlenswert, kann jedoch erforderlich sein, wenn Sie mit einer nicht unterstützten KDF zusammenarbeiten müssen.
Wenn der cbDerivedKey-Parameter kleiner als die Größe des abgeleiteten Schlüssels ist, kopiert diese Funktion nur die angegebene Anzahl von Bytes in den PbDerivedKey-Puffer . Dies ist in der Regel schlecht, da sie die Sicherheitsstärke des resultierenden Schlüssels erheblich reduzieren kann.
Wenn der cbDerivedKey-Parameter größer als die Größe des abgeleiteten Schlüssels ist, kopiert diese Funktion den Schlüssel in den PbDerivedKey-Puffer und legt die Variable fest, auf die das pcbResult verweist, auf die tatsächliche Anzahl der kopierten Bytes.
Windows 8, Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: Dieser Wert wird nicht unterstützt.
BCRYPT_KDF_HKDF (L"HKDF")
Verwenden Sie die HKDF-Funktion (HMAC-based Extract-and-Expand KDF) aus RFC 5869.
In HKDF wird zwischen der Ableitung eines Schlüssels von einem der folgenden Methoden unterschieden:
- Die Ausgabe einer geheimen Vereinbarungsfunktion, die nicht einheitlich zufällig ist und als Eingabetastenmaterial (IKM) gilt. Fast alle Benutzer von BCryptDeriveKey verfügen über einen geheimen Handle dieses Formulars.
- Ein einheitlich zufälliger geheimer Wert.
Der erste Schritt besteht darin, einen Pseudorandomschlüssel (PRK) aus dem geheimen Handle zu extrahieren.
Dieser Schritt wird ausgeführt, indem BCryptSetProperty für ein geheimes Handle mit BCRYPT_HKDF_HASH_ALGORITHM aufgerufen wird, um den Hashalgorithmus festzulegen, der in HMAC-Berechnungen in HKDF verwendet werden soll. Dies folgt ein zweiter Aufruf von BCryptSetProperty mit einer der folgenden:
- Wenn der geheime Handle IKM darstellt, verwenden Sie BCRYPT_HKDF_SALT_AND_FINALIZE , um den optionalen Salzwert bereitzustellen und die PRK aus dem IKM zu extrahieren und den geheimen Handle abzuschließen.
- Verwenden Sie andernfalls BCRYPT_HKDF_PRK_AND_FINALIZE , um den geheimen Wert direkt in den HKDF PRK zu transformieren und den geheimen Handle abzuschließen.
Der zweite Schritt besteht darin, die PRK in einen abgeleiteten Ausgabeschlüssel zu erweitern.
Dieser Schritt wird durch Aufrufen von BCryptDeriveKey für ein abgeschlossenes geheimes Handle ausgeführt.
Die parameter, die vom pParameterList-Parameter identifiziert werden, können oder müssen die folgenden Parameter enthalten, wie durch die Erforderliche oder optionale Spalte angegeben. Alle Parameterwerte werden als undurchsichtige Bytearrays behandelt.
| Parameter | Beschreibung | Erforderlich oder optional |
|---|---|---|
| KDF_HKDF_INFO | Gibt das Infofeld im HKDF-Erweiterungsschritt an. Gibt die optionalen kontext- und anwendungsspezifischen Informationen an. | Wahlfrei |
Der Aufruf der KDF erfolgt wie im folgenden Pseudocode dargestellt.
KDF-Output = HKDF-Expand(
hSharedSecret.PRK,
info,
cbDerivedKey)
Windows 10: Die Unterstützung für HKDF beginnt.
[in, optional] pParameterList
Die Adresse einer BCryptBufferDesc-Struktur , die die KDF-Parameter enthält. Dieser Parameter ist optional und kann sein NULL , wenn er nicht benötigt wird.
[out, optional] pbDerivedKey
Die Adresse eines Puffers, der den Schlüssel empfängt. Der parameter cbDerivedKey enthält die Größe dieses Puffers. Wenn dieser Parameter lautet NULL, platziert diese Funktion die erforderliche Größe in Bytes in der ULONG , auf die der pcbResult-Parameter verweist.
[in] cbDerivedKey
Die Größe des PbDerivedKey-Puffers in Bytes.
[out] pcbResult
Ein Zeiger auf eine ULONG , die die Anzahl der Bytes empfängt, die in den PbDerivedKey-Puffer kopiert wurden. Wenn der PbDerivedKey-Parameter lautet NULL, platziert diese Funktion die erforderliche Größe in Bytes in der ULONG , auf die dieser Parameter verweist.
[in] dwFlags
Eine Reihe von Flags, die das Verhalten dieser Funktion ändern.
Dies kann null oder der folgende Wert sein:
| Wert | Bedeutung |
|---|---|
| KDF_USE_SECRET_AS_HMAC_KEY_FLAG | Der Wert in hSharedSecret dient auch als HMAC-Schlüssel. Wenn dieses Flag angegeben ist, sollte der KDF_HMAC_KEY Parameter nicht in den Parametersatz im pParameterList-Parameter eingeschlossen werden. Dieses Kennzeichen wird nur von der BCRYPT_KDF_HMAC Schlüsselableitungsfunktion verwendet. |
Rückgabewert
Gibt einen Statuscode zurück, der den Erfolg oder Fehler der Funktion angibt.
Mögliche Rückgabecodes umfassen, sind jedoch nicht beschränkt auf Folgendes:
| Rückgabecode | Beschreibung |
|---|---|
| STATUS_SUCCESS | Die Funktion war erfolgreich. |
| STATUS_INTERNAL_ERROR | Interner Fehler. |
| STATUS_INVALID_HANDLE | Das Handle im hSharedSecret-Parameter ist ungültig. |
| STATUS_INVALID_PARAMETER | Mindestens ein Parameter ist ungültig. |
Bemerkungen
Die BCryptBufferDesc-Struktur im pParameterList-Parameter kann mehr als einen der KDF_SECRET_PREPEND und KDF_SECRET_APPEND Parameter enthalten. Wenn mehrere dieser Parameter angegeben werden, werden die Parameterwerte in der Reihenfolge verkettet, in der sie im Array enthalten sind, bevor die KDF aufgerufen wird. Angenommen, die folgenden Parameterwerte werden angegeben.
BYTE abValue0[] = {0x01};
BYTE abValue1[] = {0x04, 0x05};
BYTE abValue2[] = {0x10, 0x11, 0x12};
BYTE abValue3[] = {0x20, 0x21, 0x22, 0x23};
Parameter[0].type = KDF_SECRET_APPEND
Parameter[0].value = abValue0;
Parameter[0].length = sizeof (abValue0);
Parameter[1].type = KDF_SECRET_PREPEND
Parameter[1].value = abValue1;
Parameter[1].length = sizeof (abValue1);
Parameter[2].type = KDF_SECRET_APPEND
Parameter[2].value = abValue2;
Parameter[2].length = sizeof (abValue2);
Parameter[3].type = KDF_SECRET_PREPEND
Parameter[3].value = abValue3;
Parameter[3].length = sizeof (abValue3);
Wenn die obigen Parameterwerte angegeben werden, sind die verketteten Werte für die tatsächliche KDF wie folgt.
Type: KDF_SECRET_PREPEND
Value: {0x04, 0x05, 0x20, 0x21, 0x22, 0x23}, length 6
Type: KDF_SECRET_APPEND
Value: {0x01, 0x10, 0x11, 0x12}, length 4
Wenn der pwszKDF-Parameter auf BCRYPT_KDF_RAW_SECRET festgelegt ist, wird der zurückgegebene geheime Schlüssel (im Gegensatz zu den anderen pwszKDF-Werten ) im Little-End-Format codiert. Es ist wichtig, dies zu beachten, wenn sie das rohe Geheimnis in allen anderen CNG-Funktionen verwenden, da die meisten von ihnen big-endian-codierte Eingaben übernehmen.
Bei Verwendung eines unterstützten Algorithmusanbieters kann BCryptDeriveKey entweder über den Benutzermodus oder den Kernelmodus aufgerufen werden. Kernelmodusaufrufer können entweder bei PASSIVE_LEVELIRQL oder DISPATCH_LEVEL IRQL ausgeführt werden. Wenn die aktuelle IRQL-Ebene DISPATCH_LEVEL ist, muss sich das im hSharedSecret-Parameter bereitgestellte Handle im nicht seitenfreien (oder gesperrten) Speicher befinden und von einem Algorithmushandle abgeleitet werden, das von einem Anbieter zurückgegeben wird, der mithilfe des BCRYPT_PROV_DISPATCH Flags geöffnet wurde.
Um diese Funktion im Kernelmodus aufzurufen, verwenden Sie Cng.libdas Driver Development Kit (DDK).
Windows Server 2008 und Windows Vista: Verwenden Sie Ksecdd.lib, um diese Funktion im Kernelmodus aufzurufen.
Anforderungen
| Anforderung | Wert |
|---|---|
| Mindestens unterstützter Client | Windows Vista [Desktop-Apps | UWP-Apps] |
| mindestens unterstützte Server- | Windows Server 2008 [Desktop-Apps | UWP-Apps] |
| Zielplattform- | Fenster |
| Header | bcrypt.h |
| Library | Bcrypt.lib |
| DLL | Bcrypt.dll |