[PHP] PEAR::Crypt_Blowfishによる可逆暗号化 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

PHP では Crypt() 関数などを使用すると文字列の暗号化を行うことができますが、逆に暗号化した値を元に戻す(復号する)ことができません。

ただし、PEAR::Crypt_Blowfish を使用すれば Blowfish アルゴリズムによる可逆暗号化を行うことができるようです。

PEAR::Crypt_Blowfish は、パッケージがインストールされていない場合はインストールし、

C:\xampp\php>pear install Crypt_Blowfish
downloading Crypt_Blowfish-1.0.1.tgz ...
Starting to download Crypt_Blowfish-1.0.1.tgz (11,954 bytes)
.....done: 11,954 bytes
install ok: channel://pear.php.net/Crypt_Blowfish-1.0.1

C:\xampp\php>
あとはインクルードするだけで使用することができます。

例えば、暗号化は以下のように行います。

function encrypt ( $str ) {
    require_once 'Crypt/Blowfish.php';
    $key = 'himitsu';
    $crypt = new Crypt_Blowfish( $key ); 
    return bin2hex( $crypt->encrypt( $str ) );
}
※リクエストパラメータや hidden 項目に埋め込めるよう、bin2hex() 関数を使用して暗号化した文字列を 16 進変換して返しています。

上記の方法で暗号化した文字列の復号化は以下のように行います。

function decrypt ( $str ) {
    require_once 'Crypt/Blowfish.php';
    $key = 'himitsu';
    $crypt = new Crypt_Blowfish( $key ); 
    return rtrim($crypt->decrypt( pack( "H*", $str ) ) );
}
※16進変換された暗号化文字列を pack() 関数で元に戻した上で復号化しています。
※復号化した文字列が 8 で割って端数の出るバイト数の場合、後ろにその端数を調整するための余分な x00 が付くため、rtrim() 関数で余分な x00 を除去しています。