1.公開鍵でXML文書を暗号化する(C#)
.NET Frameworkを使って、XML文書をRSA公開鍵で暗号化する方法を説明します。
ここでは、共通鍵や対象鍵といった表現はせず、「秘密鍵」(Secret Key)に統一します。また、公開鍵(非対称鍵)方式の鍵は、「公開鍵」「雌雄k儀」といい混乱しないようにします。
ここでは、共通鍵や対象鍵といった表現はせず、「秘密鍵」(Secret Key)に統一します。また、公開鍵(非対称鍵)方式の鍵は、「公開鍵」「雌雄k儀」といい混乱しないようにします。
1.1 概要
関連の名前空間は以下のとおりです。
- System.XmlXML文書を扱うためのAPIを備えています。
- System.Security.cryptographyデータの安全なエンコーディングやデコーディング、およびハッシュ演算、乱数生成、メッセージ認証などの操作を含む、暗号サービスが提供されます。
- System.Security.cryptography.XmlXML デジタル署名の作成と検証をサポートするクラスを含んでいます。この名前空間のクラスは、W3C 勧告『XML-Signature Syntax and Processing』(http://www.w3.org/TR/xmldsig-core/)が実装されています。
- 署名されるXML文書をロードする。
- 暗号化の鍵を準備する。
- 暗号化するエレメントを指定する。
- 暗号化する。
- 暗号化の情報を作成する。
- XML文書を変更する。
<root>
<creditcard>
<number>19834209</number>
<expiry>02/02/2002</expiry>
</creditcard>
</root>
1.2 暗号化されるXML文書をロードする
まず、暗号化されるXML文書をロードします。
以下にコードを記します。
以下にコードを記します。
using System;
using System.Xml;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
namespace PKCrypto
{
class PKCrypto
{
static void Main(string[] args)
{
// Create an XmlDocument object.
XmlDocument xmlDoc = new XmlDocument();
// Load an XML file into the XmlDocument object.
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load("original.xml");
1.3 暗号化の鍵を準備し暗号化する
公開鍵(非対称鍵)は、秘密鍵(対称鍵)を暗号化するのに使います。秘密鍵は、XML文書のエレメントを暗号化する鍵です。
以下に、コードを記します。
以下に、コードを記します。
// キーコンテナを生成
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
// RSA公開鍵を生成
// この鍵で秘密鍵を暗号化する
RSACryptoServiceProvider rsaKey =
new RSACryptoServiceProvider(cspParams);
// 暗号化するエレメントを探し出す。
XmlElement elementToEncrypt =
xmlDoc.GetElementsByTagName("creditcard")[0] as XmlElement;
// XmlExceptionが見つかったことの確認が必要
// EncryptedXmlインスタンスを生成
EncryptedXml eXml = new EncryptedXml();
// 暗号化の256bit Rijndael鍵を生成
sessionKey = new RijndaelManaged();
sessionKey.KeySize = 256;
// 生成した秘密鍵で暗号化する
byte[] encryptedElement =
eXml.EncryptData(elementToEncrypt, sessionKey, false);
Rijndael暗号化はAES暗号化とも呼ばれる暗号化アルゴリズムです。
1.4 <EncryptedData>を作成する
<EncryptedData>オブジェクトを作成し暗号化の情報を挿入します。
以下にコードを記します。
以下にコードを記します。
// <EncryptedData>オブジェクトを生成
EncryptedData edElement = new EncryptedData();
edElement.Type = EncryptedXml.XmlEncElementUrl;
edElement.Id = EncryptionElementID;
edElement.EncryptionMethod =
new EncryptionMethod(EncryptedXml.XmlEncAES256Url);
// 秘密鍵を暗号化してこのエレメントに含める
EncryptedKey ek = new EncryptedKey();
// XML文書を暗号化した秘密鍵を公開鍵で暗号化し鍵情報とする
byte[] encryptedKey =
EncryptedXml.EncryptKey(sessionKey.Key, rsaKey, false);
ek.CipherData = new CipherData(encryptedKey);
ek.EncryptionMethod =
new EncryptionMethod(EncryptedXml.XmlEncRSA15Url);
// DataReferenceエレメントを生成する。
// このエレメントを使ってXML文書に<EncryptedData>を
// 追加する。
// XML文書に複数の<EncryptedData>を含められる。
DataReference dRef = new DataReference();
// EncryptedData URIを指定する。
dRef.Uri = "#EncryptedElement1";
// DataReferenceに暗号化のキーを挿入する。
// これにより、<EncryptedData>にキーが追加される。
ek.AddReference(dRef);
// 鍵情報エレメントにRSA鍵の名前を入れる。
edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));
// KeyInfoエレメントを生成する。
edElement.KeyInfo = new KeyInfo();
// KeyInfoNameエレメントを生成する。
KeyInfoName kin = new KeyInfoName();
// 鍵の名前を指定する。
kin.Value = "rsaKey";
つづく...
(記載の会社名および製品名は、各社の登録商標および商標です。)