Språk

Anvisningar: Dekryptera XML-element med asymmetriska nycklar

Du kan använda klasserna i System.Security.Cryptography.Xml namnområdet för att kryptera och dekryptera ett element i ett XML-dokument. XML-kryptering är ett standard sätt att utbyta eller lagra krypterade XML-data, utan att behöva oroa dig för att data ska läsas enkelt. Mer information om XML-krypteringsstandarden finns i W3C-rekommendationen (World Wide Web Consortium) för XML-signatursyntax och -bearbetning.

Kommentar

Koden i den här artikeln gäller för Windows.

Exemplet i den här proceduren dekrypterar ett XML-element som krypterades med hjälp av metoderna som beskrivs i Så här: Kryptera XML-element med asymmetriska nycklar. Den hittar ett <EncryptedData> element, dekrypterar elementet och ersätter sedan elementet med det ursprungliga XML-elementet i klartext.

Det här exemplet dekrypterar ett XML-element med två nycklar. Den hämtar en tidigare genererad privat RSA-nyckel från en nyckelcontainer och använder sedan RSA-nyckeln för att dekryptera en sessionsnyckel som lagras i elementet <EncryptedKey> i elementet.<EncryptedData> I exemplet används sedan sessionsnyckeln för att dekryptera XML-elementet.

Det här exemplet är lämpligt för situationer där flera program måste dela krypterade data eller där ett program måste spara krypterade data mellan de gånger det körs.

Dekryptera ett XML-element med en asymmetrisk nyckel

  1. Skapa ett CspParameters objekt och ange namnet på nyckelcontainern.

    CspParameters cspParams = new CspParameters();
    cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
    
    Dim cspParams As New CspParameters()
    cspParams.KeyContainerName = "XML_ENC_RSA_KEY"
    
  2. Hämta en tidigare genererad asymmetrisk nyckel från containern med hjälp av RSACryptoServiceProvider objektet. Nyckeln hämtas automatiskt från nyckelcontainern när du skickar CspParameters objektet till RSACryptoServiceProvider konstruktorn.

    RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
    Dim rsaKey As New RSACryptoServiceProvider(cspParams)
    
  3. Skapa ett nytt EncryptedXml objekt för att dekryptera dokumentet.

    // Create a new EncryptedXml object.
    EncryptedXml exml = new EncryptedXml(Doc);
    
    ' Create a new EncryptedXml object.
    Dim exml As New EncryptedXml(Doc)
    
  4. Lägg till en nyckel-/namnmappning för att associera RSA-nyckeln med elementet i dokumentet som ska dekrypteras. Du måste använda samma namn för nyckeln som du använde när du krypterade dokumentet. Observera att det här namnet är separat från det namn som används för att identifiera nyckeln i nyckelcontainern som anges i steg 1.

    exml.AddKeyNameMapping(KeyName, Alg);
    
    exml.AddKeyNameMapping(KeyName, Alg)
    
  5. DecryptDocument Anropa metoden för att dekryptera elementetEncryptedData<>. Den här metoden använder RSA-nyckeln för att dekryptera sessionsnyckeln och använder automatiskt sessionsnyckeln för att dekryptera XML-elementet. Det ersätter också automatiskt elementet <EncryptedData> med den ursprungliga klartexten.

    exml.DecryptDocument();
    
    exml.DecryptDocument()
    
  6. Spara XML-dokumentet.

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

Exempel

Det här exemplet förutsätter att en fil med namnet test.xml finns i samma katalog som det kompilerade programmet. Det förutsätter också att test.xml innehåller ett XML-element som krypterades med hjälp av de tekniker som beskrivs i How to: Encrypt XML Elements with Asymmetric Keys (Kryptera XML-element med asymmetriska nycklar).


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

Kompilera koden

.NET Security

Lagra aldrig en symmetrisk kryptografisk nyckel i klartext eller överför en symmetrisk nyckel mellan datorer i klartext. Dessutom bör du aldrig lagra eller överföra den privata nyckeln för ett asymmetriskt nyckelpar i klartext. Mer information om symmetriska och asymmetriska kryptografiska nycklar finns i Generera nycklar för kryptering och dekryptering.

Bädda aldrig in en nyckel direkt i källkoden. Inbäddade nycklar kan enkelt läsas från en sammansättning med hjälp av Ildasm.exe (IL Disassembler) eller genom att öppna sammansättningen i en textredigerare, till exempel Anteckningar.

När du är klar med att använda en kryptografisk nyckel rensar du den från minnet genom att ange varje byte till noll eller genom att anropa Clear metoden för den hanterade kryptografiklassen. Kryptografiska nycklar kan ibland läsas från minnet av ett felsökningsprogram eller läsas från en hårddisk om minnesplatsen är växling till disk.

Se även