CryptGenKey-Funktion (wincrypt.h)

Wichtige Diese API ist veraltet. Neue und vorhandene Software sollten mit der Verwendung Kryptografie-APIs der nächsten Generation beginnen. Microsoft kann diese API in zukünftigen Versionen entfernen.
 
Die CryptGenKey--Funktion generiert einen zufälligen kryptografischen Sitzungsschlüssel oder ein öffentliches/privates Schlüsselpaar. Ein Handle für das Schlüssel- oder Schlüsselpaar wird in phKey-zurückgegeben. Dieser Handle kann dann bei Bedarf mit jeder CryptoAPI-Funktion verwendet werden, die ein Schlüsselhandle erfordert.

Die aufrufende Anwendung muss beim Aufrufen dieser Funktion den Algorithmus angeben. Da dieser Algorithmustyp mit dem Schlüssel gebündelt bleibt, muss die Anwendung den Algorithmus später nicht angeben, wenn die tatsächlichen kryptografischen Vorgänge ausgeführt werden.

Syntax

BOOL CryptGenKey(
  [in]  HCRYPTPROV hProv,
  [in]  ALG_ID     Algid,
  [in]  DWORD      dwFlags,
  [out] HCRYPTKEY  *phKey
);

Parameter

[in] hProv

Ein Handle für einen kryptografischen Dienstanbieter (CSP), der durch einen Aufruf von CryptAcquireContexterstellt wurde.

[in] Algid

Ein ALG_ID Wert, der den Algorithmus identifiziert, für den der Schlüssel generiert werden soll. Die Werte für diesen Parameter variieren je nach verwendeter CSP.

Informationen zu ALG_ID Werten für die Verwendung mit dem Microsoft Base Cryptographic Provider finden Sie unter Base Provider-Algorithmen.

Informationen zu ALG_ID Werten, die mit dem Microsoft Strong Cryptographic Provider oder dem Erweiterten Kryptografieanbieter von Microsoft verwendet werden sollen, finden Sie unter Erweiterte Anbieteralgorithmen.

Verwenden Sie für einen Diffie-Hellman CSP einen der folgenden Werte.

Wert Bedeutung
CALG_DH_EPHEM
Gibt einen "Ephemeral" Diffie-Hellman Taste an.
CALG_DH_SF
Gibt einen Diffie-Hellman schlüssel "Speichern und Weiterleiten" an.
 

Neben dem Generieren von Sitzungsschlüsseln für symmetrischen Algorithmenkann diese Funktion auch öffentlichen/privaten Schlüsselpaaregenerieren. Jeder CryptoAPI-Client verfügt im Allgemeinen über zwei öffentliche/private Schlüsselpaare. Um eines dieser Schlüsselpaare zu generieren, legen Sie den Algid Parameter auf einen der folgenden Werte fest.

Wert Bedeutung
AT_KEYEXCHANGE
Schlüsselaustausch
AT_SIGNATURE
Digitale Signatur
 
Hinweis Wenn Schlüsselspezifikationen AT_KEYEXCHANGE und AT_SIGNATURE angegeben werden, hängen die Algorithmusbezeichner, die zum Generieren des Schlüssels verwendet werden, vom verwendeten Anbieter ab. Daher sind für diese Schlüsselspezifikationen die von CryptGetKeyParam zurückgegebenen Werte (wenn der parameter KP_ALGID angegeben wird) vom verwendeten Anbieter abhängig. Informationen dazu, welcher Algorithmusbezeichner von den verschiedenen Anbietern für die schlüsselspezifikationen AT_KEYEXCHANGE und AT_SIGNATURE verwendet wird, finden Sie unter ALG_ID.
 

[in] dwFlags

Gibt den Typ des generierten Schlüssels an. Die Größen eines Sitzungsschlüssels, RSA-Signaturschlüssels und RSA-Schlüssels Exchange Keys können festgelegt werden, wenn der Schlüssel generiert wird. Die Schlüsselgröße, die die Länge des Schlüsselmoduls in Bits darstellt, wird mit den oberen 16 Bits dieses Parameters festgelegt. Wenn also ein 2.048-Bit-RSA-Signaturschlüssel generiert werden soll, wird der Wert 0x08000000 mit allen anderen dwFlags vordefinierten Wert mit einem bitweisenOR--Vorgang kombiniert. Die oberen 16 Bits von 0x08000000 sind 0x0800 oder dezimal 2.048. Der wert RSA1024BIT_KEY kann verwendet werden, um einen 1024-Bit-RSA-Schlüssel anzugeben.

Aufgrund der Änderung der Exportsteuerungseinschränkungen kann sich der Standard-CSP und die Standardlänge Schlüssellänge zwischen Betriebssystemversionen ändern. Es ist wichtig, dass sowohl die Verschlüsselung als auch die Entschlüsselung denselben CSP verwenden und dass die Schlüssellänge explizit mit dem dwFlags Parameter festgelegt wird, um die Interoperabilität auf verschiedenen Betriebssystemplattformen sicherzustellen.

Insbesondere ist der standardmäßige RSA Full Cryptographic Service Provider der Microsoft RSA Strong Cryptographic Provider. Der standardmäßige DSS-Signatur-Diffie-Hellman Kryptografiedienstanbieter ist der microsoft Enhanced DSS Diffie-Hellman Kryptografieanbieter. Jeder dieser CSPs verfügt über eine standardmäßige 128-Bit-symmetrische Schlüssellänge für RC2 und RC4 und eine 1.024-Bit-Standardschlüssellänge für Public Key-Algorithmen.

Wenn die oberen 16 Bit null sind, wird die Standardschlüsselgröße generiert. Wenn ein Schlüssel, der größer als das Maximum oder kleiner als das Minimum ist, angegeben ist, schlägt der Aufruf mit dem ERROR_INVALID_PARAMETER Code fehl.

In der folgenden Tabelle sind Mindest-, Standard- und maximale Signatur- und Austauschschlüssellängen aufgeführt, die mit Windows XP beginnen.

Schlüsseltyp und Anbieter Mindestlänge Standardlänge Maximale Länge
RSA-Basisanbieter

Signaturen und ExchangeKeys

384 512 16,384
RSA Starke und erweiterte Anbieter

Signatur- und Exchange-Schlüssel

384 1,024 16,384
DSS-Basisanbieter

Signaturschlüssel

512 1,024 1,024
DSS-Basisanbieter

Exchange-Schlüssel

Nicht zutreffend Nicht zutreffend Nicht zutreffend
DSS/DH-Basisanbieter

Signaturschlüssel

512 1,024 1,024
DSS/DH-Basisanbieter

Exchange-Schlüssel

512 512 1,024
DSS/DH Enhanced Providers

Signaturschlüssel

512 1,024 1,024
DSS/DH Enhanced Providers

Exchange-Schlüssel

512 1,024 4,096
 

Informationen zu Sitzungsschlüssellängen finden Sie unter CryptDeriveKey.

Weitere Informationen zu Schlüsseln, die mit Microsoft-Anbietern generiert werden, finden Sie unter Microsoft Cryptographic Service Providers.

Die unteren 16-Bits dieses Parameters können null oder eine Kombination aus einem oder mehreren der folgenden Werte sein.

Wert Bedeutung
CRYPT_ARCHIVABLE
Wenn dieses Flag festgelegt ist, kann der Schlüssel exportiert werden, bis sein Handle durch einen Aufruf von CryptDestroyKeygeschlossen wird. Auf diese Weise können neu generierte Schlüssel beim Erstellen der Archivierung oder Schlüsselwiederherstellung exportiert werden. Nachdem das Handle geschlossen wurde, kann der Schlüssel nicht mehr exportiert werden.
CRYPT_CREATE_IV
Dieses Kennzeichen wird nicht verwendet.
CRYPT_CREATE_SALT
Wenn dieses Kennzeichen festgelegt ist, wird dem Schlüssel automatisch ein zufälliger Salzwert zugewiesen. Sie können diesen Salzwert mithilfe der CryptGetKeyParam--Funktion abrufen, wobei der dwParam Parameter auf KP_SALT festgelegt ist.

Wenn dieses Kennzeichen nicht festgelegt ist, erhält der Schlüssel einen Salzwert von Null.

Wenn Schlüssel mit Nichtzerosalzwerten exportiert werden (über CryptExportKey), muss auch der Salzwert abgerufen und mit dem SCHLÜSSEL BLOB-erhalten und beibehalten werden.

CRYPT_DATA_KEY
Dieses Kennzeichen wird nicht verwendet.
CRYPT_EXPORTABLE
Wenn dieses Kennzeichen festgelegt ist, kann der Schlüssel über die CryptExportKey--Funktion aus dem CSP in einen Schlüssel-BLOB übertragen werden. Da Sitzungsschlüssel im Allgemeinen exportierbar sein müssen, sollte dieses Flag in der Regel festgelegt werden, wenn sie erstellt werden.

Wenn dieses Flag nicht festgelegt ist, kann der Schlüssel nicht exportiert werden. Bei einem Sitzungsschlüssel bedeutet dies, dass der Schlüssel nur innerhalb der aktuellen Sitzung verfügbar ist und nur die Anwendung, die sie erstellt hat, sie verwenden kann. Bei einem paar öffentlicher/privater Schlüsselbedeutet dies, dass der private Schlüssel nicht transportiert oder gesichert werden kann.

Dieses Kennzeichen gilt nur für Sitzungsschlüssel und private Schlüssel-BLOBs. Sie gilt nicht für öffentliche Schlüssel, die immer exportiert werden können.

CRYPT_FORCE_KEY_PROTECTION_HIGH
Dieses Kennzeichen gibt einen starken Schlüsselschutz an. Wenn dieses Kennzeichen festgelegt ist, wird der Benutzer aufgefordert, beim Erstellen des Schlüssels ein Kennwort für den Schlüssel einzugeben. Der Benutzer wird aufgefordert, das Kennwort einzugeben, wenn dieser Schlüssel verwendet wird.

Dieses Kennzeichen wird nur von den csPs verwendet, die von Microsoft bereitgestellt werden. CsPs von Drittanbietern definieren ihr eigenes Verhalten für starken Schlüsselschutz.

Wenn Sie dieses Kennzeichen angeben, wird dasselbe Ergebnis wie das Aufrufen dieser Funktion mit dem CRYPT_USER_PROTECTED Flag verursacht, wenn in der Systemregistrierung ein starker Schlüsselschutz angegeben wird.

Wenn dieses Flag angegeben ist und das Anbieterhandle im hProv Parameter mithilfe des CRYPT_VERIFYCONTEXT- oder CRYPT_SILENT-Flags erstellt wurde, legt diese Funktion den letzten Fehler auf NTE_SILENT_CONTEXT fest und gibt Null zurück.

Windows Server 2003 und Windows XP: Dieses Flag wird nicht unterstützt.

CRYPT_KEK
Dieses Kennzeichen wird nicht verwendet.
CRYPT_INITIATOR
Dieses Kennzeichen wird nicht verwendet.
CRYPT_NO_SALT
Dieses Kennzeichen gibt an, dass ein Salzwert, für einen vierzig Bit-symmetrischen Schlüsselzugewiesen wird. Weitere Informationen finden Sie unter Salt Value Functionality.
CRYPT_ONLINE
Dieses Kennzeichen wird nicht verwendet.
CRYPT_PREGEN
Dieses Kennzeichen gibt eine anfängliche Diffie-Hellman- oder DSS-Schlüsselgenerierung an. Dieses Kennzeichen ist nur bei Diffie-Hellman und DSS-CSPs hilfreich. Bei Verwendung wird eine Standardschlüssellänge verwendet, es sei denn, eine Schlüssellänge wird in den oberen 16 Bits des dwFlags Parameter angegeben. Wenn Parameter mit Schlüssellängen für einen PREGEN-Diffie-Hellman oder DSS-Schlüssel mit CryptSetKeyParamfestgelegt werden, müssen die Schlüssellängen mit der hier festgelegten Schlüssellänge kompatibel sein.
CRYPT_RECIPIENT
Dieses Kennzeichen wird nicht verwendet.
CRYPT_SF
Dieses Kennzeichen wird nicht verwendet.
CRYPT_SGCKEY
Dieses Kennzeichen wird nicht verwendet.
CRYPT_USER_PROTECTED
Wenn dieses Kennzeichen festgelegt ist, wird der Benutzer über ein Dialogfeld oder eine andere Methode benachrichtigt, wenn bestimmte Aktionen versuchen, diesen Schlüssel zu verwenden. Das genaue Verhalten wird durch den verwendeten CSP angegeben. Wenn der Anbieterkontext mit dem CRYPT_SILENT Flagsatz geöffnet wurde, führt die Verwendung dieses Flags zu einem Fehler, und der letzte Fehler wird auf NTE_SILENT_CONTEXT festgelegt.
CRYPT_VOLATILE
Dieses Kennzeichen wird nicht verwendet.

[out] phKey

Adresse, an die die Funktion das Handle des neu generierten Schlüssels kopiert. Wenn Sie mit der Verwendung des Schlüssels fertig sind, löschen Sie den Handle auf den Schlüssel, indem Sie die CryptDestroyKey--Funktion aufrufen.

Rückgabewert

Gibt "nonzero" zurück, wenn dies erfolgreich oder null ist.

Rufen Sie für erweiterte Fehlerinformationen GetLastError-auf.

Die von "NTE" vorangestellten Fehlercodes werden vom verwendeten CSP generiert. Einige mögliche Fehlercodes sind in der folgenden Tabelle aufgeführt.

Rückgabecode Beschreibung
ERROR_INVALID_HANDLE
Einer der Parameter gibt ein ungültiges Handle an.
ERROR_INVALID_PARAMETER
Einer der Parameter enthält einen ungültigen Wert. Dies ist am häufigsten ein ungültiger Zeiger.
NTE_BAD_ALGID
Der Algid Parameter gibt einen Algorithmus an, den dieser CSP nicht unterstützt.
NTE_BAD_FLAGS
Der dwFlags Parameter enthält einen ungültigen Wert.
NTE_BAD_UID
Der hProv--Parameter enthält kein gültiges Kontexthandle.
NTE_FAIL
Die Funktion konnte auf unerwartete Weise nicht ausgeführt werden.
NTE_SILENT_CONTEXT
Der Anbieter konnte die Aktion nicht ausführen, da der Kontext im Hintergrund abgerufen wurde.

Bemerkungen

Wenn Schlüssel für symmetrischenBlockchiffregeneriert werden, wird der Schlüssel standardmäßig in Verschlüsselungsblockverkett ungsmodus (CBC) mit einem Initialisierungsvektor von Null eingerichtet. Dieser Verschlüsselungsmodus bietet eine gute Standardmethode für massenverschlüsselte Daten. Verwenden Sie zum Ändern dieser Parameter die CryptSetKeyParam--Funktion.

Zum Auswählen einer geeigneten Schlüssellängewerden die folgenden Methoden empfohlen:

  • Auflisten der Algorithmen, die vom CSP unterstützt werden, und erhalten für jeden Algorithmus maximale und minimale Schlüssellängen. Rufen Sie dazu CryptGetProvParam- mit PP_ENUMALGS_EX auf.
  • Verwenden Sie die mindesten und maximalen Längen, um eine entsprechende Schlüssellänge auszuwählen. Es ist nicht immer ratsam, die maximale Länge zu wählen, da dies zu Leistungsproblemen führen kann.
  • Nachdem die gewünschte Schlüssellänge ausgewählt wurde, verwenden Sie die oberen 16 Bit des dwFlags Parameter, um die Schlüssellänge anzugeben.

Beispiele

Das folgende Beispiel zeigt die Erstellung eines zufälligen Sitzungsschlüssels. Ein Beispiel, das den vollständigen Kontext für dieses Beispiel enthält, finden Sie unter Beispiel-C-Programm: Verschlüsseln einer Datei. Ein weiteres Beispiel, das diese Funktion verwendet, finden Sie unter Beispiel C-Programm: Entschlüsseln einer Datei.

//-------------------------------------------------------------------
//  Declare the handle to the key.
HCRYPTKEY hKey; 
//-------------------------------------------------------------------
//  This example assumes that a cryptographic context 
//  has been acquired, and that it is stored in hCryptProv.
//---------------------------------------------------------------
//  Create a random session key. 

 if(CryptGenKey(
          hCryptProv, 
          ENCRYPT_ALGORITHM, 
          KEYLENGTH | CRYPT_EXPORTABLE, 
          &hKey))
 {
         printf("A session key has been created.\n");
 } 
 else
 {
          printf("Error during CryptGenKey.\n"); 
          exit(1);
 }
//-------------------------------------------------------------------
//  The key created can be exported into a key BLOB that can be
//  written to a file.
//  ...
//  When you have finished using the key, free the resource.
if (!CryptDestroyKey(hKey))
{
          printf("Error during CryptDestroyKey.\n"); 
          exit(1);
}

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows XP [nur Desktop-Apps]
mindestens unterstützte Server- Windows Server 2003 [Nur Desktop-Apps]
Zielplattform- Fenster
Header- wincrypt.h
Library Advapi32.lib
DLL- Advapi32.dll

Siehe auch

CryptAcquireContext-

CryptDestroyKey-

CryptExportKey-

CryptGetKeyParam

CryptImportKey-

CryptSetKeyParam-

Schlüsselgenerierung und Exchange-Funktionen

Threadingprobleme mit Kryptografiedienstanbietern