4.2.3 バイナリデータを暗号化する

この項では,バイナリデータを暗号化するアプリケーションの開発の流れを,コーディング例を示して説明します。

<この項の構成>
(1) バイナリデータのDocumentオブジェクトの生成
(2) 暗号アルゴリズムの指定
(3) 暗号データの生成
(4) 暗号構文の構築
(5) 暗号データの出力

(1) バイナリデータのDocumentオブジェクトの生成

JAXPのDocumentBuilderを使用して空のDocumentオブジェクトを生成します。ここで生成するDocumentオブジェクトは,EncryptedData要素を文書要素とする暗号文書を作成するために必要となります。Documentオブジェクトを生成するときには,名前空間が有効になるように設定してください。コーディングの例を次に示します。

       DocumentBuilderFactory dbf =
               DocumentBuilderFactory.newInstance();
       dbf.setNamespaceAware(true);
       Document doc = dbf.newDocumentBuilder().newDocument();

(2) 暗号アルゴリズムの指定

XMLEncryptionFactoryクラスを使用してXMLEncryptionオブジェクトを生成し,暗号化に必要な暗号アルゴリズムを指定します。ここでは,暗号アルゴリズムにTripleDESを指定する場合のコーディングの例を示します。

       XMLEncryptionFactory xef =
               XMLEncryptionFactory.newInstance();
       EncryptionMethod em = xef.newEncryptionMethod(
               EncryptionMethod.URI_TRIPLEDES, null);
       XMLEncryption xenc = xef.newXMLEncryption(em, null);

(3) 暗号データの生成

暗号データを生成するときは,コンテキストおよび暗号化対象のバイナリデータを指定してから,暗号データを生成します。ここでは,次の三つの処理について,コーディング例を示して説明します。

(a) コンテキストの設定

データの暗号化に必要なコンテキストを設定します。暗号化に使用するデータ暗号化鍵で鍵リゾルバを生成し,コンテキストに鍵リゾルバを設定します。コンテキストの処理モードは,「暗号化」を指定してください。コーディングの例を次に示します。

       XMLSecurityContext context = new XMLSecurityContext(
               XMLSecurityContext.Mode.ENCRYPT, doc);
       context.setKeyResolver(
               new AdhocKeyResolver(Utilities.getSecretKey()));

(b) 暗号化対象の指定

暗号化の対象とするバイナリデータを指定します。コーディングの例を次に示します。

       DataContainer toBeEncrypted = new DataContainer(
               new BufferedInputStream(new FileInputStream(input)));

(c) 暗号データの生成

「(b) 暗号化対象の指定」で指定したデータの暗号値を計算します。コーディングの例を次に示します。

       DataContainer encrypted =
               xenc.encrypt(context, toBeEncrypted);

(4) 暗号構文の構築

XMLEncryptionFactoryクラスを使用して,EncryptedData要素以下の構文に対応するオブジェクトを生成します。この場合,CipherValue要素を使用して「(3)(c) 暗号データの生成」で計算した暗号値を設定します。次に,EncryptedDataクラスのgenerateメソッドを使用して,EncryptedData要素を生成します。生成したEncryptedData要素は,Documentオブジェクトに挿入します。コーディングの例を示します。

       CipherData cd = xef.newCipherData(xef.newCipherValue(
               encrypted.getAsByteArray()));
       EncryptedData ed = xef.newEncryptedData(em, null, cd, null);
       Element encelem = ed.generate(context);
       doc.appendChild(encelem);

(5) 暗号データの出力

XMLSerializerクラスを使用して,暗号化したいバイナリデータをEncryptedData要素として挿入したDocumentオブジェクトをXML形式で出力します。冗長な名前空間を省略し,Shift_JISで出力する場合のコーディングの例を次に示します。

       XMLOutputFormat format = new XMLOutputFormat();
       format.setOmitRedundantNamespaceDecls(true);
       format.setEncoding("Shift_JIS");
       OutputStream os =
               new BufferedOutputStream(
                       new FileOutputStream(output));
       XMLSerializer xsr = new XMLSerializer(os, format);
       xsr.serialize(doc);
       os.close();