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
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";
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);
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); }
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);
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);
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
Para compilar este exemplo, você precisa incluir uma referência a System.Security.dll.
Inclua os namespaces a seguir: System.Xml, System.Security.Cryptography, e System.Security.Cryptography.Xml.
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