１．Java暗号化拡張機能（JCE）による暗号化
１．１　概要
　Java言語による暗号の解説を行います。
　JDK5.0には、JCE（Java 暗号化拡張機能）が含まれており、この機能を利用すると、共通鍵方式による
暗号化や公開鍵方式による暗号化機能を実装できます。 

１．２　共通鍵方式（秘密鍵）での暗号化
　Javaでは、共通鍵という言い方をせず、「秘密鍵」（Secret Key）といいます。本解説では、
この表現にしたがって説明します。

また、この表現に従いますと、公開鍵方式の私有鍵に相当する秘密鍵の表現と混同しますので、
「公開鍵」と「私有鍵」という表現に統一し、曖昧にならないようにします。

秘密鍵による暗号化では、パスワードベース暗号化もサポートされていますのでそれぞれの方法
を解説します。 

１．２．１　暗号化と復号　（自動生成鍵による）
　暗号化する秘密鍵を自動で生成して暗号化するコードを以下に示します。暗号化と復号では、
KeyGeneratorクラスを使って秘密鍵を生成し、Cipherクラスを使って暗号化と復号を行います。
　ここで説明する方法で利用できる既定の暗号化のアルゴリズムは、以下のとおりです。

ＡＥＳ 
ARCFOUR/RC4 
Blowfish 
DES 
DESede 
RC2 
これらの暗号化アルゴリズムは、鍵生成およびCipherの生成の際に指定します。
以下に暗号化と復号のコードを記します。
 
/*
 * 暗号化と復号
 */
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;


public class Encrypt01 {

    public static void main(String[] args) {

        try {

            // 暗号化
            KeyGenerator kg = KeyGenerator.getInstance("DES");
            Key key = kg.generateKey();
            Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
            c.init(Cipher.ENCRYPT_MODE, key);
            byte input[] = "To be encrypted data.".getBytes();
            byte encrypted[] = c.doFinal(input); // ここで暗号化

            // ここから復号処理
            byte iv[] = c.getIV();

            IvParameterSpec dps = new IvParameterSpec(iv);
            c.init(Cipher.DECRYPT_MODE, key, dps);
            byte output[] = c.doFinal(encrypted);

            // 表示
            System.out.println("The string was \"");
            System.out.println(new String(output) + "\"");

        } catch (Exception e) {

            e.printStackTrace();

        }
    }
}
 
暗号化では、鍵を生成し、その鍵を使ってデータ（クリアテキストといいます）を暗号化します。
復号の際は、同じ鍵を使って暗号化されたデータを復号します。

鍵の生成
KeyGeneratorクラスを使い鍵（Keyクラス）を生成します。KeyGenaratorクラスのインスタンスは、
コードのようにgetInstance( )を利用します。
この際に先に示したアルゴリズムを指定します。アルゴリズム名は大小文字を区別しません。
指定したアルゴリズム用の鍵は、generateKey( )で生成されます。このメソッドをコールするごと
に新たな鍵が（ランダムに）生成されます。

暗号化準備
暗号化では、Cipherクラスを使いますので、まずインスタンスを生成います。コードにあるように
getInstance( )メソッドを利用します。このとき、引数には暗号化のアルゴリズム（algorithm）
とともにモード（mode）とパディング（padding）方式を以下の形式で指定します。
　　　algorithm/mode/padding
モードおよびパディング方式は省略できますので
　　　algorithm
と指定してもかまいません。省略された場合は、既定の値が適用されます。SunJCEの場合は、
DES、DES-EDE、Blowfish暗号のデフォルトモードは ECBで、パディング方式は PKCS5Paddingです。
そのため、“DES/ECB/PKCS5Padding”と“DES”は同じです。

暗号アルゴリズムとして（既定で）指定できるものは、以下のとおりですが、アルゴリズムによって
具体的な実装方法が異なる場合がありますので注意してください。

AES: Advanced Encryption Standard として、NIST によって FIPS ドラフトに指定された。 
ARCFOUR/RC4: Ron Rivest が開発したストリーム暗号。 
Blowfish: Bruce Schneier 氏の設計によるブロック暗号 
DES: データ暗号化規格 (FIPS PUB 46-2 で定義) 
DESede: トリプル DES 暗号化 (DES-EDE) 
ECIES (Elliptic Curve Integrated Encryption Scheme) 
PBEWith<digest>And<encryption> または PBEWith<prf>And<encryption>: パスワードベースの暗号アルゴリズム (PKCS #5) で、指定されたメッセージダイジェスト (<digest>) または擬似暗号関数 (<prf>)、暗号アルゴリズム (<encryption>) を使用する。後ほど用例を示して説明します。 
RC2、RC4、および RC5: RSA Data Security, Inc の Ron Rivest により開発された可変キーサイズ暗号化アルゴリズム 
RSA: PKCS #1 で定義されている RSA 暗号化アルゴリズム 
なお、モードおよびパディング方式は以下のような値を指定できます。
モードは、 
NONE: モードなし 
CBC: FIPS PUB 81 で定義された Cipher Block Chaining Mode 
CFB: FIPS PUB 81 で定義された Cipher Feedback Mode 
ECB: 米国商務省 National Institute of Standards and Technology (NIST) の Federal Information Processing Standard (FIPS) PUB 81「DES Modes of Operation」で定義された Electronic Codebook Mode (1980 年 12 月) 
OFB: FIPS PUB 81 で定義された Output Feedback Mode 
PCBC: Kerberos バージョン 4 で定義された Propagating Cipher Block Chaining 
パディング方式は、 
ISO10126Padding: このブロック暗号用パディングは、W3C の「XML Encryption Syntax and Processing」ドキュメントに記載されている。 
NoPadding: パディングなし 
OAEPWith<digest>And<mgf>Padding: PKCS #1 に定義されている Optimal Asymmetric Encryption Padding スキーマ。 
PKCS5Padding: 「PKCS #5: Password-Based Encryption Standard」バージョン 1.5 (RSA Laboratories、1993 年 11 月) で規定されたパディング方式 
SSL3Padding: SSL Protocol バージョン 3.0 のセクション 5.2.3.2 (CBC ブロック暗号) で規定されたパディング方式 
なお、山括弧で囲まれた項目は、その他の名前で置き換えるプレースホルダです。

インスタンスを生成した後は、それを初期化します。init( )メソッドを使い、暗号化（ENCRYPT_MODE）もしくは、復号（DECRYPT_MODE）の指定とともに生成した鍵を与えます。

暗号化の実施
初期化された Cipher を使って暗号化を実施します。
バイトデータを引数として Cipher の doFinal( )メソッドに与えれると、暗号化されたデータを受け取ることができます。

復号の準備
暗号化されたデータを復号するときは、暗号化データとその暗号に利用した鍵が必要になります。鍵は、暗号化の際に生成したものをそのまま利用します。
また、暗号アルゴリズムが DES、DES-EDE、Blowfish（ただし、モードがCBC、CFB、OFB、PCBCのとき）の場合は、アルゴリズムパラメータを指定しなければなりません。アルゴリズムパラメータは、Cipherから取得します。
まず、初期化されたCipherから初期化ベクトルをgetIV( )メソッドで取り出し、その値を引数にしてアルゴリズムパラメータを取得します。（以下参照）

    byte iv[] = c.getIV();
    IvParameterSpec dps = new IvParameterSpec(iv);
このインスタンスを使って Cipher を初期化します。（以下参照）

    c.init(Cipher.DECRYPT_MODE, key, dps);
この Cipher から doFinal( )メソッドを使って復号されたデータを取得します。

この方法では、暗号化されたデータのほか暗号化の鍵データを復号する側に渡さなければなりません。暗号化の鍵をパスワードのように指定できれば、より用意に暗号化と復号を実施することができます。次では、その方法を記します。 
