Typische CNG-programmering
De CNG-API implementeert een uitbreidbaar providermodel waarmee u een provider kunt laden door het vereiste cryptografische algoritme op te geven in plaats van een bepaalde provider. Het voordeel is dat een algoritmeprovider kan worden vervangen of bijgewerkt en u uw code op geen enkele manier hoeft te wijzigen om de nieuwe provider te gebruiken. Als een bepaald algoritme in de toekomst onveilig is, kan er ook een veiligere versie van dat algoritme worden geïnstalleerd zonder dat dit van invloed is op uw code. Voor de meeste CNG-API's is een provider of een object vereist dat is gemaakt door een provider.
De gebruikelijke stappen voor het gebruik van de CNG-API voor cryptografische primitieve bewerkingen zijn als volgt:
- De algoritmeprovider openen
- Eigenschappen van algoritme ophalen of instellen
- Een sleutel maken of importeren
- Cryptografische bewerkingen uitvoeren
- De algoritmeprovider sluiten
Zie Programmeervoorbeelden voor meer informatie.
De algoritmeprovider openen
De BCryptOpenAlgorithmProvider functie biedt u een handle van een algoritmeprovider die wordt gebruikt in volgende CNG API's, zoals BCryptCreateHash of BCryptGenerateKeyPair.
Eigenschappen van algoritme ophalen of instellen
U kunt de handle van de algoritmeprovider gebruiken om implementatiedetails voor het algoritme op te halen, zoals de sleutelgrootte of de huidige bewerkingsmodus. U gebruikt de BCryptGetProperty- functie om specifieke eigenschappen te verkrijgen.
U kunt ook de eigenschappen van het algoritme wijzigen. Als u bijvoorbeeld ecb-blokcodering met AES wilt gebruiken, stelt u de eigenschap BCRYPT_CHAINING_MODE van een AES-algoritme in op BCRYPT_CHAIN_MODE_ECB; de eigenschap wordt toegewezen aan alle AES-sleutels die zijn gemaakt met behulp van deze algoritmegreep, zonder dat u elke AES-sleutel hoeft te configureren. U gebruikt de functie BCryptSetProperty om deze eigenschappen te wijzigen.
Een sleutel maken of importeren
Afhankelijk van het type algoritme dat u gebruikt, moet u mogelijk een sleutel maken of laden. De functie BCryptEncrypt gebruikt bijvoorbeeld een sleutelgreep voor de eerste parameter. Als u wilt dat die functie gegevens versleutelt met een symmetrisch versleutelingsalgoritmen zoals AES, moet u eerst een sleutel verkrijgen. Hoe u de sleutel verkrijgt, is afhankelijk van het type algoritme dat wordt gebruikt en de bron van de sleutel.
U kunt kortstondige sleutels maken met de functies BCryptGenerateSymmetricKey en BCryptGenerateKeyPair. U kunt ook kortstondige sleutels uit een geheugen-BLOB importeren met de functies BCryptImportKey en BCryptImportKeyPair.
Voor persistente sleutels gebruikt u de sleutelopslagfuncties om een sleutelopslagprovider te laden en vervolgens de sleutels te maken of te laden. U kunt deze functies ook gebruiken om kortstondige sleutels te maken of te laden door NULL- door te geven voor containernamen. Zie CNG-sleutelopslagfunctiesvoor meer informatie over de sleutelopslagfuncties.
Cryptografische bewerkingen uitvoeren
U bent nu klaar om de cryptografische bewerking uit te voeren, zoals het versleutelen of ontsleutelen van gegevens met behulp van respectievelijk de functies BCryptEncrypt of BCryptDecrypt.
De algoritmeprovider sluiten
Wanneer de provider niet meer nodig is, moet u de ingang doorgeven aan de BCryptCloseAlgorithmProvider functie om de provider te sluiten. Dit zorgt ervoor dat de provider alle resources vrijgeeft die zijn toegewezen voor die instantie van de algoritmeprovider. Nadat een providergreep is gesloten, kan deze niet opnieuw worden gebruikt.
Het laden van een provider kan een relatief tijdrovend proces zijn. U moet daarom alle providerhandgrepen die u tijdens de levensduur van uw toepassing naar meerdere keren verwijst, in de cache opslaan.
Programmeervoorbeelden
In de volgende voorbeelden wordt beschreven hoe u specifieke cryptografische bewerkingen uitvoert met behulp van CNG.