次の方法で共有


方法 : 非対称キーで XML 要素を復号化する

更新 : 2010 年 7 月

System.Security.Cryptography.Xml 名前空間のクラスを使用して、XML ドキュメント内の要素を暗号化および復号化できます。 XML 暗号化は暗号化された XML データを変換または格納する標準の方法で、データを簡単に読み取られるおそれがありません。 XML 暗号化標準の詳細については、W3C (World Wide Web Consortium) 勧告「XML Signature Syntax and Processing」を参照してください。

この手順の例では、「方法 : 非対称キーで XML 要素を暗号化する」で説明したメソッドを使用して暗号化された XML 要素を復号化します。 <EncryptedData> 要素を検索し、要素を復号化し、要素を元のプレーンテキスト要素に置き換えます。

この例では、2 つのキーを使用して XML 要素を復号化します。 既に生成されている RSA 秘密キーをキー コンテナーから取得し、RSA キーを使用して、<EncryptedData> 要素の <EncryptedKey> 要素に格納されたセッション キーを復号化します。 次に、セッション キーを使用して XML 要素を復号化します。

この例は、複数のアプリケーションが暗号化されたデータを共有する必要がある状況や、1 つのアプリケーションが実行するたびに暗号化されたデータを保存する必要のある状況に適しています。

非対称キーで XML 要素を復号化するには

  1. CspParameters オブジェクトを作成し、キー コンテナーの名前を指定します。

    Dim cspParams As New CspParameters()
    cspParams.KeyContainerName = "XML_ENC_RSA_KEY"
    
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
    
  2. RSACryptoServiceProvider オブジェクトを使用して、既に生成されている非対称キーをコンテナーから取得します。 CspParameters オブジェクトを RSACryptoServiceProvider コンストラクターのコンストラクターに渡すと、キーがキー コンテナーから自動的に取得されます。

    Dim rsaKey As New RSACryptoServiceProvider(cspParams)
    
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
  3. 新しい EncryptedXml オブジェクトを作成して、ドキュメントを復号化します。

    ' Create a new EncryptedXml object.
    Dim exml As New EncryptedXml(Doc)
    
            // Create a new EncryptedXml object.
            EncryptedXml exml = new EncryptedXml(Doc);
    
  4. キーと名前の割り当てを追加して、復号化されるドキュメント内の要素に RSA キーを関連付けます。 キーには、ドキュメントを暗号化するときに使用したときと同じ名前を使用する必要があります。 ただし、この名前は、手順 1 で指定されたキー コンテナーのキーを識別するために使用された名前とは異なります。

    exml.AddKeyNameMapping(KeyName, Alg)
    
            exml.AddKeyNameMapping(KeyName, Alg);
    
  5. DecryptDocument メソッドを呼び出して、<EncryptedData> 要素を復号化します。 このメソッドは RSA キーを使用してセッション キーを復号化し、セッション キーを自動的に使用して XML 要素を復号化します。 また、<EncryptedData> 要素を元のプレーンテキストに自動的に置き換えます。

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

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

使用例

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

    }

}

この例では、test.xml という名前のファイルが、コンパイル済みプログラムと同じディレクトリに存在していることを前提としています。 また、test.xml に「方法 : 非対称キーで XML 要素を暗号化する」で説明した手法を使用して暗号化された XML 要素が含まれていることも前提としています。

コードのコンパイル

セキュリティ

共通暗号化キーをプレーンテキストに格納したり、マシン間で共通キーをプレーンテキストとして転送したりしないでください。 また、非対称キーのペアの秘密キーをプレーンテキストで格納または転送しないでください。 対称および非対称暗号キーの詳細については、「暗号化と復号化のためのキーの生成」を参照してください。

キーをソース コードに直接埋め込まないでください。 埋め込まれたキーは、Ildasm.exe (MSIL 逆アセンブラー) を使用したり、メモ帳などのテキスト エディターでアセンブリを開くことによって、アセンブリから簡単に読み込むことができます。

暗号化キーの使用が終了したら、各バイトをゼロに設定するか、暗号マネージ クラスの Clear メソッドを呼び出して、メモリからこのキーを消去してください。 暗号化キーはデバッガーによってメモリから読み込むことができ、メモリの場所がディスクにページングされる場合はハード ディスクから読み込むこともできます。

参照

処理手順

方法 : 非対称キーで XML 要素を暗号化する

参照

System.Security.Cryptography.Xml

その他の技術情報

XML 暗号化と XML デジタル署名

履歴の変更

日付

履歴

理由

2010 年 7 月

順序が間違っていた例を修正しました。

カスタマー フィードバック