Procédure : déchiffrer des éléments XML avec des certificats X.509

Vous pouvez utiliser les classes de l'espace de noms System.Security.Cryptography.Xml pour chiffrer et déchiffrer un élément d'un document XML. Le chiffrement XML est une méthode normalisée qui permet d'échanger et de stocker des données XML chiffrées sans que celles-ci ne puissent être lues facilement. Pour plus d’informations sur la norme de chiffrement XML, consultez la spécification W3C (World Wide Web Consortium) relative au chiffrement XML à l’adresse https://www.w3.org/TR/xmldsig-core/.

Cet exemple déchiffre un élément XML qui a été chiffré à l’aide des méthodes décrites dans : Comment : chiffrer des éléments XML avec les certificats X.509. Il recherche un élément <EncryptedData>, le déchiffre, puis le remplace par l’élément XML en texte brut d’origine.

L'exemple de code de cette procédure déchiffre un élément XML à l'aide d'un certificat X.509 depuis le magasin de certificats local du compte d'utilisateur actuel. L’exemple utilise la méthode DecryptDocument pour récupérer automatiquement le certificat X.509 et déchiffrer une clé de session stockée dans l’élément <EncryptedKey> de l’élément <EncryptedData>. La méthode DecryptDocument utilise ensuite automatiquement la clé de session pour déchiffrer l'élément XML.

Cet exemple convient quand plusieurs applications doivent partager des données chiffrées ou quand une application doit enregistrer des données chiffrées entre chaque exécution.

Pour déchiffrer un élément XML avec un certificat X.509

  1. Créez un objet XmlDocument en chargeant un fichier XML à partir du disque. L'objet XmlDocument contient l'élément XML à déchiffrer.

    XmlDocument xmlDoc = new XmlDocument();
    
    Dim xmlDoc As New XmlDocument()
    
  2. Créez un objet EncryptedXml en passant l'objet XmlDocument au constructeur.

    EncryptedXml exml = new EncryptedXml(Doc);
    
    Dim exml As New EncryptedXml(Doc)
    
  3. Déchiffrez le document XML à l'aide de la méthode DecryptDocument.

    exml.DecryptDocument();
    
    exml.DecryptDocument()
    
  4. Enregistrez l'objet XmlDocument.

    xmlDoc.Save("test.xml");
    
    xmlDoc.Save("test.xml")
    

Exemple

Cet exemple suppose qu'un fichier nommé "test.xml" se trouve dans le même répertoire que le programme compilé. Il suppose également que "test.xml" contient un élément "creditcard". Vous pouvez placer le code XML suivant dans un fichier appelé test.xml et l'utiliser avec cet exemple.

<root>  
    <creditcard>  
        <number>19834209</number>  
        <expiry>02/02/2002</expiry>  
    </creditcard>  
</root>  
using System;
using System.Xml;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Security.Cryptography.X509Certificates;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            // Create an XmlDocument object.
            XmlDocument xmlDoc = new XmlDocument();

            // Load an XML file into the XmlDocument object.
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.Load("test.xml");

            // Decrypt the document.
            Decrypt(xmlDoc);

            // Save the XML document.
            xmlDoc.Save("test.xml");

            // Display the decrypted XML to the console.
            Console.WriteLine("Decrypted XML:");
            Console.WriteLine();
            Console.WriteLine(xmlDoc.OuterXml);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

    public static void Decrypt(XmlDocument Doc)
    {
        // Check the arguments.
        if (Doc == null)
            throw new ArgumentNullException("Doc");

        // Create a new EncryptedXml object.
        EncryptedXml exml = new EncryptedXml(Doc);

        // Decrypt the XML document.
        exml.DecryptDocument();
    }
}
Imports System.Xml
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Imports System.Security.Cryptography.X509Certificates

Module Program

    Sub Main(ByVal args() As String)
        Try
            ' Create an XmlDocument object.
            Dim xmlDoc As New XmlDocument()
            ' Load an XML file into the XmlDocument object.
            xmlDoc.PreserveWhitespace = True
            xmlDoc.Load("test.xml")

            ' Decrypt the document.
            Decrypt(xmlDoc)

            ' Save the XML document.
            xmlDoc.Save("test.xml")
            ' Display the decrypted XML to the console.
            Console.WriteLine("Decrypted XML:")
            Console.WriteLine()
            Console.WriteLine(xmlDoc.OuterXml)

        Catch e As Exception
            Console.WriteLine(e.Message)
        End Try

    End Sub


    Sub Decrypt(ByVal Doc As XmlDocument)
        ' Check the arguments.  
        ArgumentNullException.ThrowIfNull(Doc)

        ' Create a new EncryptedXml object.
        Dim exml As New EncryptedXml(Doc)
        ' Decrypt the XML document.
        exml.DecryptDocument()
    End Sub
End Module

Compilation du code

Sécurité .NET

Le certificat X.509 utilisé dans cet exemple sert à des fins de test uniquement. Il est recommandé d’utiliser un certificat X.509 généré par une autorité de certification approuvée pour les applications.

Voir aussi