Blowfish

phpでBlowfishを使うならセキュリティの高いCBCモードを使うこと。

Blowfishは復号可能で強力な暗号化をおこなうことができます。
キーは64ビットから448ビットの間で設定することができますが、最も強力な暗号にすることを考慮するとフルサイズのキーにすることをお薦めします。

また、デフォルトの設定(ECB)は暗号化に際して常に同じバイナリを返してしまうことから、頻繁に使用される文字列の場合推測される可能性が高くなります。

セキュリティを高くするためにはCBCというモードを使用し、ランダムな初期ベクトルを生成することで、同じ文字であっても暗号化の度に異なる結果にすることができます。

使い方

使用目的や保存場所、保存方法によって、バイナリ、16進数、Base64エンコードと使い分けるといい。

なお、復号時にデータの最後にゴミが残ることがあるので、その処理を追加してある。

———-

#Blowfishへのパス(例)

require_once('Blowfish.php');

#Blowfish 暗号化キー(例)

define('CBF_KEY','swjTGyigRYgGTAHDbL9g7MARxX-EH_iBtxXsazhK8FSFmyTSkaF2BHFDC6s_4Xii');

#初期化ベクトル(ランダム生成)

$blowfishiv = substr(md5(uniqid(rand(),1)),0,8);

#CBCモードで使用

$crypt = Crypt_Blowfish::factory('cbc',CBF_KEY,$iv);

———-

暗号化

#バイナリ

$crypted = $crypt->encrypt($str);

#16進数の場合

$crypted = bin2hex($crypt->encrypt($str));

#Base64の場合

$crypted = base64_encode($crypt->encrypt($str));

———-

復号

#バイナリ

$str = $crypt->decrypt($crypted);

#16進数の場合

$str = rtrim($crypt->decrypt(pack( "H*",$crypted)));

#Base64の場合

$decrypt = $crypt->decrypt(base64_decode($crypted));
$hex = bin2hex($decrypt);
$hex = ereg_replace("00", "", $hex);
$str = pack("H*", $hex);

Blowfishで復号化したデータ末尾にゴミがついた場合

Blowfishは、md5とは違い、可逆暗号化なので、暗号化して保存後、暗号化前のデータを使いたい時に使えて便利。
使い方としては、暗号化したいデータをBlowfishで暗号化

$crypt_data = $blowfish->encrypt($data);

base64_encodeでバイナリからテキストにしてデータベース他に保存
必要に応じて取り出したデータをBlowfishで復号化して使用。

$data = $blowfish->decrypt($crypt_data);

基本的にはこのステップだが、実際には復号化したデータの末尾にヌルコードのゴミ(€¥0)が残る時があるから、rtrimをかけておくとよい。

$data = rtrim($data,'¥0');