javaでBlowfishを使う
仕事で暗号化を使う必要があったので
やった事をメモ
まず、Blowfishで暗号化する為に最初に決めないといけない事は
- 暗号化方式(CBC or EBC)
- パディング方式
- IV(初期ベクトル)
を決める事
暗号化方式
CBCとEBCというものがあるらしい。
ECB
初期ベクトルが固定で同じ文字を同じキーで暗号化した場合は同じ結果になる
CBC
暗号化する時に初期ベクトルがランダムで設定されるらしい
同じ文字を同じキーで暗号化しても毎回異なる結果になる
複合化する為には初期ベクトルが必要になる
※初期ベクトルについては後で書きます
パッディング方式
Blowfishでの暗号化は8byte単位でされるので、足りない場合は文字埋めされる
その方式がいろいろあるようなのでそれをここで指定する
PKCS5Padding
というのが主流らしい。
Javaのドキュメントもそうなっていたのでそうなんだろう
暗号化
例えば、暗号化される文字列が
=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
今回は暗号化部分のみだったのであんまり見てません