みなさんは暗号化を行う場合、どのようにしているでしょうか。md5によるハッ シュを使用してしまうと、元の文字列を取得することは難しくなってしまいま す。今回は暗号化を行っても復号することのできる、可逆暗号を実現するための PEAR::Crypt_Blowfishを紹介します。

暗号化にはPEAR::Crypt_BlowfishはBlowfishという暗号方式を使用します。 Blowfishを考案した同じ人が作成したTwofishという暗号方式は、DESの後継とな る暗号方式を決定する際に最終候補まで残った優れた暗号方式です。暗号化アル ゴリズムはBlowfishとTwofishでは、ほとんど同じなので暗号強度について問題 はないと言えるでしょう。ただ、暗号化アルゴリズムを問題にするような場合は (あまりないとは思いますが)、AESを使用したほうが無難でしょう。なお、こ こで出てきたBlowfish、Twofish、DES、AESはすべてPHPのMcrypt暗号化関数で使 用することができます。

まずはインストールです。現在ではstable版とbeta版の2つを利用することがで きます。今回はCBCモードという暗号利用モードを使用したいので、beta版をイ ンストールします。最後に紹介するCBCモードの利用以外はstable版も同様のこ とを行うことができます。

pear install Crypt_Blowfish-beta

では、早速PEAR::Crypt_Blowfishを使用してみましょう。暗号化は非常に簡単 で、暗号化のためのキーを決めて、暗号化を行うだけです。Mcrypt暗号化関数が コンパイル時に有効になっている場合はそちらを使用し、Mcrypt暗号化関数を使 用できない場合はPHPでの実装が自動的に使用されます。

include_once 'Crypt/Blowfish.php';

$key = 'This is secret';
$blowfish = new Crypt_Blowfish($key);

$text = '暗号化する文章';
$encrypt = $blowfish->encrypt($text);

$decrypt = $blowfish->decrypt($encrypt);
echo $text . ' と ' . $decyrpt . ' は同じはず';

上のスクリプトでは$keyが暗号化のための秘密鍵で、$encryptが暗号化済みのバ イナリ、$decryptが復号された元の文字列になります。なお、$encryptはバイナ リとなるので、文字列とするのであれば、base64エンコードなどを行います。

このように簡単に暗号化を行うことができるのですが、$encryptは暗号化に際し て常に同じバイナリを返してしまいます。ですので、もし頻繁に使用される文字 列であれば推測できてしまうかもしれません(この暗号利用モードをECBといい ます)。CBCという暗号利用モードを使用すると、暗号化された結果を変えるこ とができます。その場合は以下のようにします。

include_once "Crypt/Blowfish.php";

$key = "this is secret";
$iv = substr(md5(uniqid(rand(), 1)), 0, 8);
$blowfish =& Crypt_Blowfish::factory('cbc', $key, $iv);

$text = '暗号化する文章';
$encrypt = $blowfish->encrypt($text);

$decrypt = $blowfish->decrypt($encrypt);
echo $text . ' と ' . $decyrpt . ' は同じはず';

この場合では、CBCモードで必要な初期ベクトル($iv)を生成しています。こう することで$encryptは暗号化の度に異なる結果になりますが、復号した結果($ decrypt)は常に元の$textと同じになります。


(アシアル 森川穣)

この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。