暗号化や復号化をやるためにCipherを使ってあれこれする機会って、結構あるかと思うのだけど、生Cipherを使うのにもスレッドセーフじゃなかったり悩みどころもあるような、ないような…。というわけで、S2UtilにCipherPoolUtilというUtilを加えておきました。使い方も簡単です。
基礎
CipherPoolUtilクラスを使うにはCipherContextインターフェースっていう、どんな暗号化や復号化をするのかの情報をもつクラスが必要になります。標準でCipherContextImplという実装クラスがあるので、基本的なことであればこれで対応できるかと思います。難しい暗号化とかしたい場合はCipherContextを自分で実装してください(^^;
まず、CipherContextをどこかに定数として定義しておきます。CipherContextImplの引数はjavax.crypto.Cipherを生成するときに利用する、アルゴリズムと暗号化キーになります。使えるアルゴリズムについてはjavax.crypto.CipherのJavaDocなどを確認してください。
public static final CipherContext BLOWFISH_CONTEXT =
new CipherContextImpl("Blowfish", "hogefuga");
暗号化
まず、文字列を暗号化する場合を以下に示します。ここでは「パスワード」という文字列を暗号化しています。
String encryptoText1 =
CipherPoolUtil.encryptoText(BLOWFISH_CONTEXT, "パスワード", "UTF-8");
CipherContextを定義しておけば、あとはCipherPoolUtilでencryptoTextメソッドを呼び出します。第二引数に暗号化したい文字列、第三引数にその文字列のエンコーディングを渡すと、暗号化された文字列が返ります。
復号化
使い方は暗号化のときと同様です。
String decryptoText1 =
CipherPoolUtil
.decryptoText(BLOWFISH_CONTEXT, encryptoText1, "UTF-8");
decryptoTextメソッドを利用します。第二引数に暗号化された文字列を渡し、第三引数に文字列にするときのエンコーディングを指定します(javax.crypto.Cipherはバイナリとして扱うため)。戻り値は復号化された文字列になります。
初期化
javax.crypto.Cipherは初期化のコストがあります。そのため、CipherPoolUtilではインスタンスをプールしています。CipherPoolUtilでインスタンスの初期化しない場合は必要時にjavax.crypto.Cipherが生成されます。事前にプールしておくには以下のようにします。
CipherPoolUtil.create(BLOWFISH_CONTEXT, 5);
第二引数がプールしておくインスタンス数になります。