Share via


Como: Decrypt elementos XML com teclas Asymmetric

Você pode usar as classes no System.Security.Cryptography.Xml namespace para criptografar e descriptografar um elemento dentro de um documento XML. Criptografia XML é uma forma padrão para trocar ou armazenar dados criptografados do XML, sem se preocupar com os dados que está sendo lidos com com facilidade.Para obter mais informações sobre a criptografia XML padrão, consulte que a especificação de World Wide Web Consortium (W3C) para criptografia XML localizado em http://www.w3.org/TR/xmldsig-core/.

O exemplo deste procedimento descriptografa um elemento XML que foi criptografado usando os métodos descritos em: Como: Criptografar elementos XML com assimétrica de chaves.Ele encontra um <EncryptedData>elemento, descriptografa o elemento e, em seguida, substitui o elemento com o elemento XML de texto não criptografado original.

Este exemplo descriptografa um elemento XML usando duas chaves.Ele recupera uma chave particular de RSA gerada anteriormente de um contêiner de chave, e, em seguida, usa a chave RSA para descriptografar uma chave de sessão armazenado na <EncryptedKey>elemento o <EncryptedData>elemento. O exemplo, em seguida, usa a chave de sessão para descriptografar o elemento XML.

Este exemplo é apropriado para situações em que vários aplicativos precisam compartilhe dados criptografados ou onde um aplicativo precisa salvar os dados criptografados entre as horas que ele seja executado.

Para descriptografar um elemento XML com uma chave assimétrica

  1. Criar um CspParameters objeto e especifique o nome do contêiner de chave.

    Dim cspParams As New CspParameters()
    cspParams.KeyContainerName = "XML_ENC_RSA_KEY"
    
         CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
    
  2. Recuperar uma chave assimétrica gerada anteriormente do contêiner usando o RSACryptoServiceProvider objeto. A chave é automaticamente recuperada do contêiner de chave ao passar o CspParameters objeto para o construtor das RSACryptoServiceProvider construtor.

    Dim rsaKey As New RSACryptoServiceProvider(cspParams)
    
         RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
  3. Criar novo EncryptedXml objeto para descriptografar o documento.

    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
    
         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);
            }
    
  4. Adicione um mapeamento de chave/nome para associar a chave RSA com o elemento no documento que deve ser descriptografado.Você deve usar o mesmo nome para a chave que você usou quando criptografados o documento.Observe que esse nome é separado do nome usado para identificar a chave no contêiner de chave especificado na etapa 1.

    ' Create a new EncryptedXml object.
    Dim exml As New EncryptedXml(Doc)
    
         // Create a new EncryptedXml object.
            EncryptedXml exml = new EncryptedXml(Doc);
    
  5. telefonar the DecryptDocumentmétodo para descriptografar o <EncryptedData>elemento. Esse método usa a chave RSA para descriptografar a chave de sessão e usa automaticamente a chave de sessão para descriptografar o elemento XML.Ele substitui automaticamente o <EncryptedData>elemento com o texto não criptografado original.

    exml.AddKeyNameMapping(KeyName, Alg)
    
         exml.AddKeyNameMapping(KeyName, Alg);
    
  6. salvar o documento XML.

    exml.DecryptDocument()
    
         exml.DecryptDocument();
    

Exemplo

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();

    }

}

Este exemplo assume que um arquivo chamado "test.xml" existe no mesmo diretório do programa compilado. Ele também pressupõe que "test.xml" contém um elemento XML que foi criptografado usando as técnicas descritas na Como: Criptografar elementos XML com assimétrica de chaves.

Compilando o código

Segurança

Nunca armazene uma chave de criptografia simétrica em texto não criptografado ou transferência uma chave simétrica entre máquinas em texto não criptografado.Além disso, nunca armazene ou transferência a chave particular de um emparelhar de chaves assimétricas em texto não criptografado.Para obter mais informações sobre chaves de criptografia simétricas e assimétricas, consulte Gerando chaves de criptografia e descriptografia.

Nunca incorpore uma chave diretamente no seu código-fonte.Chaves incorporadas podem ser lido com com facilidade de um assembly usando o Desassemblador do MSIL (ILDASM.exe) ou abrindo o assembly em um editor de texto, sistema autônomo o bloco de notas.

Quando tiver concluído usando uma chave criptográfica, desmarcá-la da memória, definindo cada byte para zero ou chamando o Clear método da classe criptografia gerenciada. Chaves criptográficas, às vezes, podem ser lido da memória por um depurador ou ler de um disco rígido se o local da memória é paginado para disco.

Consulte também

Tarefas

Como: Criptografar elementos XML com assimétrica de chaves

Referência

System.Security.Cryptography.Xml

Outros recursos

Assinaturas digital e criptografia XML