Cosminexus V9 アプリケーションサーバ Cosminexus XML Security - Core ユーザーズガイド

[目次][用語][索引][前へ][次へ]

4.2.4 バイナリデータを復号化する

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

<この項の構成>
(1) バイナリデータのDocumentオブジェクトの取得
(2) 暗号データの取得
(3) 暗号構文の構築
(4) バイナリデータの復号化
(5) 復号化結果の出力

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

JAXPのDocumentBuilderを使用して暗号化されたバイナリデータを含むXML文書を読み込み,Documentオブジェクトを取得します。Documentオブジェクトを取得するときに,名前空間が有効になるように設定してください。コーディングの例を次に示します。

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

(2) 暗号データの取得

DocumentオブジェクトからEncryptedData要素を取得し,EncryptedDataオブジェクトを生成します。Document要素がEncryptedData要素の場合のコーディングの例を次に示します。

        Element encelem = doc.getDocumentElement();
        if (!(DOMUtils.matchesName(encelem, XMLEncryption.XMLNS,
                "EncryptedData"))) {
            throw new Exception("missing xenc:EncryptedData");

(3) 暗号構文の構築

XMLEncryptionFactoryクラスを使用して,EncryptedData要素以下の構文に対応するオブジェクトを生成します。なお,オブジェクトを生成する前に,復号化に必要なコンテキストを設定しておく必要があります。コンテキストの処理モードは,「復号化」を指定してください。

オブジェクトを生成したら,復号化に必要な暗号アルゴリズムを指定します。このとき,復号化に使用する鍵を取得し,コンテキストに設定します。

コーディングの例を次に示します。

        XMLEncryptionFactory xef =
                XMLEncryptionFactory.newInstance();
        XMLSecurityContext context = new XMLSecurityContext(
                XMLSecurityContext.Mode.DECRYPT, doc);
        EncryptedData ed = xef.newEncryptedData(context, encelem);
        XMLEncryption xenc =
                xef.newXMLEncryption(ed.getEncryptionMethod(),
                        ed.getKeyInfo());
        context.setKeyResolver(
                new AdhocKeyResolver(Utilities.getSecretKey()));

(4) バイナリデータの復号化

XMLEncryptionクラスのdecryptメソッドを使用して,暗号化したバイナリデータを復号化します。コーディングの例を次に示します。

        DataContainer decrypted = xenc.decrypt(context, ed);

(5) 復号化結果の出力

「(4) バイナリデータの復号化」で生成したDataContainerオブジェクトから復号化結果をオクテットストリームとして取得し,ファイルに出力します。コーディングの例を次に示します。

        OutputStream os = new FileOutputStream(output);
        Utilities.copy(decrypted.getAsOctetStream(), os);
        os.close();