Partager via


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’algorithmes peut être remplacé ou mis à niveau et que vous n’aurez pas à modifier votre code de manière à utiliser le nouveau fournisseur. En outre, si un algorithme est déterminé à être dangereux à 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 :

  1. Ouverture du fournisseur d’algorithmes
  2. Obtention ou définition des propriétés d’algorithme
  3. Création ou importation d’une clé
  4. Exécution d’opérations de chiffrement
  5. Fermeture du fournisseur d’algorithmes

Pour plus d’informations, consultez Exemples de programmation.

Ouverture du fournisseur d’algorithmes

La fonction BCryptOpenAlgorithmProvider vous fournit un handle de fournisseur d’algorithmes utilisé dans les API CNG suivantes, telles que BCryptCreateHash ou BCryptGenerateKeyPair.

Obtention ou définition des propriétés d’algorithme

Vous pouvez utiliser le handle du fournisseur d’algorithmes pour obtenir des détails d’implémentation pour l’algorithme, tels que la taille de clé ou le mode d’opération 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 bloc 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 chacune et chaque clé AES. Vous utilisez la fonction BCryptSetProperty pour modifier ces propriétés.

Création ou importation d’une clé

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 les 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 fonctions BCryptGenerateKeyPair. Vous pouvez également importer des clés éphémères à partir d’un objet blob de 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 créer ou charger les clés. Vous pouvez également utiliser ces fonctions pour créer ou charger des clés éphémères en passant NULL pour tous les noms de conteneur. Pour plus d’informations sur les fonctions de stockage de clés, consultez fonctions de stockage de clés CNG.

Exécution d’opérations de chiffrement

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.

Fermeture du fournisseur d’algorithmes

Lorsque le fournisseur n’est plus nécessaire, vous devez passer le handle au BCryptCloseAlgorithmProvider fonction pour fermer le fournisseur. Ainsi, le fournisseur libère toutes les ressources qui ont été allouées pour cette instance de fournisseur d’algorithmes. 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érencerez plusieurs fois pendant la durée de vie de votre application.

Exemples de programmation

Les exemples suivants décrivent comment effectuer des opérations de chiffrement spécifiques à l’aide de CNG.