PHPプロ!TIPS+

可逆暗号のススメ

みなさんは暗号化を行う場合、どのようにしているでしょうか。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 . ' と ' . $decrypt . ' は同じはず';

上のスクリプトでは$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 . ' と ' . $decrypt . ' は同じはず';

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

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)