Невозможно расшифровать json, зашифрованный с помощью php mcrypt: RIJNDAEL 128

Я пытаюсь отправить зашифрованный файл json в мобильное приложение.

Я использую RIJNDAEL_128 с MODE_CBC, используя модуль PHP Mcrypt; все отлично работает на сервере A (провайдер Hostmetro), но когда я пробую тот же сценарий для сервера B (провайдер Hostgator), зашифрованные данные не могут быть расшифрованы из мобильного приложения.

Я использую тот же ключ и тот же IV (IV установлен на «ноль»: \ 0).

Я проверил версию mcrypt, она одинакова на серверах A и B, только версия PHP отличается.

Я тестирую сценарий на своем локальном хосте, и шифрование json снова изменяется.

Во всех моих тестах говорится, что если я попытаюсь зашифровать строку типа «текст», результат будет одинаковым везде, но если я попробую с помощью json, результат будет совсем другим: в чем проблема?

Спасибо.

Обновление: код функции шифрования:

    $str = $decrypted;
    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    if (($pad = $block - (strlen($str) % $block)) < $block) 
    {
        $str .= str_repeat(chr($pad), $pad);
    }

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = ''; for($i=0;$i<$iv_size;$i++){ $iv .= "\0";}
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->the_key, $str, MCRYPT_MODE_CBC, $iv));

Это код функции дешифрования:

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = ''; for($i=0;$i<$iv_size;$i++){ $iv .= "\0";}
    $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->the_key, base64_decode($encrypted), MCRYPT_MODE_CBC, $iv);

    # Strip PKCS7 padding.
    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $pad = ord($str[($len = strlen($str)) - 1]);
    if ($pad && $pad < $block && preg_match(
        '/' . chr($pad) . '{' . $pad . '}$/', $str))
    {
        return substr($str, 0, strlen($str) - $pad);
    }

    return $str;

ОБНОВЛЕНИЕ 12.08.2014

Я протестировал создание зашифрованного файла, и мой локальный хост и мой первый сервер (Hostmetro) дали мне действующий файл; только Hostgator создает «испорченный» файл, который невозможно расшифровать.


person Emanuele Donà    schedule 11.08.2014    source источник


Ответы (2)


Попробуйте использовать base64_encode / decode перед шифрованием / дешифрованием.

person ion    schedule 11.08.2014
comment
У меня есть, я кодирую зашифрованные данные перед сохранением и декодирую перед расшифровкой данных. - person Emanuele Donà; 12.08.2014
comment
Поскольку проблема заключается в обработке данных JSON, преобразуйте их в строку с помощью base64_encode, прежде чем фактически зашифровать их. Я имею в виду, если вы используете, например, encrypt ($ JSON) - сделайте encrypt (base64_encode ($ JSON)); - person ion; 12.08.2014
comment
Я публикую код своих функций шифрования и дешифрования ... как вы думаете, мне нужно сделать два base64_encode и base64_decode? Почему это везде работает с простым текстом? - person Emanuele Donà; 12.08.2014

Хорошо, я обнаружил проблему: проблема в том, что когда json_encode () пытается закодировать многомерный массив, и не все содержимое преобразуется в строку, когда вы шифруете этот объект json, он может быть расшифрован PHP на другом сервере или тем же, но не через мобильное приложение.

РЕШЕНИЕ

Решение преобразовать данные в String, преобразовать массив с помощью json_encode (), зашифровать json с помощью mcrypt: теперь все работает.

person Emanuele Donà    schedule 16.08.2014