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