22
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

phpで可逆暗号化をしてみて躓いた部分

Last updated at Posted at 2014-07-14

urlのパラメータを暗号化してみようとして、思わぬところで躓く。

下記は PHP 可逆暗号化 等で検索したら一番上に出てくるの暗号化方法
しかし、そのまま使うと・・・

暗号化

function encryptedParam($input,$key = KEY_DEFAULT)
    $key = md5($key);

    //暗号化モジュール使用開始
    $td  = mcrypt_module_open('tripledes', '', 'ecb', '');
    $key = substr($key, 0, mcrypt_enc_get_key_size($td));
    $iv  = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

    if (mcrypt_generic_init($td, $key, $iv) < 0) {
      exit('error.');
    }

    $encrypted_data = base64_encode(mcrypt_generic($td, $input));
    //print $encrypted_data;
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

    return $encrypted_data;
}

複合化

function decryptedParam($input,$key = KEY_DEFAULT)
{

    //暗号化&復号化キー
    $key = md5($key);

    //暗号化モジュール使用開始
    $td  = mcrypt_module_open('tripledes', '', 'ecb', '');
    $key = substr($key, 0, mcrypt_enc_get_key_size($td));
    $iv  = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

    //暗号化モジュール初期化
    if (mcrypt_generic_init($td, $key, $iv) < 0) {
      exit('error.');
    }

    //データを復号化
    $encrypted_data = mdecrypt_generic($td, base64_decode($input));

    //暗号化モジュール使用終了
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    
    return $encrypted_data;
    
}

下記の文字列を上記のモジュールで暗号化→複合化をしてみる(自分で実際に使った文字列)

そのまま暗号化→複合化

$a = '3'
$key = '[適当なキー]';
$a = encryptedParam($a,$key )
$a = decryptedParam($a,$key )

if($a == 3) true;

if($a == '3') false;

なるほど数値型で入ってるんだな。
ん・・・?phpの==で細かい型判定あったっけ・・・?

is_numeric($a) false

なん・・だと・・?

if($a === 3) false

???

bin2hex($a) 3300000000
bin2hex(3) 33

等など色々試してみたのですが、原因はこのモジュールを使った場合にNULL文字が末尾に入るということでした。

なので

複合化の最後の行
$encrypted_data = mdecrypt_generic($td, base64_decode($input));

の部分を

複合化の最後の行
$encrypted_data = rtrim(mdecrypt_generic($td, base64_decode($input)));

でrtrimしてあげるという方法を取り解決しました。

ちなみに上記のようにわかる場合もあれば、比較してもそのまま上手くいってしまう文字列もあるのが余計にわかりにくい。

ネットで簡単にやり方が調べられる時代とはいえ、ちゃんと自分で試してみないとわからないもんだなーと思いました(小並感)。

22
26
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?