Compartir a través de


Cómo: Descifrar elementos XML con certificados X.509

Actualización: noviembre 2007

Puede utilizar las clases del espacio de nombres System.Security.Cryptography.Xml para cifrar y descifrar un elemento dentro de un documento XML. El cifrado XML es un medio estándar de intercambiar o almacenar datos XML cifrados, sin preocuparse de que pudiera resultar fácil leer los datos. Para obtener más información sobre el estándar de cifrado XML, vea la especificación de World Wide Web Consortium (W3C) acerca del cifrado XML en http://www.w3.org/TR/xmldsig-core/.

En este ejemplo se descifra un elemento XML que se cifró según los métodos descritos en: Cómo: Cifrar elementos XML con certificados X.509. Se busca un elemento <EncryptedData>, se descifra y después se reemplaza con el elemento XML original de texto sin formato.

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

Este ejemplo resulta adecuado para situaciones en las que varias aplicaciones tienen que compartir datos cifrados o cuando una aplicación debe guardar datos cifrados entre períodos de ejecución.

Para descifrar un elemento XML con un certificado X.509

  1. Cree un objeto XmlDocument; para ello, cargue un archivo XML de disco. El objeto XmlDocument contiene el elemento XML que se debe descifrar.

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

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

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

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

Ejemplo

Imports System
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.  
        If Doc Is Nothing Then
            Throw New ArgumentNullException("Doc")
        End If

        ' Create a new EncryptedXml object.
        Dim exml As New EncryptedXml(Doc)
        ' Decrypt the XML document.
        exml.DecryptDocument()
    End Sub
End Module
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();

    }
}

En este ejemplo se supone que existe un archivo llamado "test.xml" en el mismo directorio que el programa compilado. También se supone que "test.xml" contiene un elemento "creditcard". Puede situar el XML siguiente en un archivo llamado test.xml y utilizarlo con este ejemplo.

<root>
    <creditcard>
        <number>19834209</number>
        <expiry>02/02/2002</expiry>
    </creditcard>
</root>

Compilar el código

Seguridad

El certificado X.509 de este ejemplo se utiliza sólo con fines de prueba. Las aplicaciones deben utilizar un certificado X.509 generado por una entidad de certificación de confianza o utilizar un certificado generado por Microsoft Windows Certificate Server.

Vea también

Tareas

Cómo: Cifrar elementos XML con certificados X.509

Referencia

System.Security.Cryptography.Xml

Otros recursos

Cifrado XML y firmas digitales