Encodage des données enveloppées

Les données enveloppées se composent de contenu chiffré de tout type et de clés de session de chiffrement de contenu chiffrées pour un ou plusieurs destinataires. Les messages enveloppés conservent le contenu du message secret et autorisent uniquement les personnes ou entités spécifiées à récupérer le contenu.

La syntaxe de message de chiffrement (CMS) peut être utilisée pour encoder des messages enveloppés. CMS prend en charge trois techniques de gestion des clés : le transport de clés, l’accord de clé et les clés de chiffrement à clé symétriques (KEK) précédemment distribuées. Les clés KEK symétriques précédemment distribuées sont également appelées distribution de clés de liste de diffusion.

Dans chacune de ces trois techniques, une clé de session unique est générée pour chiffrer le message enveloppé. Les problèmes de gestion des clés concernent la façon dont cette clé de session est chiffrée par l’expéditeur et déchiffrée par un récepteur. Un seul message chiffré peut être distribué à de nombreux destinataires à l’aide d’un mélange de techniques de gestion des clés.

La gestion des clés de transport de clé utilise la clé publique d’un récepteur prévu pour chiffrer la clé de session. Le récepteur déchiffre la clé de session à l’aide de la clé privée associée à la clé publique utilisée pour chiffrer. Le récepteur utilise ensuite la clé de session déchiffrée pour déchiffrer les données enveloppées. Lorsque le transport de clé est utilisé, le destinataire n’a pas confirmé d’informations sur l’identité de l’expéditeur.

Dans la gestion des contrats de clé, une clé privée temporaire Diffie-Hellman éphémère est générée et utilisée pour chiffrer la clé de session. La clé publique correspondant à la clé privée éphémère est incluse dans les informations du destinataire du message. Le destinataire déchiffre la clé de session à l’aide de la clé éphémère reçue et utilise cette clé de session déchiffrée pour déchiffrer le message enveloppé. À l’aide d’un accord de clé éphémère conjointement avec la clé privée du destinataire, le récepteur de messages dispose d’informations confirmées sur l’identité de l’expéditeur.

Pour la gestion des clés à l’aide de clés symétriques précédemment distribuées, chaque message inclut la clé de chiffrement de contenu qui a été chiffrée avec une clé de chiffrement de clé précédemment distribuée. Les récepteurs utilisent la clé de chiffrement de clé précédemment distribuée pour déchiffrer la clé de chiffrement de contenu, puis utilisent la clé de chiffrement de contenu déchiffrée pour déchiffrer le message enveloppé.

Une séquence d’événements CMS classique pour l’encodage des données enveloppées est illustrée dans l’illustration suivante.

encodage de données enveloppées

  • Un pointeur vers le message en texte clair est récupéré.
  • Une clé symétrique (session) est générée.
  • La clé symétrique et l’algorithme de chiffrement spécifié sont utilisés pour chiffrer les données de message.
  • Un magasin de certificats est ouvert.
  • Le certificat du destinataire est récupéré à partir du magasin.
  • La clé publique est récupérée à partir du certificat du destinataire.
  • À l’aide de la clé publique du destinataire, la clé symétrique est chiffrée.
  • À partir du certificat du destinataire, l’ID du destinataire est récupéré.
  • Les informations suivantes sont incluses dans le message enveloppé numériquement : l’algorithme de chiffrement des données, les données chiffrées, la clé symétrique chiffrée et la structure des informations du destinataire.

Pour utiliser des fonctions de message de bas niveau afin d’accomplir les tâches classiques qui viennent d’être répertoriées, utilisez la procédure suivante.

Pour encoder un message enveloppé

  1. Créez ou récupérez le contenu.

  2. Obtenir un fournisseur de chiffrement.

  3. Obtenir un certificat de destinataire.

  4. Initialisez la structure CMSG_ENVELOPED_ENCODE_INFO .

  5. Appelez CryptMsgCalculateEncodedLength pour obtenir la taille de l’objet BLOB de message codé. Allouez de la mémoire pour celle-ci.

  6. Appelez CryptMsgOpenToEncode, en passant CMSG_ENVELOPED pour dwMsgType et un pointeur vers CMSG_ENVELOPED_ENCODE_INFO pour pvMsgEncodeInfo. À la suite de cet appel, vous obtiendrez un handle pour le message ouvert.

  7. Appelez CryptMsgUpdate, en passant le handle récupéré à l’étape 6 et un pointeur vers les données qui doivent être chiffrées, enveloppées et encodées. Cette fonction peut être appelée autant de fois que nécessaire pour terminer le processus d’encodage.

  8. Appelez CryptMsgGetParam, en passant le handle récupéré à l’étape 6 et les types de paramètres appropriés pour accéder aux données encodées souhaitées. Par exemple, transmettez CMSG_CONTENT_PARAM pour obtenir un pointeur vers l’intégralité du message PKCS #7.

    Si le résultat de cet encodage doit être utilisé comme données internes pour un autre message encodé, tel qu’un message enveloppé, le paramètre CMSG_BARE_CONTENT_PARAM doit être passé. Pour obtenir un exemple, consultez Code de remplacement pour l’encodage d’un message enveloppé.

  9. Fermez le message en appelant CryptMsgClose.

Le résultat de cette procédure est un message encodé qui contient les données chiffrées, la clé symétrique chiffrée avec les clés publiques du destinataire et les structures de données d’informations du destinataire. La combinaison de contenu chiffré et d’une clé symétrique chiffrée pour un destinataire est une enveloppe numérique pour ce destinataire. N’importe quel type de contenu peut être enveloppé pour plusieurs destinataires.

Exemple de programme C : encodage d’un message enveloppé et signé