Programmation CNG classique
L’API CNG implémente un modèle de fournisseur extensible qui vous permet de charger un fournisseur en spécifiant l’algorithme de chiffrement requis plutôt qu’un fournisseur particulier. L’avantage est qu’un fournisseur d’algorithme peut être remplacé ou mis à niveau et que vous n’aurez pas à modifier votre code de quelque manière que ce soit pour utiliser le nouveau fournisseur. En outre, si un algorithme est jugé non sécurisé à l’avenir, une version plus sécurisée de cet algorithme peut être installée sans affecter votre code. La plupart des API CNG nécessitent un fournisseur ou un objet créé par un fournisseur.
Les étapes classiques impliquées dans l’utilisation de l’API CNG pour les opérations primitives de chiffrement sont les suivantes :
- Ouverture du fournisseur d’algorithmes
- Obtention ou définition des propriétés de l’algorithme
- Création ou importation d’une clé
- Exécution d’opérations de chiffrement
- Fermeture du fournisseur d’algorithme
Pour plus d’informations, consultez Exemples de programmation.
La fonction BCryptOpenAlgorithmProvider vous fournit un handle de fournisseur d’algorithme qui est utilisé dans les API CNG suivantes, telles que BCryptCreateHash ou BCryptGenerateKeyPair.
Vous pouvez utiliser le handle du fournisseur d’algorithme pour obtenir les détails d’implémentation de l’algorithme, tels que la taille de clé ou le mode de fonctionnement actuel. Vous utilisez la fonction BCryptGetProperty pour obtenir des propriétés spécifiques.
Vous pouvez également modifier les propriétés de l’algorithme. Par exemple, si vous souhaitez utiliser le chaînage de chiffrement de blocs BCE avec AES, vous définissez la propriété BCRYPT_CHAINING_MODE d’un algorithme AES sur BCRYPT_CHAIN_MODE_ECB ; la propriété est affectée à toutes les clés AES créées à l’aide de ce handle d’algorithme, sans avoir à configurer chaque clé AES. Vous utilisez la fonction BCryptSetProperty pour modifier ces propriétés.
Selon le type d’algorithme que vous utilisez, vous devrez peut-être créer ou charger une clé. Par exemple, la fonction BCryptEncrypt prend un handle de clé pour le premier paramètre. Si vous souhaitez que cette fonction chiffre des données avec un algorithme de chiffrement symétrique tel qu’AES, vous devez d’abord obtenir une clé. La façon dont vous obtenez la clé dépend du type d’algorithme utilisé et de la source de la clé.
Vous pouvez créer des clés éphémères avec les fonctions BCryptGenerateSymmetricKey et BCryptGenerateKeyPair . Vous pouvez également importer des clés éphémères à partir d’un objet BLOB mémoire avec les fonctions BCryptImportKey et BCryptImportKeyPair .
Pour les clés persistantes, vous utilisez les fonctions de stockage de clés pour charger un fournisseur de stockage de clés, puis vous créez ou chargez les clés. Vous pouvez également utiliser ces fonctions pour créer ou charger des clés éphémères en passant la valeur NULL pour les noms de conteneur. Pour plus d’informations sur les fonctions de stockage de clés, consultez Fonctions de stockage de clés CNG.
Vous êtes maintenant prêt à effectuer l’opération de chiffrement, telle que le chiffrement ou le déchiffrement des données à l’aide des fonctions BCryptEncrypt ou BCryptDecrypt , respectivement.
Lorsque le fournisseur n’est plus nécessaire, vous devez passer le handle à la fonction BCryptCloseAlgorithmProvider pour fermer le fournisseur. Cela amène le fournisseur à libérer toutes les ressources qui ont été allouées pour ce fournisseur d’algorithmes instance. Une fois qu’un handle de fournisseur est fermé, il ne peut pas être réutilisé.
Le chargement d’un fournisseur peut être un processus relativement long. Vous devez donc mettre en cache tous les handles de fournisseur que vous référencez plusieurs fois pendant la durée de vie de votre application.
Les exemples suivants décrivent comment effectuer des opérations de chiffrement spécifiques à l’aide de CNG.