Sdílet prostřednictvím


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

  1. 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";
    
  2. 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);
    
  3. 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);
    
  4. 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);
    
  5. 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();
    
  6. 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

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ů