方法 : 非対称キーで 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 要素を復号化するには
CspParameters オブジェクトを作成し、キー コンテナーの名前を指定します。
Dim cspParams As New CspParameters() cspParams.KeyContainerName = "XML_ENC_RSA_KEY"
CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
RSACryptoServiceProvider オブジェクトを使用して、既に生成されている非対称キーをコンテナーから取得します。 CspParameters オブジェクトを RSACryptoServiceProvider コンストラクターのコンストラクターに渡すと、キーがキー コンテナーから自動的に取得されます。
Dim rsaKey As New RSACryptoServiceProvider(cspParams)
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
新しい EncryptedXml オブジェクトを作成して、ドキュメントを復号化します。
' Create a new EncryptedXml object. Dim exml As New EncryptedXml(Doc)
// Create a new EncryptedXml object. EncryptedXml exml = new EncryptedXml(Doc);
キーと名前の割り当てを追加して、復号化されるドキュメント内の要素に RSA キーを関連付けます。 キーには、ドキュメントを暗号化するときに使用したときと同じ名前を使用する必要があります。 ただし、この名前は、手順 1 で指定されたキー コンテナーのキーを識別するために使用された名前とは異なります。
exml.AddKeyNameMapping(KeyName, Alg)
exml.AddKeyNameMapping(KeyName, Alg);
DecryptDocument メソッドを呼び出して、<EncryptedData> 要素を復号化します。 このメソッドは RSA キーを使用してセッション キーを復号化し、セッション キーを自動的に使用して XML 要素を復号化します。 また、<EncryptedData> 要素を元のプレーンテキストに自動的に置き換えます。
exml.DecryptDocument()
exml.DecryptDocument();
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 要素が含まれていることも前提としています。
コードのコンパイル
この例をコンパイルするには、System.Security.dll への参照を含める必要があります。
System.Xml、System.Security.Cryptography、および System.Security.Cryptography.Xml 名前空間を含めます。
セキュリティ
共通暗号化キーをプレーンテキストに格納したり、マシン間で共通キーをプレーンテキストとして転送したりしないでください。 また、非対称キーのペアの秘密キーをプレーンテキストで格納または転送しないでください。 対称および非対称暗号キーの詳細については、「暗号化と復号化のためのキーの生成」を参照してください。
キーをソース コードに直接埋め込まないでください。 埋め込まれたキーは、Ildasm.exe (MSIL 逆アセンブラー) を使用したり、メモ帳などのテキスト エディターでアセンブリを開くことによって、アセンブリから簡単に読み込むことができます。
暗号化キーの使用が終了したら、各バイトをゼロに設定するか、暗号マネージ クラスの Clear メソッドを呼び出して、メモリからこのキーを消去してください。 暗号化キーはデバッガーによってメモリから読み込むことができ、メモリの場所がディスクにページングされる場合はハード ディスクから読み込むこともできます。
参照
処理手順
参照
System.Security.Cryptography.Xml
その他の技術情報
履歴の変更
日付 |
履歴 |
理由 |
---|---|---|
2010 年 7 月 |
順序が間違っていた例を修正しました。 |
カスタマー フィードバック |