Partager via


Encodage des données signées

Les données signées se composent de contenu de tout type et de hachages de message chiffrés du contenu par zéro ou plusieurs signataires. Le hachage résultant peut confirmer que le message d’origine n’a pas été modifié depuis la signature et que des personnes ou entités particulières ont signé les données.

L’illustration suivante illustre la procédure d’encodage d’un message signé. La liste qui suit l’illustration décrit les étapes.

Un message peut avoir plusieurs signataires, algorithmes de hachage et certificats. Bien que l’illustration montre uniquement les certificats, les listes de contrôle d’accès et les listes de contrôle client peuvent utiliser le même processus. Ils s’intègrent dans l’illustration partout où les certificats sont affichés.

encodage d’un message signé

Le processus général d’encodage des données signées est le suivant.

Pour encoder des données signées

  1. Les données sont créées (si nécessaire) et un pointeur vers ces données est récupéré.
  2. Un magasin de certificats est ouvert qui contient le certificat du signataire.
  3. La clé privée du certificat est récupérée. Deux propriétés doivent être définies sur le certificat avant de l’utiliser. L’un d’eux est utilisé pour lier un certificat à un fournisseur de solutions cloud et, au sein de ce fournisseur de solutions cloud, à un conteneur de clé privée particulier. L’autre est utilisé pour indiquer quel algorithme de hachage doit être utilisé lorsqu’une opération de hachage est appelée. Celles-ci ne doivent être définies qu’une seule fois.
  4. La propriété d’un certificat détermine l’algorithme de hachage.
  5. Un hachage des données est créé en envoyant les données via la fonction de hachage.
  6. La signature est créée en chiffrant le hachage à l’aide de la clé privée, obtenue via une propriété sur le certificat.
  7. Les données suivantes sont incluses dans le message signé terminé :
    • Données d’origine à signer
    • Algorithmes de hachage
    • Signatures
    • Structures d’informations du signataire, qui incluent l’identificateur du signataire (émetteur de certificat et numéro de série)
    • Certificats du signataire (facultatif)

Cette procédure illustre un cas simple. Les cas plus complexes impliquent des attributs authentifiés inclus dans le message. Lorsque le type de contenu est autre chose qu’une chaîne BYTE , ou qu’il existe au moins un attribut authentifié avec n’importe quel type de données, deux attributs authentifiés standard sont requis : le type de contenu (données) et le hachage du contenu. Dans ces circonstances, cryptoAPI fournit automatiquement ces deux attributs obligatoires. Les fonctions de message de bas niveau hachaient les attributs authentifiés, chiffrent le hachage avec la clé privée et fournissent celle-ci comme signature.

Utilisez les fonctions de message de bas niveau pour accomplir les tâches qui viennent d’être répertoriées, à l’aide de la procédure suivante.

Pour encoder un message signé

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

  2. Obtenez un fournisseur de chiffrement.

  3. Obtenez les certificats du signataire.

  4. Initialisez la structure CMSG_SIGNER_ENCODE_INFO .

  5. Initialisez la structure CMSG_SIGNED_ENCODE_INFO .

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

  7. Appelez CryptMsgOpenToEncode, en passant CMSG_SIGNED pour dwMsgType et un pointeur vers CMSG_SIGNED_ENCODE_INFO pour que pvMsgEncodeInfo obtienne un handle vers le message ouvert.

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

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

  10. Fermez le message en appelant CryptMsgClose.

Le résultat de cette procédure est un message encodé qui contient les données d’origine, le hachage chiffré de ces données (signature) et les informations du signataire. Il existe également un pointeur vers l’objet BLOB encodé souhaité.

Pour plus d’informations sur le codage C, consultez Exemple de programme C : signature, encodage, décodage et vérification d’un message.