方法: 非対称キーで XML 要素を復号化するHow to: Decrypt XML Elements with Asymmetric Keys

System.Security.Cryptography.Xml 名前空間のクラスを使用して、XML ドキュメント内の要素を暗号化および復号化することができます。You can use the classes in the System.Security.Cryptography.Xml namespace to encrypt and decrypt an element within an XML document. XML 暗号化は、データが簡単に読み取られる心配なく、暗号化された XML データを交換または保存する標準的な方法です。XML Encryption is a standard way to exchange or store encrypted XML data, without worrying about the data being easily read. 標準の XML 暗号化の詳細については、World Wide Web Consortium (W3C) の推奨事項を参照してください。 XML 署名の構文と処理します。For more information about the XML Encryption standard, see the World Wide Web Consortium (W3C) recommendation XML Signature Syntax and Processing.

この手順の例で説明する方法を使用して暗号化された XML 要素を復号化方法。非対称キーで XML 要素を暗号化するします。The example in this procedure decrypts an XML element that was encrypted using the methods described in How to: Encrypt XML Elements with Asymmetric Keys. 見つけた、<EncryptedData> 要素は、要素を復号化し、元のプレーン テキストの XML 要素を持つ要素を置き換えます。It finds an <EncryptedData> element, decrypts the element, and then replaces the element with the original plaintext XML element.

この例では、2 つのキーを使用して XML 要素を復号化します。This example decrypts an XML element using two keys. キー コンテナーから以前に生成された RSA 秘密キーを取得し、使用してセッション キーを復号化する RSA キーに格納されている、<EncryptedKey> の要素、<EncryptedData> 要素。It retrieves a previously generated RSA private key from a key container, and then uses the RSA key to decrypt a session key stored in the <EncryptedKey> element of the <EncryptedData> element. 例では、セッション キーを使用して XML 要素を復号化します。The example then uses the session key to decrypt the XML element.

この例は、複数のアプリケーションが暗号化されたデータを共有する必要がある状況や、1 つのアプリケーションが、実行する時間の間に暗号化されたデータを保存する必要がある状況に適しています。This example is appropriate for situations where multiple applications have to share encrypted data or where an application has to save encrypted data between the times that it runs.

非対称キーで XML 要素を復号化するにはTo decrypt an XML element with an asymmetric key

  1. CspParameters オブジェクトを作成し、キーのコンテナーの名前を指定します。Create a CspParameters object and specify the name of the key container.

    CspParameters cspParams = new CspParameters();
    cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
    
    Dim cspParams As New CspParameters()
    cspParams.KeyContainerName = "XML_ENC_RSA_KEY"
    
  2. RSACryptoServiceProvider オブジェクトを使用して、コンテナーから以前に生成された非対称キーを取得します。Retrieve a previously generated asymmetric key from the container using the RSACryptoServiceProvider object. CspParameters オブジェクトを RSACryptoServiceProvider コンストラクターに渡すと、キー コンテナーからキーが自動的に取得されます。The key is automatically retrieved from the key container when you pass the CspParameters object to the RSACryptoServiceProvider constructor.

    RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
    Dim rsaKey As New RSACryptoServiceProvider(cspParams)
    
  3. EncryptedXml オブジェクトを新規作成してドキュメントを復号化します。Create a new EncryptedXml object to decrypt the document.

    // Create a new EncryptedXml object.
    EncryptedXml exml = new EncryptedXml(Doc);
    
    ' Create a new EncryptedXml object.
    Dim exml As New EncryptedXml(Doc)
    
  4. 復号化が必要なドキュメント内で RSA キーと要素と関連付けるには、キーと名前のマッピングを追加します。Add a key/name mapping to associate the RSA key with the element within the document that should be decrypted. ドキュメントを暗号化したときに使用したキーと同じ名前を使用する必要があります。You must use the same name for the key that you used when you encrypted the document. この名前は、手順 1 で指定されたキー コンテナー内のキーを識別するために使用する名前とは別であることに注意してください。Note that this name is separate from the name used to identify the key in the key container specified in step 1.

    exml.AddKeyNameMapping(KeyName, Alg);
    
    exml.AddKeyNameMapping(KeyName, Alg)
    
  5. 呼び出す、DecryptDocument復号化するメソッド、<EncryptedData> 要素。Call the DecryptDocument method to decrypt the <EncryptedData> element. このメソッドは、RSA キーを使用してセッション キーを復号化してから、自動的にセッション キーを使用して、XML 要素を復号化します。This method uses the RSA key to decrypt the session key and automatically uses the session key to decrypt the XML element. 自動的に置き換えられます、<EncryptedData> 元のプレーン テキストを持つ要素。It also automatically replaces the <EncryptedData> element with the original plaintext.

    exml.DecryptDocument();
    
    exml.DecryptDocument()
    
  6. XML ドキュメントを保存します。Save the XML document.

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

Example

この例では、test.xml という名前のファイルがコンパイル済みのプログラムと同じディレクトリに存在することを前提としています。This example assumes that a file named test.xml exists in the same directory as the compiled program. これも想定test.xmlで説明する手法を使用して暗号化された XML 要素を含む方法。非対称キーで XML 要素を暗号化するします。It also assumes that test.xml contains an XML element that was encrypted using the techniques described in How to: Encrypt XML Elements with Asymmetric Keys.


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();

    }

}
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

コードのコンパイルCompiling the Code

.NET Framework セキュリティ.NET Framework Security

対称暗号化キーをプレーンテキストで保存したり、対称キーをコンピューター間でプレーンテキストで転送したりしないでください。Never store a symmetric cryptographic key in plaintext or transfer a symmetric key between machines in plaintext. 加えて、非対称キー ペアの秘密キーをプレーンテキストで保存または転送しないでください。Additionally, never store or transfer the private key of an asymmetric key pair in plaintext. 対称暗号化キーと非対称暗号化キーの詳細については、暗号化と復号化キーを生成するを参照してください。For more information about symmetric and asymmetric cryptographic keys, see Generating Keys for Encryption and Decryption.

キーをソース コードに直接埋め込まないでください。Never embed a key directly into your source code. 埋め込まれたキーが簡単に読み取れるアセンブリからを使用してIldasm.exe (IL Disassembler)またはメモ帳などのテキスト エディターでアセンブリを開くことで。Embedded keys can be easily read from an assembly by using Ildasm.exe (IL Disassembler) or by opening the assembly in a text editor such as Notepad.

暗号化キーを使用して完了したら、各バイトをゼロ (0) にするか、マネージド暗号化クラスの Clear メソッドを呼び出してメモリから消去します。When you are done using a cryptographic key, clear it from memory by setting each byte to zero or by calling the Clear method of the managed cryptography class. 暗号化キーは、デバッガーによってメモリから読み取られるか、メモリの位置がディスクにページングされている場合はハード ドライブから読み取られることがあります。Cryptographic keys can sometimes be read from memory by a debugger or read from a hard drive if the memory location is paged to disk.

関連項目See also