Affamative Way

前向きにグダグダいいながらコード書く

続・mcryptを使って見る。

昨日の続きで、今度はmcryptの使って見る。


やってることは公式のサンプルのまんまだったりするけどとりあえず関数化してみた。

コード

<?php
// 秘密鍵
define( "EFFECTIVE_KEY", "sercret_key" );

/**
 * 認証キー作成
 *
 * @param  String $input
 * @return String 暗号文
 */
function encodeKey( $input ) {
    $input = $input;

    $td = mcrypt_module_open( MCRYPT_TRIPLEDES, '', MCRYPT_MODE_ECB, '');
    srand();
    $iv = mcrypt_create_iv( mcrypt_enc_get_iv_size( $td), MCRYPT_RAND);
    $key = substr( md5( EFFECTIVE_KEY ), 0, mcrypt_enc_get_key_size( $td));
    mcrypt_generic_init( $td, $key, $iv);
    $encrypted = mcrypt_generic( $td, $input);
    mcrypt_generic_deinit( $td);
    mcrypt_module_close( $td);
    
    $encoded = base64_encode( $encrypted);
    // スラッシュが入ってくるので"_"に変換しておく(url引数に与える場合への対処)
    $encoded = preg_replace("/\//","_", $encoded);
    return $encoded;
}

/**
 * 認証キーより複合化
 *
 * @param String $parameter
 * @return String 復号した値
 */
function decodeKey( $parameter) {
    $encrypted = preg_replace( "/_/", "/", $parameter );
    $encrypted = base64_decode( $encrypted);
    
    $td = mcrypt_module_open( MCRYPT_TRIPLEDES, '', MCRYPT_MODE_ECB, '');
    srand();
    $iv = mcrypt_create_iv( mcrypt_enc_get_iv_size( $td), MCRYPT_RAND);
    $key = substr( md5( EFFECTIVE_KEY ), 0, mcrypt_enc_get_key_size( $td));
    mcrypt_generic_init( $td, $key, $iv);
    $decrypted = mdecrypt_generic( $td, $encrypted );

    mcrypt_generic_deinit( $td);
    mcrypt_module_close( $td);
    return rtrim( $decrypted);
}

// 使って見る
$input_data = "auth_data";
echo $input_data ."<br/>";

$encrypted_data = encodeKey( $input_data);
echo $encrypted_data ."<br/>";

$decrypted = decodeKey( $encrypted_data);
echo $decrypted ."<br/>";

出力結果

auth_data
VGQ8Dn_4qUbz1gPyH0Hugg==
auth_data

蛇足

  • ポイント
    • なんだかんだ、エンコードしたほうが使いやすい
      • ⇒ 暗号文をブラウザで確認しようとするとひどいことになる。
    • "/"が入ってくる
      • ⇒ クエリストリングに乗せる場合もあるだろうし出現しない"_"に置き換えてみた
    • 複合化した後に、文字列の右側に無駄なものが入ってくるの
      • ⇒ rtrimで消えるらしい


実際は生成時間とか持っておいて複合するときに有効期限チェックとかやるといいかも