Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Você pode usar as classes no System.Security.Cryptography.Xml namespace para criptografar e descriptografar um elemento dentro de um documento XML. A criptografia XML é uma maneira padrão de trocar ou armazenar dados XML criptografados, sem se preocupar com a fácil leitura dos dados. Para obter mais informações sobre o padrão de criptografia XML, consulte a recomendação do W3C (World Wide Web Consortium) Sintaxe e processamento de assinatura XML.
Nota
O código neste artigo aplica-se ao Windows.
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 localiza um <EncryptedData> elemento , descriptografa o elemento e, em seguida, substitui o elemento pelo elemento XML de texto sem formatação original.
Este exemplo descriptografa um elemento XML usando duas chaves. Ele recupera uma chave privada RSA gerada anteriormente de um contêiner de chave e, em seguida, usa a chave RSA para descriptografar uma chave de sessão armazenada no <EncryptedKey> elemento do <EncryptedData> elemento . O exemplo usa a chave de sessão para descriptografar o elemento XML.
Este exemplo é apropriado para situações em que vários aplicativos precisam compartilhar dados criptografados ou em que um aplicativo precisa salvar dados criptografados entre as vezes em que é executado.
Para desencriptar um elemento XML com uma chave assimétrica
Crie um CspParameters objeto e especifique o nome do contêiner de chave.
CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "XML_ENC_RSA_KEY";Dim cspParams As New CspParameters() cspParams.KeyContainerName = "XML_ENC_RSA_KEY"Recupere uma chave assimétrica gerada anteriormente do contêiner usando o RSACryptoServiceProvider objeto. A chave é recuperada automaticamente do contêiner de chave quando você passa o CspParameters objeto para o RSACryptoServiceProvider construtor.
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);Dim rsaKey As New RSACryptoServiceProvider(cspParams)Crie um novo EncryptedXml objeto para desencriptar o documento.
// Create a new EncryptedXml object. EncryptedXml exml = new EncryptedXml(Doc);' Create a new EncryptedXml object. Dim exml As New EncryptedXml(Doc)Adicione um mapeamento de chave/nome para associar a chave RSA ao elemento dentro do documento que deve ser desencriptado. 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 contêiner de chave especificado na etapa 1.
exml.AddKeyNameMapping(KeyName, Alg);exml.AddKeyNameMapping(KeyName, Alg)Chame o DecryptDocument mé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 também substitui automaticamente o <EncryptedData> elemento com o texto sem formatação original.exml.DecryptDocument();exml.DecryptDocument()Salve o documento XML.
xmlDoc.Save("test.xml");xmlDoc.Save("test.xml")
Exemplo
Este exemplo pressupõe que um arquivo nomeado 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.
using System;
using System.Xml;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Runtime.Versioning;
[SupportedOSPlatform("windows")]
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();
}
}
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.
ArgumentNullException.ThrowIfNull(Doc)
ArgumentNullException.ThrowIfNull(Alg)
ArgumentNullException.ThrowIfNull(KeyName)
' 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
Compilando o código
Em um projeto destinado ao .NET Framework, inclua uma referência ao
System.Security.dll.Em um projeto destinado ao .NET Core ou .NET 5, instale o pacote NuGet System.Security.Cryptography.Xml.
Inclua os seguintes namespaces: System.Xml, System.Security.Cryptographye System.Security.Cryptography.Xml.
Segurança do .NET
Nunca armazene uma chave criptográfica simétrica em texto simples ou transfira uma chave simétrica entre máquinas em texto simples. Além disso, nunca armazene ou transfira a chave privada de um par de chaves assimétricas em texto simples. Para obter mais informações sobre chaves criptográficas simétricas e assimétricas, consulte Gerando chaves para criptografia e descriptografia.
Nunca incorpore uma chave diretamente no seu código-fonte. As teclas incorporadas podem ser facilmente lidas a partir de uma montagem usando Ildasm.exe (IL Disassembler) ou abrindo a montagem em um editor de texto, como o Bloco de Notas.
Quando terminar de usar uma chave criptográfica, limpe-a da memória definindo cada byte como zero ou chamando o Clear método da classe de criptografia gerenciada. Às vezes, as chaves criptográficas podem ser lidas da memória por um depurador ou lidas de um disco rígido se o local da memória for paginado no disco.