javaでBlowfishを使う

仕事で暗号化を使う必要があったので
やった事をメモ

まず、Blowfishで暗号化する為に最初に決めないといけない事は

  • 暗号化方式(CBC or EBC)
  • パディング方式
  • IV(初期ベクトル)

を決める事

暗号化方式

CBCとEBCというものがあるらしい。

ECB

初期ベクトルが固定で同じ文字を同じキーで暗号化した場合は同じ結果になる

CBC

暗号化する時に初期ベクトルがランダムで設定されるらしい
同じ文字を同じキーで暗号化しても毎回異なる結果になる
複合化する為には初期ベクトルが必要になる
※初期ベクトルについては後で書きます

パッディング方式

Blowfishでの暗号化は8byte単位でされるので、足りない場合は文字埋めされる
その方式がいろいろあるようなのでそれをここで指定する

PKCS5Padding

というのが主流らしい。
Javaのドキュメントもそうなっていたのでそうなんだろう

IV(初期ベクトル)

後で書きますといったもののよくわからない。
一番最初に使うキーらしい、こちらのサイトを参照してください

日々是妄想 : 初期化ベクトルってなに?(解決編)

暗号化

例えば、暗号化される文字列が
=1234567890

KEY(秘密鍵)が
=testkey

だった場合

String algorithm = "Blowfish";
String mode = "Blowfish/CBC/PKCS5Padding";
String target = "1234567890";
String key = "testkey";

SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), algorithm);
Cipher cipher = Cipher.getInstance(mode);

cipher.init(Cipher.ENCRYPT_MODE, sksSpec); // 暗号化モード

// 結果
System.out.println(cipher.doFinal(target.getBytes()));

byte[] iv = cipher.getIV()

// 実際に送る場合はBase64エンコードをする
// Base64.encode(hogehoge.getBytes());

となる

初期ベクトルは

cipher.getIV();

で取得できる
ECBの場合はNULLみたい

**複合化

byte[] encrypted = Base64.decode(target); // BASE64エンコードされてい売る場合
byte[] ivByte = Base64.decode(iv);

SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), algorithm);
Cipher cipher = Cipher.getInstance(mode);

// (1)
IvParameterSpec ips = new IvParameterSpec(ivByte);
cipher.init(Cipher.DECRYPT_MODE, sksSpec, ips);

// 結果
System.out.println(cipher.doFinal(encrypted));

(1)でもらったIVで初期ベクトルを指定している
初期ベクトルがない場合は

cipher.init(Cipher.DECRYPT_MODE, sksSpec);

という呼び出しで複合化ができる

PHPとやり取りをする場合は↓こんな感じらしい。
http://d.hatena.ne.jp/pasela/20100612/crypto

今回は暗号化部分のみだったのであんまり見てません