Share via


Vorgehensweise: Entschlüsseln von XML-Elementen mit X.509-Zertifikaten

Sie können die Klassen im System.Security.Cryptography.Xml-Namespace verwenden, um ein Element in einem XML-Dokument zu verschlüsseln und zu entschlüsseln. XML-Verschlüsselung ist ein gängiges Verfahren zum Austauschen oder Speichern von verschlüsselten XML-Daten, ohne sich Gedanken machen zu müssen, dass die Daten einfach gelesen werden können. Weitere Informationen über den XML-Verschlüsselungsstandard finden Sie in der W3C-Spezifikation (World Wide Web Consortium) für XML-Verschlüsselung unter https://www.w3.org/TR/xmldsig-core/.

In diesem Beispiel wird ein XML-Element entschlüsselt, das mithilfe der unter Vorgehensweise: Verschlüsseln von XML-Elementen mit X.509-Zertifikaten beschriebenen Methoden verschlüsselt wurde. Im Beispiel wird ein <EncryptedData>-Element gesucht, wird dieses Element entschlüsselt, und wird das Element dann durch das ursprüngliche Klartext-XML-Element ersetzt.

Im Codebeispiel dieser Vorgehensweise wird ein XML-Element mithilfe eines X.059-Zertifikats entschlüsselt, das aus einem lokalen Zertifikatsspeicher des aktuellen Benutzerkontos stammt. Im Beispiel wird die DecryptDocument-Methode verwendet, um automatisch das X.509-Zertifikat abzurufen und einen Sitzungsschlüssel zu entschlüsseln, der im <EncryptedKey>-Element des <EncryptedData>-Elements gespeichert ist. Die DecryptDocument-Methode verwendet anschließend automatisch den Sitzungsschlüssel, um das XML-Element zu entschlüsseln.

Das Beispiel eignet sich für Situationen, in denen mehrere Anwendungen verschlüsselte Daten gemeinsam nutzen müssen, oder in denen eine Anwendung verschlüsselte Daten zwischen den Zeiten speichern muss, in denen sie ausgeführt wird.

So entschlüsseln Sie ein XML-Element mit einem X.509-Zertifikat

  1. Erstellen Sie ein XmlDocument-Objekt, indem Sie eine XML-Datei von einem Datenträger laden. Das XmlDocument-Objekt enthält das zu entschlüsselnde XML-Element.

    XmlDocument xmlDoc = new XmlDocument();
    
    Dim xmlDoc As New XmlDocument()
    
  2. Erstellen Sie ein neues EncryptedXml-Objekt, indem Sie das XmlDocument-Objekt an den Konstruktor übergeben.

    EncryptedXml exml = new EncryptedXml(Doc);
    
    Dim exml As New EncryptedXml(Doc)
    
  3. Entschlüsseln Sie das XML-Dokument mit der DecryptDocument-Methode.

    exml.DecryptDocument();
    
    exml.DecryptDocument()
    
  4. Speichern Sie das XmlDocument-Objekt.

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

Beispiel

Für dieses Beispiel wird angenommen, dass eine Datei namens "test.xml" im selben Verzeichnis wie das kompilierte Programm vorhanden ist. Außerdem wird angenommen, dass "test.xml" ein "creditcard"-Element enthält. Sie können den folgenden XML-Code in eine Datei namens test.xml einfügen und mit diesem Beispiel verwenden.

<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

Kompilieren des Codes

.NET-Sicherheit

Das in diesem Beispiel verwendete X.509-Zertifikat ist nur für Testzwecke vorgesehen. Anwendungen sollten ein von einer vertrauenswürdigen Zertifizierungsstelle generiertes X.509-Zertifikat verwenden.

Siehe auch