Postupy: Dešifrování elementů XML pomocí asymetrických klíčů

Třídy v System.Security.Cryptography.Xml oboru názvů můžete použít k šifrování a dešifrování elementu v dokumentu XML. Šifrování XML je standardní způsob výměny nebo ukládání šifrovaných dat XML, aniž byste se museli starat o snadno čitelná data. Další informace o standardu šifrování XML naleznete v doporučení Xml Signature Syntax and Processing (World Wide Web Consortium) (W3C).

Poznámka:

Kód v tomto článku platí pro Windows.

Příklad v tomto postupu dešifruje element XML, který byl zašifrován pomocí metod popsaných v tématu Postupy: Šifrování elementů XML pomocí asymetrické klíče. Najde <EncryptedData> prvek, dešifruje element a pak nahradí element původním elementem XML ve formátu prostého textu.

Tento příklad dešifruje element XML pomocí dvou klíčů. Načte dříve vygenerovaný privátní klíč RSA z kontejneru klíčů a pak pomocí klíče RSA dešifruje klíč relace uložený v <EncryptedKey> elementu <EncryptedData> prvku. Příklad pak použije klíč relace k dešifrování elementu XML.

Tento příklad je vhodný pro situace, kdy musí více aplikací sdílet šifrovaná data nebo kde aplikace musí ukládat šifrovaná data mezi dobou, po kterou běží.

Dešifrování elementu XML asymetrickým klíčem

  1. Vytvořte CspParameters objekt a zadejte název kontejneru klíčů.

    CspParameters cspParams = new CspParameters();
    cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
    
    Dim cspParams As New CspParameters()
    cspParams.KeyContainerName = "XML_ENC_RSA_KEY"
    
  2. Načtěte dříve vygenerovaný asymetrický klíč z kontejneru pomocí objektu RSACryptoServiceProvider . Klíč se automaticky načte z kontejneru klíčů při předání CspParameters objektu do konstruktoru RSACryptoServiceProvider .

    RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
    Dim rsaKey As New RSACryptoServiceProvider(cspParams)
    
  3. Vytvořte nový EncryptedXml objekt pro dešifrování dokumentu.

    // Create a new EncryptedXml object.
    EncryptedXml exml = new EncryptedXml(Doc);
    
    ' Create a new EncryptedXml object.
    Dim exml As New EncryptedXml(Doc)
    
  4. Přidejte mapování klíče nebo názvu pro přidružení klíče RSA k prvku v dokumentu, který by se měl dešifrovat. Pro klíč, který jste použili při šifrování dokumentu, musíte použít stejný název. Všimněte si, že tento název je oddělený od názvu použitého k identifikaci klíče v kontejneru klíčů určeném v kroku 1.

    exml.AddKeyNameMapping(KeyName, Alg);
    
    exml.AddKeyNameMapping(KeyName, Alg)
    
  5. DecryptDocument Volání metody dešifrování elementuEncryptedData<>. Tato metoda používá klíč RSA k dešifrování klíče relace a automaticky používá klíč relace k dešifrování elementu XML. Také automaticky nahradí <EncryptedData> prvek původním prostým textem.

    exml.DecryptDocument();
    
    exml.DecryptDocument()
    
  6. Uložte dokument XML.

    xmlDoc.Save("test.xml");
    
    xmlDoc.Save("test.xml")
    

Příklad

Tento příklad předpokládá, že soubor s názvem test.xml existuje ve stejném adresáři jako zkompilovaný program. Předpokládá se také, že test.xml obsahuje element XML, který byl zašifrován pomocí technik popsaných v tématu Postupy: Šifrování elementů XML pomocí asymetrických klíčů.


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

Probíhá kompilace kódu

Zabezpečení .NET

Nikdy neukládejte symetrický kryptografický klíč v prostém textu ani nepřeneste symetrický klíč mezi počítači v prostém textu. Kromě toho nikdy neukládáte ani nepřeneste privátní klíč asymetrického páru klíčů ve formátu prostého textu. Další informace o symetrických a asymetrických kryptografických klíčích najdete 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 (IL Disassembler) nebo otevřením sestavení v textovém editoru, jako je Poznámkový blok.

Až budete hotovi pomocí kryptografického klíče, vymažte ho z paměti nastavením každého bajtu na nulu nebo voláním Clear metody spravované kryptografické třídy. Kryptografické klíče můžou někdy číst z paměti ladicí program nebo číst z pevného disku, pokud je umístění paměti stránkované na disk.

Viz také