Nasıl yapılır: XML Öğelerinin Şifresini Asimetrik Anahtarlarla Çözme

Xml belgesindeki bir öğeyi System.Security.Cryptography.Xml şifrelemek ve şifresini çözmek için ad alanında sınıfları kullanabilirsiniz. XML Şifrelemesi, verilerin kolayca okunması konusunda endişelenmeden şifrelenmiş XML verilerini değiştirmenin veya depolamanın standart bir yoludur. XML Şifreleme standardı hakkında daha fazla bilgi için bkz. World Wide Web Consortium (W3C) önerisi XML İmza Söz Dizimi ve İşleme.

Not

Bu makaledeki kod Windows için geçerlidir.

Bu yordamdaki örnek, Nasıl yapılır: XML Öğelerini Asimetrik Anahtarlarla Şifreleme başlığı altında açıklanan yöntemler kullanılarak şifrelenen bir XML öğesinin şifresini çözer. Bir <EncryptedData> öğe bulur, öğenin şifresini çözer ve ardından öğesini özgün düz metin XML öğesiyle değiştirir.

Bu örnek, iki anahtar kullanarak xml öğesinin şifresini çözer. Daha önce oluşturulmuş bir RSA özel anahtarını bir anahtar kapsayıcısından alır ve ardından öğesinin öğesinde <EncryptedKey> depolanan bir oturum anahtarının <EncryptedData> şifresini çözmek için RSA anahtarını kullanır. Örnek daha sonra XML öğesinin şifresini çözmek için oturum anahtarını kullanır.

Bu örnek, birden çok uygulamanın şifrelenmiş verileri paylaşması gereken veya uygulamanın çalıştığı süreler arasında şifrelenmiş verileri kaydetmesi gereken durumlar için uygundur.

Xml öğesinin şifresini asimetrik anahtarla çözmek için

  1. Bir CspParameters nesne oluşturun ve anahtar kapsayıcısının adını belirtin.

    CspParameters cspParams = new CspParameters();
    cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
    
    Dim cspParams As New CspParameters()
    cspParams.KeyContainerName = "XML_ENC_RSA_KEY"
    
  2. nesnesini kullanarak RSACryptoServiceProvider kapsayıcıdan daha önce oluşturulmuş bir asimetrik anahtar alın. Nesneyi RSACryptoServiceProvider oluşturucuya geçirdiğinizde CspParameters anahtar, anahtar kapsayıcısından otomatik olarak alınır.

    RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
    Dim rsaKey As New RSACryptoServiceProvider(cspParams)
    
  3. Belgenin şifresini çözmek için yeni EncryptedXml bir nesne oluşturun.

    // Create a new EncryptedXml object.
    EncryptedXml exml = new EncryptedXml(Doc);
    
    ' Create a new EncryptedXml object.
    Dim exml As New EncryptedXml(Doc)
    
  4. RSA anahtarını şifresi çözülmesi gereken belgedeki öğeyle ilişkilendirmek için bir anahtar/ad eşlemesi ekleyin. Belgeyi şifrelerken kullandığınız anahtar için aynı adı kullanmanız gerekir. Bu adın, 1. adımda belirtilen anahtar kapsayıcısında anahtarı tanımlamak için kullanılan addan ayrı olduğunu unutmayın.

    exml.AddKeyNameMapping(KeyName, Alg);
    
    exml.AddKeyNameMapping(KeyName, Alg)
    
  5. öğesinin DecryptDocument şifresini çözmek için yöntemini çağırınEncryptedData<>. Bu yöntem, oturum anahtarının şifresini çözmek için RSA anahtarını kullanır ve XML öğesinin şifresini çözmek için oturum anahtarını otomatik olarak kullanır. Ayrıca, öğesini otomatik olarak özgün düz metinle değiştirir <EncryptedData> .

    exml.DecryptDocument();
    
    exml.DecryptDocument()
    
  6. XML belgesini kaydedin.

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

Örnek

Bu örnekte, adlı test.xml bir dosyanın derlenen programla aynı dizinde mevcut olduğu varsayılır. Ayrıca, Nasıl yapılır: XML Öğelerini Asimetrik Anahtarlarla Şifreleme başlığı altında açıklanan teknikler kullanılarak şifrelenmiş bir XML öğesi içerdiği varsayılırtest.xml.


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

Kod Derleniyor

.NET Güvenliği

Simetrik şifreleme anahtarını hiçbir zaman düz metin olarak depolamayın veya düz metin olarak makineler arasında bir simetrik anahtar aktarmayın. Ayrıca, asimetrik anahtar çiftinin özel anahtarını hiçbir zaman düz metin olarak depolamayın veya aktarmayın. Simetrik ve asimetrik şifreleme anahtarları hakkında daha fazla bilgi için bkz . Şifreleme ve Şifre Çözme için Anahtar Oluşturma.

Hiçbir zaman bir anahtarı doğrudan kaynak kodunuz içine eklemeyin. Katıştırılmış anahtarlar, Ildasm.exe (IL Disassembler) kullanılarak veya derlemeyi Not Defteri gibi bir metin düzenleyicisinde açarak bir derlemeden kolayca okunabilir.

Şifreleme anahtarı kullanmayı bitirdiğinizde, her bayt değerini sıfır olarak ayarlayarak veya yönetilen şifreleme sınıfının yöntemini çağırarak Clear bellekten temizleyin. Şifreleme anahtarları bazen bir hata ayıklayıcı tarafından bellekten okunabilir veya bellek konumu diske çağrılırsa sabit sürücüden okunabilir.

Ayrıca bkz.