Partager via


Encodage et décodage d’un message haché

Les données hachées se composent de contenu de tout type et d’un hachage du contenu. Il peut être utilisé lorsqu’il est uniquement nécessaire de confirmer que le contenu du message n’a pas été modifié depuis la création du hachage.

Lors de la création d’un message haché, il peut y avoir plusieurs algorithmes de hachage et plusieurs hachages. L’illustration suivante illustre les tâches requises pour encoder un message haché. La procédure est décrite dans le texte qui suit l’illustration.

création d’un message haché

Pour créer un message haché

  1. Obtenez un pointeur vers les données à hacher.
  2. Sélectionnez l’algorithme de hachage à utiliser.
  3. Placez les données via une fonction de hachage à l’aide de l’algorithme de hachage.
  4. Incluez les données d’origine à hacher, les algorithmes de hachage et les hachages dans le message encodé.

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

Pour hacher et encoder un message à l’aide de fonctions de message de bas niveau

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

  2. Obtenir un fournisseur de chiffrement.

  3. Initialisez la structure CMSG_HASHED_ENCODE_INFO .

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

  5. Appelez CryptMsgOpenToEncode, en passant CMSG_HASHED pour le paramètre dwMsgType et un pointeur vers CMSG_HASHED_ENCODE_INFO pour le paramètre pvMsgEncodeInfo . À la suite de cet appel, vous obtenez un handle pour le message ouvert.

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

  7. Appelez CryptMsgGetParam, en passant le handle récupéré à l’étape 5 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é, CMSG_BARE_CONTENT_PARAM doit être passé. Pour obtenir un exemple montrant cela, consultez Code de remplacement pour l’encodage d’un message enveloppé.

  8. Fermez le message en appelant CryptMsgClose.

Le résultat de cette procédure est un message encodé qui contient les données d’origine, les algorithmes de hachage et le hachage de ces données. Un pointeur vers l’objet BLOB de message encodé est obtenu à l’étape 7.

Les deux procédures suivantes décodent, puis vérifient les données hachées.

Pour décoder des données hachées

  1. Obtenez un pointeur vers l’objet BLOB encodé.
  2. Appelez CryptMsgOpenToDecode en passant les arguments nécessaires.
  3. Appelez CryptMsgUpdate une fois, en passant le handle récupéré à l’étape 2 et un pointeur vers les données à décoder. Cela entraîne l’exécution des actions appropriées sur le message, en fonction du type de message.
  4. Appelez CryptMsgGetParam, en passant le handle récupéré à l’étape 2 et les types de paramètres appropriés pour accéder aux données décodées souhaitées. Par exemple, transmettez CMSG_CONTENT_PARAM pour obtenir un pointeur vers le contenu décodé.

Pour vérifier le hachage

  1. Appelez CryptMsgControl, en passant CMSG_CTRL_VERIFY_HASH pour vérifier les hachages.
  2. Appelez CryptMsgClose pour fermer le message.

Pour obtenir un exemple de programme, consultez Exemple de programme C : encodage et décodage d’un message haché.