CryptDeriveKey

Aus API-Wiki
Wechseln zu: Navigation, Suche

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).

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

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

    '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

Ein komplettes Beispiel zum Ver- und Entschlüsseln findet sich unter CryptDecrypt