Postupy: Dešifrování elementů XML pomocí asymetrických klíčů
K zašifrování a dešifrování elementu dokumentu XML lze použít třídy v oboru názvů System.Security.Cryptography.Xml. Šifrování XML představuje standardní způsob pro předávání nebo ukládaní zašifrovaných dat XML bez obav, že by byla data snadno čitelná. Další informace o standardu XML šifrování viz doporučení World Wide Web Consortium (W3C) XML syntaxi Signature a zpracování.
Příklad tohoto postupu dešifruje prvek XML, které byly zašifrovány pomocí metody popsané v Postupy: Šifrování elementů XML pomocí asymetrických klíčů. Příklad nalezne element <EncryptedData>, dešifruje element a pak element nahradí původním nešifrovaným elementem XML.
V tomto příkladu je dešifrován element XML pomocí dvou klíčů. Z kontejneru klíčů načte dříve vygenerovaný privátní klíč RSA a potom používá klíč RSA k dešifrování klíče relace uloženém v elementu <EncryptedKey>, který se nachází elementu <EncryptedData>. V potom příklad používá klíč relace k dešifrování elementu XML.
Tento příklad je vhodná pro situace, kde mají více aplikací sdílení šifrovaných dat nebo kde má ukládat zašifrovaná data mezi časy, které spustí aplikace.
Postup pro dešifrování elementu XML asymetrickým klíčem
Vytvořte objekt CspParameters a zadejte název kontejneru klíčů.
Dim cspParams As New CspParameters() cspParams.KeyContainerName = "XML_ENC_RSA_KEY"
CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
Z kontejneru klíčů načtěte dříve vygenerovaný asymetrický klíč pomocí objektu RSACryptoServiceProvider. Klíč automaticky načte z kontejneru klíčů při předání CspParameters k objektu RSACryptoServiceProvider konstruktoru.
Dim rsaKey As New RSACryptoServiceProvider(cspParams)
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
Vytvořit nový EncryptedXml objektu dešifrování dokumentů.
' Create a new EncryptedXml object. Dim exml As New EncryptedXml(Doc)
// Create a new EncryptedXml object. EncryptedXml exml = new EncryptedXml(Doc);
Přidejte mapování klíč/název pro spojení klíče RSA s elementem v dokumentu, který by měl být dešifrován. Je nutné použít pro klíč stejný název, jako byl použit při šifrování dokumentu. Všimněte si, že tento název je jiný než název použitý k identifikaci klíče v kontejneru klíčů v kroku 1.
exml.AddKeyNameMapping(KeyName, Alg)
exml.AddKeyNameMapping(KeyName, Alg);
Zavolejte metodu DecryptDocument pro dešifrování elementu <EncryptedData>. Tato metoda používá RSA klíč k dešifrování klíče relace a automaticky používá klíč relace k dešifrování elementu XML. Také automaticky nahradí element <EncryptedData> původním nešifrovaným elementem.
exml.DecryptDocument()
exml.DecryptDocument();
Uložte dokument XML.
xmlDoc.Save("test.xml")
xmlDoc.Save("test.xml");
Příklad
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();
}
}
Tento příklad předpokládá, že soubor s názvem test.xml existuje ve stejném adresáři jako Zkompilovaný program. Dále předpokládá, že test.xml obsahuje element XML, který byl šifrován pomocí technik popsaných v Postupy: Šifrování elementů XML pomocí asymetrických klíčů.
Probíhá kompilace kódu
Pro zkompilování tohoto příkladu je třeba přidat odkaz na System.Security.dll.
Je potřeba zahrnout následující obory názvů: System.Xml, System.Security.Cryptography a System.Security.Cryptography.Xml
Zabezpečení
Nikdy neukládejte symetrický šifrovací klíč jako prostý text ani nepřenášejte symetrický klíč mezi stroji jako prostý text. Také nikdy neukládejte ani nepřenášejte privátní klíč asymetrického páru klíčů jako prostý text. Další informace o symetrických a asymetrických kryptografických klíčích naleznete v tématu Generování klíčů pro šifrování a dešifrování.
Nikdy nevkládejte klíč přímo do zdrojového kódu. Vložený klíče lze snadno číst ze sestavení pomocí Ildasm.exe (MSIL Disassembler) nebo otevřením sestavení v textovém editoru, například programu Poznámkový blok.
Jakmile přestanete používat kryptografický klíč, vymažte jej z paměti nastavením všech bajtů na nulu nebo voláním metody Clear ze spravované kryptografické třídy. Kryptografické klíče mohou být někdy přečteny z paměti ladicím programem nebo přečteny z pevného disku, pokud je oblast paměti stránkována na disk.
Viz také
Úkoly
Postupy: Šifrování elementů XML pomocí asymetrických klíčů
Odkaz
System.Security.Cryptography.Xml
Další zdroje
Šifrování XML a digitální podpisy
Historie změn
Datum |
Poslední dokumenty |
Důvod |
---|---|---|
Červenec 2010 |
Opravené příklady, které byly mimo pořadí. |
Názory zákazníků |