Compartir a través de


Procedimiento para descifrar elementos XML con certificados X.509

Puede usar las clases en el espacio de nombres System.Security.Cryptography.Xml para cifrar y descifrar un elemento dentro de un documento XML. El cifrado XML es un método estándar para intercambiar o almacenar datos XML cifrados sin preocuparse de que los datos puedan leerse con facilidad. Para más información sobre el estándar de cifrado XML, consulte la especificación de World Wide Web Consortium (W3C) del cifrado XML, que se encuentra en https://www.w3.org/TR/xmldsig-core/.

En este ejemplo se descifra un elemento XML cifrado mediante los métodos descritos en Cómo: Cifrar elementos XML con certificados X.509. Busca un elemento <EncryptedData>, lo descifra y lo reemplaza por el elemento XML de texto sin formato original.

El ejemplo de código de este procedimiento descifra un elemento XML mediante un certificado X.509 del almacén de certificados local de la cuenta de usuario actual. El ejemplo usa el método DecryptDocument para recuperar de forma automática el certificado X.509 y descifrar una clave de sesión almacenada en el elemento <EncryptedKey> del elemento <EncryptedData>. Luego, el método DecryptDocument usa automáticamente la clave de sesión para descifrar el elemento XML.

Este ejemplo resulta adecuado en aquellas situaciones en las que varias aplicaciones tienen que compartir datos cifrados o en las que una aplicación tiene que guardar datos cifrados entre los intervalos en los que se ejecuta.

Para descifrar un elemento XML con un certificado X.509

  1. Cree un objeto XmlDocument cargando un archivo XML del disco. El objeto XmlDocument contiene el elemento XML que se va a descifrar.

    XmlDocument xmlDoc = new XmlDocument();
    
    Dim xmlDoc As New XmlDocument()
    
  2. Cree un objeto EncryptedXml nuevo pasando el objeto XmlDocument al constructor.

    EncryptedXml exml = new EncryptedXml(Doc);
    
    Dim exml As New EncryptedXml(Doc)
    
  3. Descifre el documento XML mediante el método DecryptDocument.

    exml.DecryptDocument();
    
    exml.DecryptDocument()
    
  4. Guarde el objeto XmlDocument.

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

Ejemplo

En este ejemplo se supone que un archivo llamado "test.xml" se encuentra en el mismo directorio que el programa compilado. También se supone que "test.xml" contiene un elemento "creditcard". Puede colocar el siguiente código XML en un archivo llamado test.xml y usarlo con este ejemplo.

<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

Compilar el código

Seguridad de .NET

El certificado X.509 usado en este ejemplo se usa únicamente para pruebas. Las aplicaciones deben usar un certificado X.509 generado por una autoridad de certificados de confianza.

Consulte también