CryptExportKey

Aus API-Wiki
Zur Navigation springenZur Suche springen

Mit der Funktion CryptExportKey kann ein Schlüssel aus dem CSP exportiert werden. Es können sowohl symmetrische als auch asymmetrische Schlüssel exportiert werden, ausserdem können die Schlüsseldaten gleichzeitig mit dem Export wiederum verschlüsselt werden.

Declare Function CryptExportKey Lib "advapi32.dll" ( _
                 ByVal hKey As Long, _
                 ByVal hExhKey As Long, _
                 ByVal dwBlobType As Long, _
                 ByVal dwFlags As Long, _
                 ByRef pbData As Any, _
                 ByRef pdwDataLen As Long) As Long

Parameter

hKey

[in] Handle des Schlüssels der exportiert werden soll. Dies kann ein symmetrischer oder asymmetrischer Schlüssel sein.

hExhKey

[in] Handle des Schlüssels mit dem die Schlüsseldaten beim Export verschlüsselt werden sollen. Wird für diesen Parameter 0 angegeben, werden die Daten nicht verschlüsselt. Soll der öffentliche Teil eines asymmetrischen Schlüssels exportiert werden, so muss dieser Parameter 0 sein.

dwBlobType

[in] Über diesen Parameter wird angegeben welcher Schlüsselteil exportiert werden soll:
PRIVATEKEYBLOB es wird der private und öffentliche Schlüsselteil des in hKey angegebenen asymmetrischen Schlüssels exportiert.
PUBLICKEYBLOB es wird nur der öffentliche Teil des in hKey angegebenen asymmetrischen Schlüssels exportiert.
SIMPLEBLOB es wird ein symmetrischer Schlüssel exportiert, hKey verweist auf einen symmetrischen Schlüssel.
OPAQUEKEYBLOB nur für Schannel CSPs
PLAINTEXTKEYBLOB der Schlüssel wird im Klartext exportiert (ab Win XP)
SYMMETRICWRAPKEYBLOB ein symmetrischer Schlüssel wird mit einem anderen symmetrischen Schlüssel verschlüsselt (RFC 3217)

dwFlags

[in] Flags für zusätzliche Exportoptionen:
CRYPT_BLOB_VER3 erzwingt Blob Version 3 (ab Win XP?)
CRYPT_DESTROYKEY nur für Schannel CSPs im Zusammenhang mit OPAQUEKEYBLOB
CRYPT_OAEP PKCS #1 Version 2 Formatierung für Schlüsseltausch
CRYPT_SSL2_FALLBACK nur für Schannel CSPs

pbData

[out] Zeiger auf einen vorbereiteten Buffer zur Aufnahme der Schlüsseldaten (Byte Feld). Wird in diesem Parameter NULL übergeben, so gibt CryptExportKey in pdwDataLen die benötigte Größe zurück.

pdwDataLen

[in,out] Zeiger auf einen Longwert, welcher beim Funktionseintritt auf die Größe des in pbData bereitgestellten Buffers gesetzt wird, nach Rückkehr der Funktion, enthält dieser Wert die Anzahl der tatsächlich verwendeten Bytes. Vorsicht: es kann passieren, dass mit pbData=NULL ein etwas größerer Wert ermittelt wird, als dann tatsächlich nach dem Schlüssel Export verwendet wird. Es ist also ratsam, nach dem tatsächlichen Export pdwDataLen nochmals zu überprüfen und gegebenenfalls das Bytearray, in welches die Schlüsseldaten exportiert wurden, nocheinmal runterzudimensionieren.

Rückgabe(n)

Bei Erfolg wird ein Wert ungleich 0 zurückgegeben.

Anmerkungen

Die Möglichkeit Schlüsseldaten während des Exports zu verschlüsseln wird vor allem bei den folgenden Anwendungen eingesetzt:

RSA geschützter Schlüsseltausch: ein RSA Schlüsselpaar wird erzeugt, der öffentliche Schlüssel wird unverschlüsselt exportiert und an den Partner übertragen, dieser importiert den öffentlichen Schlüssel, erzeugt seinerseits einen zufälligen symmetrischen Schlüssel, exportiert diesen und verschlüsselt ihn gleichzeitig mit dem öffentlichen Schlüssel der importiert wurde. Dadurch ist der Schlüssel nun nurnoch vom Besitzer des privaten RSA Schlüssels lesbar. Der verschlüsselte symmetrische Schlüssel (Sessionkey) wird an den Besitzer des RSA Schlüssels zurückgesandt, dieser importiert ihn und entschlüsselt ihn gleichzeitig mit seinem privaten Schlüssel.

Export des eines asymmetrischen Schlüsselpaares: Während des Exports werden die Schlüsseldaten mit einem symmetrischen Schlüssel verschlüsselt. Die erhaltenen Schlüsseldaten können dann gespeichert werden (Datenbank, Datei etc.) und sind nur mit dem passenden symmetrischen Schlüssel (=Passwort) nutzbar.

Beispiel

Exportieren des privaten RSA Signatur Schlüssels hRsaKey in verschlüsselter Form unter verwendung des symmetrischen Schlüssels hSessionKey

If CryptExportKey(hRsaKey, hSessionKey, PRIVATEKEYBLOB, 0, ByVal 0, lKeyLen) <> 0 Then
        ReDim bKeyData(lKeyLen - 1)
        If CryptExportKey(hRsaKey, hSessionKey, PRIVATEKEYBLOB, 0, btKeyData(0), lKeyLen) <> 0 Then
            'Success
            If lKeyLen <> UBound(bKeyData) + 1 Then
                ReDim Preserve bKeyData(lKeyLen - 1)
            End If
        Else
            Err.Raise Err.LastDllError, , "CryptExportKey Error!"
        End If
    Else
        Err.Raise Err.LastDllError, , "CryptExportKey Error!"
    End If