Como: Decrypt elementos XML com teclas Asymmetric

Você pode usar as classes de System.Security.Cryptography.Xml o namespace para criptografar e descriptografar um elemento dentro de um documento XML. Criptografia XML é uma maneira padrão de troca ou armazena os dados criptografados de XML, sem se preocupar sobre os dados que está sendo lidos facilmente. Para obter mais informações sobre o padrão de criptografia XML, consulte a recomendação do World Wide Web Consortium (W3C) sintaxe de assinatura XML e o processamento.

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

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

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

Para descriptografar um elemento XML com uma chave assimétrica

  1. Criar um CspParameters de 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 a partir do contêiner usando o RSACryptoServiceProvider objeto. A chave é automaticamente recuperada do recipiente da chave quando você passar o CspParameters o objeto para o RSACryptoServiceProvider construtor.

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

    ' Create a new EncryptedXml object.
    Dim exml As New EncryptedXml(Doc)
    
            // Create a new EncryptedXml object.
            EncryptedXml exml = new EncryptedXml(Doc);
    
  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 criptografou o documento. Observe que esse nome é separado do nome usado para identificar a chave no recipiente de chave especificado na etapa 1.

    exml.AddKeyNameMapping(KeyName, Alg)
    
            exml.AddKeyNameMapping(KeyName, Alg);
    
  5. Chamar o DecryptDocument método para descriptografar o <EncryptedData> elemento. Este 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 também automaticamente substitui o <EncryptedData> elemento com o texto sem formatação original.

    exml.DecryptDocument()
    
            exml.DecryptDocument();
    
  6. Salve o documento XML.

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

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 que o programa compilado. Ele também pressupõe que test.xml contém um elemento XML que foi criptografado usando as técnicas descritas em Como: Criptografar elementos XML com chaves assimétricas.

Compilando o código

Segurança

Nunca armazene uma chave de criptografia simétrica em texto sem formatação ou transferir uma chave simétrica entre máquinas em texto sem formatação. Além disso, nunca armazene ou transferir a chave particular de um par de chaves assimétricas em texto sem formatação. Para obter mais informações sobre chaves de criptografia simétricas e assimétricas, consulte A geração de chaves de criptografia e descriptografia.

Nunca incorpore uma chave diretamente em seu código-fonte. Chaves incorporadas podem ser facilmente lidas de um assembly usando Ildasm. exe (desmontador MSIL) ou abrindo o assembly em um editor de texto como o bloco de notas.

Quando você terminar usando uma chave criptográfica, desmarcá-la da memória, definindo cada byte para zero ou chamando o Clear o método da classe de criptografia gerenciadas. Às vezes, as chaves criptográficas podem ser lido da memória por um depurador ou ler a partir de um disco rígido se o local da memória é paginado para disco.

Consulte também

Tarefas

Como: Criptografar elementos XML com chaves assimétricas

Referência

System.Security.Cryptography.Xml

Outros recursos

Criptografia XML e assinaturas digitais

Histórico de alterações

Date

History

Motivo

Julho de 2010

Corrigido exemplos que estavam fora de ordem.

Comentários do cliente.