Как получить данные после декодирования из их закодированного значения?

Я проверяю, как получить фактические данные из закодированных данных, используя функции PHP-кодирования. Я не могу получить исходные данные после их кодирования. Вместо этого я получаю специальные символы Unicode...

Мой код выглядит следующим образом.

$key = '28e336ac6c9423d946ba02d19c6a2632'; // Randomly generated key
$request_params = array(
    'controller' => 'mylist',
    'action'     => 'read',
    'username'   => 'test',
    'password'   => '12345'
));
$enc_request = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, json_encode($request_params), MCRYPT_MODE_ECB));
//echo $enc_request;exit; // Here I am getting the encoded string.

$paramas = base64_decode(trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, json_decode($enc_request), MCRYPT_MODE_ECB)));
print_r($paramas); // Here I am getting like ... ºÇ
echo $paramas->controller; // Got nothing.

Что я делаю неправильно?


person Kishore Patra    schedule 04.08.2016    source источник
comment
Ошибка синтаксического анализа: синтаксическая ошибка, неожиданное ')' в tst.php в строке 8   -  person RiggsFolly    schedule 04.08.2016
comment
Исправлено: Затем: Notice: Trying to get property of non-object in tst.php on line 14   -  person RiggsFolly    schedule 04.08.2016
comment
когда я пробовал только var_dump($paramas); это меня заводит... string(3) ºÇ...   -  person Kishore Patra    schedule 04.08.2016


Ответы (2)


Я думаю, что проблема в порядке операций, которые вы делаете. Если вы внимательно посмотрите на свой код, вы сначала кодируете JSON, затем шифруете и последнее кодируете Base64. Итак, чтобы вернуть исходное значение, вам нужно сделать это в обратном порядке. Сначала декодируйте Base64, затем расшифруйте и последнее декодируйте JSON. Попробуйте что-то вроде

$paramas = json_decode(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($enc_request), MCRYPT_MODE_ECB));

Также режим ECB следует использовать только для тестирования. Перейти на CBC, если вы собираетесь использовать это.

Кроме того, mcrypt устарел. Вместо этого вы должны проверить openssl_ecrypt/openssl_decrypt. У меня не установлен mcrypt, но это работает с использованием OpenSSL:

$key = '28e336ac6c9423d946ba02d19c6a2632'; // Randomly generated key
$request_params = array(
    'controller' => 'mylist',
    'action'     => 'read',
    'username'   => 'test',
    'password'   => '12345'
);
$enc_request = base64_encode(openssl_encrypt(json_encode($request_params), 'AES-256-ECB', $key));
//echo $enc_request;exit; // Here I am getting the encoded string.

$paramas = json_decode(openssl_decrypt(base64_decode($enc_request), 'AES-256-ECB', $key));
print_r($paramas); // Here I am getting like ... ºÇ
echo $paramas->controller;
person rypskar    schedule 04.08.2016
comment
Исправьте неправильный порядок, но я проверяю то, что считаю правильным порядком, и даже тогда получаю ошибку json_decode Control character error, possibly incorrectly encoded - person RiggsFolly; 04.08.2016
comment
Попробуйте повторить текст перед json_decode, это должна быть читаемая строка - person rypskar; 04.08.2016

Когда вы делаете что-то в правильном порядке, это работает.

Этот код я тестировал, и он работает

<?php

$key = '28e336ac6c9423d946ba02d19c6a2632';//randomly generated key
$request_params = array(
    'controller' => 'mylist',
    'action'     => 'read',
    'username'   => 'test',
    'password'   => '12345'
);
$js = json_encode($request_params);
$encd = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $js, MCRYPT_MODE_ECB);

$enc_request = base64_encode($encd);
echo $enc_request . PHP_EOL;

// now reverse process in correct order
$one   = base64_decode($enc_request);
$two   = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $one, MCRYPT_MODE_ECB);
$twoa  = trim($two);
echo $twoa . PHP_EOL;

$three = json_decode($twoa);

print_r($three);
echo $three->controller . PHP_EOL;

Он также работает с функциями openssl, предложенными @rypskar.

<?php

$key = '28e336ac6c9423d946ba02d19c6a2632';//randomly generated key
$request_params = array(
    'controller' => 'mylist',
    'action'     => 'read',
    'username'   => 'test',
    'password'   => '12345'
);
$js = json_encode($request_params);
//$encd = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $js, MCRYPT_MODE_CBC);
$encd = openssl_encrypt($js, 'AES-256-ECB', $key);

$enc_request = base64_encode($encd);
echo $enc_request . PHP_EOL;

// now reverse process in correct order
$one   = base64_decode($enc_request);
//$two   = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $one, MCRYPT_MODE_CBC);
$two   = openssl_decrypt($one, 'AES-256-ECB', $key);
$twoa  = trim($two);
echo $twoa . PHP_EOL;
$three = json_decode($twoa);

print_r($three);
echo $three->controller . PHP_EOL;
person RiggsFolly    schedule 04.08.2016