Contents

mcrypt_generic を使ってたのだけど、とあるレンタルサーバーで mcrypt が使えない。。。
なので PEAR::Crypt_Blowfish を使った暗号化に切り替え。
こっちのが簡単だったら笑う。

mcrypt_generic
(PHP 4 >= 4.0.2, PHP 5)

PEAR::Crypt_Blowfish
PHP 4.2.0

処理の流れ

使い方は mcrypt_generic とほぼ同じ。

1, 付加する文字列(salt)を作成する
2, 初期化ベクトル(iv)を作成する
2, 使用するアルゴリズムを指定してインスタンスを作成する
3, 【3】を使用してデータを暗号化する
4, 暗号化された文字列を base64 でエンコードする

mcrypt_generic_init → Crypt_Blowfish::factory
mcrypt_generic → $blowfish->encrypt($blowfish->decrypt)てな感じ。
mcrypt_module_open と mcrypt_generic_deinit、mcrypt_module_close の必要がない。

あ、簡単や。。。

ちなみにコードは↓こんな感じ。

暗号化

function encryptedData($data, $salt) {
    $salt = substr(md5($salt), 0, 8);
    $iv = substr(md5($salt), 0, 8);
    $blowfish = Crypt_Blowfish::factory("cbc", $salt, $iv);
    $encrypted_data = $blowfish->encrypt($data);
    return base64_encode($encrypted_data);
}
encryptedData(base64_encode($password), $salt);

$password は入力したパスワード
$salt はランダム文字列

複号

function decryptedData($data, $salt) {
    $salt = substr(md5($salt), 0, 8);
    $iv = substr(md5($salt), 0, 8);
    $blowfish = Crypt_Blowfish::factory('cbc', $salt, $iv);
    $decrypted_data = $blowfish->decrypt($data);
    $decrypted_data = rtrim($decrypted_data, "¥0");
    return base64_decode($decrypted_data);
}

decryptedData(base64_encode($password), $salt);

$password は入力したパスワード
$salt はパスワードと関連付けて保存しておいた文字列

おまけ

今回の $salt のようにランダムな文字列を生成したい場合がよくある。
なので以下のようなコードを書いた。

function randamChar($length) {
    for($i = 0x31; $i <= 0x39; $i++) {
    //1〜9
        $char[] = chr($i);
    }
    for($i = 0x41; $i <= 0x5a; $i++){
    // アルファベット大文字
        if(!in_array($i,array(0x49, 0x4c, 0x4f))) {
        // I,L,Oをのぞく
            $char[] = chr($i);
        }
    }
    for($i = 0x61; $i <= 0x7a; $i++) {
    // アルファベット小文字
        if(!in_array($i,array(0x69,0x6c,0x6f))) {
        // i,l,oをのぞく
            $char[] = chr($i);
        }
    }
    $salt = "";
    for($i = 0; $i < $length; $i++) {
    // $length桁の文字列を生成
        $randam = mt_rand(0, count[$char]);
        $salt .= $char[$randam];
    }
}

$length に桁数を指定すればその桁数でランダム文字列が生成される。
パスワード作るのに便利。

Comments are closed.