Share via


Gewusst wie: Entschlüsseln von XML-Elementen mit asymmetrischen Schlüsseln

Sie können die Klassen im System.Security.Cryptography.Xml-Namespace verwenden, um ein Element innerhalb eines XML-Dokuments zu ver- und zu entschlüsseln. Die XML-Verschlüsselung ist ein gängiges Verfahren zum Austauschen oder Speichern von verschlüsselten XML-Daten, mit dem der nötige Datenschutz gewährleistet wird. Weitere Informationen zum XML-Verschlüsselungsstandard finden Sie in der Empfehlung des W3C (World Wide Web Consortium) unter Syntax und Verarbeitung von XML-Signaturen.

Im Beispiel dieser Prozedur wird ein XML-Element entschlüsselt, das mithilfe der unter Gewusst wie: Entschlüsseln von XML-Elementen mit asymmetrischen Schlüsseln beschriebenen Methoden verschlüsselt wurde. Im Beispiel wird ein <EncryptedData>-Element gesucht, entschlüsselt und anschließend durch das ursprüngliche Nur-Text XML-Element ersetzt.

In diesem Beispiel wird ein XML-Element mithilfe zweier Schlüssel entschlüsselt. Es wird ein zuvor generierter privater RSA-Schlüssel aus einem Schlüsselcontainer abgerufen und anschließend zum Entschlüsseln eines im<EncryptedKey>-Element des <EncryptedData>-Elements gespeicherten Sitzungsschlüssels verwendet. Dieser Sitzungsschlüssel wird dann zum Entschlüsseln des XML-Elements verwendet.

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

So entschlüsseln Sie ein XML-Element mit einem asymmetrischen Schlüssel

  1. Erstellen Sie ein CspParameters-Objekt, und geben Sie den Namen des Schlüsselcontainers an.

    Dim cspParams As New CspParameters()
    cspParams.KeyContainerName = "XML_ENC_RSA_KEY"
    
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
    
  2. Rufen Sie einen zuvor generierten asymmetrischen Schlüssel aus dem Schlüsselcontainer mithilfe des RSACryptoServiceProvider-Objekts ab. Der Schlüssel wird automatisch aus dem Schlüsselcontainer abgerufen, wenn Sie das CspParameters-Objekt an den RSACryptoServiceProvider-Konstruktor übergeben.

    Dim rsaKey As New RSACryptoServiceProvider(cspParams)
    
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
  3. Erstellen Sie ein neues EncryptedXml-Objekt, um das Dokument zu entschlüsseln.

    ' Create a new EncryptedXml object.
    Dim exml As New EncryptedXml(Doc)
    
            // Create a new EncryptedXml object.
            EncryptedXml exml = new EncryptedXml(Doc);
    
  4. Fügen Sie eine Schlüsselnamenzuordnung hinzu, um den RSA-Schlüssel mit dem Element innerhalb des Dokuments zu verbinden, das entschlüsselt werden soll. Sie müssen für den Schlüssel den gleichen Namen verwenden, den Sie auch beim Verschlüsseln des Dokuments verwendet haben. Beachten Sie, dass dieser Name nicht mit dem Namen identisch ist, der zum Bestimmen des Schlüssels in dem in Schritt 1 benannten Schlüsselcontainer verwendet wurde.

    exml.AddKeyNameMapping(KeyName, Alg)
    
            exml.AddKeyNameMapping(KeyName, Alg);
    
  5. Rufen Sie die DecryptDocument-Methode auf, um das <EncryptedData>-Element zu entschlüsseln. Die Methode verwendet den RSA-Schlüssel zum Entschlüsseln des Sitzungsschlüssels. Dieser wird dann von ihr automatisch verwendet, um das XML-Element zu entschlüsseln. Die Methode ersetzt auch das <EncryptedData>-Element durch den ursprünglichen Nur-Text automatisch.

    exml.DecryptDocument()
    
            exml.DecryptDocument();
    
  6. Speichern Sie das XML-Dokument.

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

Beispiel

Imports System
Imports System.Xml
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml



Module Program

    Sub Main(ByVal args() As String)

        ' Create an XmlDocument object.
        Dim xmlDoc As New XmlDocument()

        ' Load an XML file into the XmlDocument object.
        Try
            xmlDoc.PreserveWhitespace = True
            xmlDoc.Load("test.xml")
        Catch e As Exception
            Console.WriteLine(e.Message)
        End Try
        Dim cspParams As New CspParameters()
        cspParams.KeyContainerName = "XML_ENC_RSA_KEY"
        ' Get the RSA key from the key container.  This key will decrypt 
        ' a symmetric key that was imbedded in the XML document. 
        Dim rsaKey As New RSACryptoServiceProvider(cspParams)
        Try

            ' Decrypt the elements.
            Decrypt(xmlDoc, rsaKey, "rsaKey")

            ' Save the XML document.
            xmlDoc.Save("test.xml")
            ' Display the encrypted XML to the console.
            Console.WriteLine()
            Console.WriteLine("Decrypted XML:")
            Console.WriteLine()
            Console.WriteLine(xmlDoc.OuterXml)
        Catch e As Exception
            Console.WriteLine(e.Message)
        Finally
            ' Clear the RSA key.
            rsaKey.Clear()
        End Try


        Console.ReadLine()

    End Sub



    Sub Decrypt(ByVal Doc As XmlDocument, ByVal Alg As RSA, ByVal KeyName As String)
        ' Check the arguments.  
        If Doc Is Nothing Then
            Throw New ArgumentNullException("Doc")
        End If
        If Alg Is Nothing Then
            Throw New ArgumentNullException("Alg")
        End If
        If KeyName Is Nothing Then
            Throw New ArgumentNullException("KeyName")
        End If 
        ' Create a new EncryptedXml object.
        Dim exml As New EncryptedXml(Doc)
        ' Add a key-name mapping.
        ' This method can only decrypt documents
        ' that present the specified key name.
        exml.AddKeyNameMapping(KeyName, Alg)
        ' Decrypt the element.
        exml.DecryptDocument()
    End Sub
End Module


using System;
using System.Xml;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;

class Program
{
    static void Main(string[] args)
    {

        // Create an XmlDocument object.
        XmlDocument xmlDoc = new XmlDocument();

        // Load an XML file into the XmlDocument object.
        try
        {
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.Load("test.xml");
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        CspParameters cspParams = new CspParameters();
        cspParams.KeyContainerName = "XML_ENC_RSA_KEY";

        // Get the RSA key from the key container.  This key will decrypt
        // a symmetric key that was imbedded in the XML document.
        RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);

        try
        {

            // Decrypt the elements.
            Decrypt(xmlDoc, rsaKey, "rsaKey");

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

            // Display the encrypted XML to the console.
            Console.WriteLine();
            Console.WriteLine("Decrypted XML:");
            Console.WriteLine();
            Console.WriteLine(xmlDoc.OuterXml);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        finally
        {
            // Clear the RSA key.
            rsaKey.Clear();
        }


        Console.ReadLine();


    }

    public static void Decrypt(XmlDocument Doc, RSA Alg, string KeyName)
    {
        // Check the arguments.
        if (Doc == null)
            throw new ArgumentNullException("Doc");
        if (Alg == null)
            throw new ArgumentNullException("Alg");
        if (KeyName == null)
            throw new ArgumentNullException("KeyName");
        // Create a new EncryptedXml object.
        EncryptedXml exml = new EncryptedXml(Doc);

        // Add a key-name mapping.
        // This method can only decrypt documents
        // that present the specified key name.
        exml.AddKeyNameMapping(KeyName, Alg);

        // Decrypt the element.
        exml.DecryptDocument();

    }

}

Dieses Beispiel setzt voraus, dass eine Datei mit dem Namen test.xml im gleichen Verzeichnis wie das kompilierte Programm vorhanden ist. Vorausgesetzt wird auch, dass test.xml ein XML-Element enthält, das mithilfe der unter Gewusst wie: Entschlüsseln von XML-Elementen mit asymmetrischen Schlüsseln beschriebenen Methoden verschlüsselt wurde.

Kompilieren des Codes

Sicherheit

Speichern Sie einen symmetrischen, kryptografischen Schlüssel nie im Nur-Text-Format, bzw. übertragen Sie einen symmetrischen Schlüssel nie im Nur-Text-Format zwischen Computern. Speichern oder Übertragen Sie außerdem den privaten Schlüssel eines asymmetrischen Schlüsselpaares nie im Nur-Text-Format. Weitere Informationen über symmetrische und asymmetrische, kryptografische Schlüssel finden Sie unter Erzeugen von Schlüsseln für die Ver- und Entschlüsselung.

Betten Sie einen Schlüssel nie direkt in den Quellcode ein. Eingebettete Schlüssel können problemlos aus einer Assembly gelesen werden, indem Sie Ildasm.exe (MSIL Disassembler-Tool) verwenden oder die Assembly in einem Texteditor öffnen, z. B. dem Windows-Editor.

Wenn Sie einen kryptografischen Schlüssel nicht mehr benötigen, entfernen Sie ihn aus dem Speicher, indem Sie jedes Byte auf 0 (null) festlegen, oder indem Sie die Clear-Methode der verwalteten Kryptografieklasse aufrufen. Kryptografische Schlüssel können manchmal von einem Debugger aus dem Speicher oder einer Festplatte gelesen werden, falls der Speicherort auf dem Datenträger ausgelagert wurde.

Siehe auch

Aufgaben

Gewusst wie: Entschlüsseln von XML-Elementen mit asymmetrischen Schlüsseln

Referenz

System.Security.Cryptography.Xml

Weitere Ressourcen

XML-Verschlüsselung und digitale Signaturen

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

Juli 2010

An falscher Stelle befindliche Beispiele korrigiert.

Kundenfeedback.