1

作成したクラス(以下のメソッド)を使用して、一部のデータを暗号化しようとしています。これは、データを暗号化してからpackを使用する方法です。その後、unpackを使用してデータを元に戻すことができます。

$packed = $server->cache->pack("packed", array(123,123,123), "Password");
if(!$packed){
    echo "Could not encrypt data\n";
}
$server->cache->unpack("packed", "Password");

私がそれを詰めるとき、私はvar_dumpデータjson_encode()に対してを行い、これを取得します:
string(13) "[123,123,123]"

それを開梱するとき、私は文字列に対してaを実行し、var_dumpこれmcrypt_decode()を取得します。
string(32) "[123,123,123]"

なぜ長さが違うのですか?私が弦にajson_decode()をするとき、私は戻ってきます、そしてこれが理由です。データをトリミングすると機能しますが、トリミングする必要はありません。mcrypt_decode()null

方法は次のとおりです。

<?php
public function put($key, $value, $life = 0)
{
    $this->cache[$key] = $value;
    $life              = (int)$life;
    if($life > 0)
    {
        $life = strtotime("now + $life seconds");
    }

    $this->life[$key] = $life;
}

public function get($key)
{
    return $this->cache[$key];
}

public function pack($key, $value, $secret, $life = 0)
{
    if(!function_exists("mcrypt_encrypt"))
    {
        $this->put($key, $value, $life);
        return false;
    }
    $iv_size   = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv        = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $value     = json_encode($value);
    var_dump($value);
    $cryptdata = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secret, $value, MCRYPT_MODE_ECB, $iv);
    $this->put($key, $cryptdata, $life);
    return true;
}

public function unpack($key, $secret)
{
    if(!function_exists("mcrypt_decrypt"))
    {
        return json_decode($this->get($key), true);
    }
    $cryptdata = $this->get($key);
    $iv_size   = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv        = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $data      = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secret, $cryptdata, MCRYPT_MODE_ECB, $iv);
    //$data      = json_decode($data, true);
    var_dump($data);
}
4

1 に答える 1