mcrypt не расшифровывает до такой же длины

Я пытаюсь зашифровать некоторые данные, используя класс, который я создал (методы ниже). Это то, как вы mcrypt данных затем с помощью пакета, а затем вы можете использовать распаковку, чтобы получить данные обратно.

$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]"

Когда я распаковываю его, я делаю var_dump на mcrypt_decode() строка, и получите это:
string(32) "[123,123,123]"

Почему длины разные? Когда я делаю json_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);
}

1 ответ

При использовании режима блочного шифрования, такого как ECB (вы не должны использовать этот один btw), MCrypt будет заполнять данные NUL, так что его длина делится на размер блока алгоритма шифрования.

Если вы должны знать, для Rijndael-256 размер блока составляет 256 бит или 32 байта.

Учитывая, что вы шифруете данные JSON, вы можете просто rtrim() данные и не переживай по этому поводу. Обойти это невозможно, если вы не переключитесь в режим счетчика, такой как CTR.

Другие вопросы по тегам