CryptExportKey: Unterschied zwischen den Versionen

Aus API-Wiki
Wechseln zu: Navigation, Suche
(Beispiel)
Zeile 4: Zeile 4:
 
gleichzeitig mit dem Export wiederum verschlüsselt werden.
 
gleichzeitig mit dem Export wiederum verschlüsselt werden.
  
<vb>Declare Function CryptExportKey Lib "advapi32.dll" ( _
+
<<syntaxhighlight lang="vb">>Declare Function CryptExportKey Lib "advapi32.dll" ( _
 
                 ByVal hKey As Long, _
 
                 ByVal hKey As Long, _
 
                 ByVal hExhKey As Long, _
 
                 ByVal hExhKey As Long, _
Zeile 10: Zeile 10:
 
                 ByVal dwFlags As Long, _
 
                 ByVal dwFlags As Long, _
 
                 ByRef pbData As Any, _
 
                 ByRef pbData As Any, _
                 ByRef pdwDataLen As Long) As Long</vb>
+
                 ByRef pdwDataLen As Long) As Long</<syntaxhighlight lang="vb">>
  
 
==Parameter==
 
==Parameter==
Zeile 59: Zeile 59:
 
==Beispiel==
 
==Beispiel==
 
Exportieren des privaten RSA Signatur Schlüssels hRsaKey in verschlüsselter Form unter verwendung des symmetrischen Schlüssels hSessionKey
 
Exportieren des privaten RSA Signatur Schlüssels hRsaKey in verschlüsselter Form unter verwendung des symmetrischen Schlüssels hSessionKey
<vb>If CryptExportKey(hRsaKey, hSessionKey, PRIVATEKEYBLOB, 0, ByVal 0, lKeyLen) <> 0 Then
+
<<syntaxhighlight lang="vb">>If CryptExportKey(hRsaKey, hSessionKey, PRIVATEKEYBLOB, 0, ByVal 0, lKeyLen) <> 0 Then
 
         ReDim bKeyData(lKeyLen - 1)
 
         ReDim bKeyData(lKeyLen - 1)
 
         If CryptExportKey(hRsaKey, hSessionKey, PRIVATEKEYBLOB, 0, btKeyData(0), lKeyLen) <> 0 Then
 
         If CryptExportKey(hRsaKey, hSessionKey, PRIVATEKEYBLOB, 0, btKeyData(0), lKeyLen) <> 0 Then
Zeile 71: Zeile 71:
 
     Else
 
     Else
 
         Err.Raise Err.LastDllError, , "CryptExportKey Error!"
 
         Err.Raise Err.LastDllError, , "CryptExportKey Error!"
     End If</vb>
+
     End If</<syntaxhighlight lang="vb">>
  
 
[[Kategorie:Crypt Api]]
 
[[Kategorie:Crypt Api]]
 
[[Kategorie:Funktionen]]
 
[[Kategorie:Funktionen]]

Version vom 5. November 2016, 23:09 Uhr

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.

<<syntaxhighlight lang="vb">>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</<syntaxhighlight lang="vb">>

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 <<syntaxhighlight lang="vb">>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</<syntaxhighlight lang="vb">>