CryptAcquireContext

Aus API-Wiki
Version vom 5. November 2016, 22:46 Uhr von Jochen Wierum (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springenZur Suche springen

Die API-Funktion CryptAcquireContext stellt eine Verbindung zu einem Cryptographic Service Provider (CSP) her. CSPs stellen Funktionen bereit um Hashes (z.B. MD5 und SHA) zu berechnen und Daten mit symmetrischen (z.B. RC4 und AES) und asymmetrisch (z.B. RSA) Algorithmen zu Verschlüsseln.

Declare Function CryptAcquireContext Lib "advapi32.dll" _
                 Alias "CryptAcquireContextA" ( _
                 ByRef phProv As Long, _
                 ByVal pszContainer As String, _
                 ByVal pszProvider As String, _
                 ByVal dwProvType As Long, _
                 ByVal dwFlags As Long) As Long

Parameter

phProv

[out] In diesem Long Wert wird das Handle zu dem geöffneten Provider Kontext zurückgegeben. Nach der Verwendung muss dieses Handle mittels CryptReleaseContext wieder freigegeben werden.

pszContainer

[in] Der Name des Schlüsselcontainers. In einem benannten Schlüsselcontainer gespeicherte asymmetrische Schlüssel sind permanent abgelegt, d.h. auch nach einem Reboot noch verfügbar. Wird für diesen Parameter NULL übergeben, so wird der Default Container des Providers verwendet. Zu Beachten ist hierbei, dass der Container Applikationsübergreifend verwendet wird, sich also mehrere Programme, vorallem bei gemeinsamer Nutzung des Default Containers in die Quere kommen können. Beim Arbeiten mit symmetrischen Schlüsseln und Hashen tritt dieses Problem nicht auf.
Auf in einem Schlüsselcontainer abgelegte asymmetrischen Schlüssel kann nur der erstellende Benutzer und Administratoren zugreifen.

pszProvider

[in] Der Name des gewünschten Cryptographic Service Providers. Die Provider "Microsoft Base Cryptographic Provider v1.0" und "Microsoft Enhanced Cryptographic Provider v1.0" werden meist zusammen mit dem Internetexplorer installiert, sollten also auf jedem System mit IE vorhanden sein.
Die auf einem System installierten Provider findet man bei Bedarf in der Registry unter HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\Defaults\Provider
siehe auch http://msdn2.microsoft.com/en-us/library/aa386983.aspx

dwProvType

[in] Der Typ des Providers. Mögliche Werte sind zum Beispiel PROV_RSA_FULL, PROV_RSA_AES oder PROV_RSA_SIG

dwFlags

[in] Eine Kombination folgender Flags:
CRYPT_VERIFYCONTEXT es wird kein permanenter Schlüsselcontainer erstellt, pszContainer muss hierbei NULL sein. Ein solcher Container kann zur Signaturüberprüfung, zum Hashen und zum Verschlüsseln von Daten bei denen ein Passwort ausserhalb des Containers gespeichert wird, verwendet werden.
CRYPT_NEWKEYSET es wird ein neuer Schlüsselcontainer mit dem in pszContainer angegebenen Namen erstellt.
CRYPT_MACHINE_KEYSET auf den Schlüsselcontainer kann auch vom SYSTEM Konto zugegriffen werden.
CRYPT_DELETEKEYSET der in pszContainer angegebene Container wird gelöscht, in phProv wird in diesem Fall nichts zurückgegeben.
CRYPT_SILENT Die Anzeige eines Benutzer Interfaces wird unterdrückt.
CRYPT_DEFAULT_CONTAINER_OPTIONAL nur in Verbindung mit SmartCard CSPs gültig.

Rückgabe(n)

Bei Erfolg wird ein Wert ungleich 0 zurückgegeben.

Hinweise

Beachten Sie, dass jeder Provider unterschiedliche Algorithmen unterstützt. So bietet z.B. der Microsoft Base und Enhanced Provider keine AES Verschlüsselung und SHA-256+ Hashing Algorithmen an. Diese sind nur im Microsoft Enhanced RSA and AES Cryptographic Provider verfügbar.

Beispiel

Private Const MS_DEF_PROV As String = _
                    "Microsoft Base Cryptographic Provider v1.0"
Private Const MS_ENHANCED_PROV As String = _
                    "Microsoft Enhanced Cryptographic Provider v1.0"

    'Provider Kontext anfordern:
    If CryptAcquireContext(hCryptProv, ByVal 0, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) = 0 Then
            
        'Enhanced Provider nicht verfügbar, probieren wir den Base Provider:
        If CryptAcquireContext(hCryptProv, ByVal 0, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) = 0 Then
            'auch kein Base Provider->fail
            Err.Raise Err.LastDllError, , "CryptAcquireContext Error"
        End If
            
    End If

Ein komplettes Beispiel zum Berechnen von Hashes findet sich unter CryptGetHashParam
Ein komplettes Beispiel zum Ver- und Entschlüsseln findet sich unter CryptDecrypt
Ein komplettes Beispiel zur elektronischen Signatur findet sich unter CryptVerifySignature
Ein komplettes Beispiel zum sicheren Schlüsseltausch findet sich unter CryptGenKey