Я пытаюсь отправить зашифрованный файл 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 создает «испорченный» файл, который невозможно расшифровать.