CryptDeriveKey

Aus API-Wiki
Zur Navigation springenZur Suche springen

Die Funktion CryptDeriveKey erstellt einen Schlüssel zur Verschlüsselung von Daten aus einem Hashwert. Der Hash muss zuvor mittels CryptCreateHash erstellt, und mittels CryptHashData mit einem Passwort befüllt worden sein. Ein identes Passwort, erstellt einen identen Hash und damit einen identen Schlüssel (sofern kein SALT verwendet wird, steuerbar über dwFlags).

<<syntaxhighlight lang="vb">>Declare Function CryptDeriveKey Lib "advapi32.dll" ( _

                ByVal hProv As Long, _
                ByVal AlgID As Long, _
                ByVal hBaseData As Long, _
                ByVal dwFlags As Long, _
                ByRef phKey As Long) As Long</<syntaxhighlight lang="vb">>

Parameter

phProv

[in] Handle zu einem CSP. Ein solches Handle wird mit CryptAcquireContext erzeugt.

AlgID

[in] Definiert den Verschlüsselungsalgorithmus für den der Schlüssel verwendet wird. Beispiele sind: CALG_AES_128 oder CALG_3DES_112

hBaseData

[in] Handle zu einem Hash Objekt, welches mittels CryptCreateHash erstellt wurde.

dwFlags

[in] Flags welche die Schlüsselerstellung weiter steuern, z.B. CRYPT_EXPORTABLE. Mittels der oberen 16 Bits kann ausserdem die gewünschte Schlüssellänge angegeben werden.

phKey

[out] In diesem Long Wert wird das Handle des erstellten Schlüssels zurückgegeben. Um den Schlüssel zu zerstören wird CryptDestroyKey verwendet.

Rückgabe(n)

Bei Erfolg wird ein Wert ungleich 0 zurückgegeben.

Beispiel

<<syntaxhighlight lang="vb">>

   'Hash Objekt erstellen
   If CryptCreateHash(hCryptProv, CALG_SHA, 0, 0, hHash) <> 0 Then
       'Daten in Hash Objekt schreiben
       If CryptHashData(hHash, StrPtr(sPwd), LenB(sPwd), 0) <> 0 Then
           'Schlüssel aus Daten erzeugen lassen:
           If CryptDeriveKey(hCryptProv, lCryptAlgo, hHash, lKeyLength * &H10000 Or CRYPT_NO_SALT, hSessionKey) = 0 Then
               If Err.LastDllError = NTE_BAD_ALGID Then
                   Err.Raise Err.LastDllError, , "Algorithm not supported!"
               Else
                   Err.Raise Err.LastDllError, , "CryptDeriveKey Error"
               End If
           End If
       Else
           Err.Raise Err.LastDllError, , "CryptHashData Error"
       End If
       
       'Hash wieder zerstören:
       If CryptDestroyHash(hHash) = 0 Then
          Err.Raise Err.LastDllError, , "CryptDestroyHash Error"
       End If
   Else
       Err.Raise Err.LastDllError, , "CryptCreateHash Error"
   End If

</<syntaxhighlight lang="vb">> Ein komplettes Beispiel zum Ver- und Entschlüsseln findet sich unter CryptDecrypt