Использование mcrypt для передачи данных через веб-службу не выполняется

Я пишу сценарий обработчика ошибок, который шифрует данные об ошибках (файл, строка, ошибка, сообщение и т. Д.) И передает сериализованный массив как переменную POST (используя curl) для скрипта, который затем регистрирует ошибку в центральном db.

Я тестировал свои функции шифрования / дешифрования в одном файле, и данные шифруются и дешифруются в порядке:

define('KEY', 'abc'); define('CYPHER', 'blowfish'); define('MODE', 'cfb'); function encrypt($data) { $td = mcrypt_module_open(CYPHER, '', MODE, ''); $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); mcrypt_generic_init($td, KEY, $iv); $crypttext = mcrypt_generic($td, $data); mcrypt_generic_deinit($td); return $iv.$crypttext; } function decrypt($data) { $td = mcrypt_module_open(CYPHER, '', MODE, ''); $ivsize = mcrypt_enc_get_iv_size($td); $iv = substr($data, 0, $ivsize); $data = substr($data, $ivsize); if ($iv) { mcrypt_generic_init($td, KEY, $iv); $data = mdecrypt_generic($td, $data); } return $data; } echo "<pre>"; $data = md5(''); echo "Data: $data\n"; $e = encrypt($data); echo "Encrypted: $e\n"; $d = decrypt($e); echo "Decrypted: $d\n"; 

Вывод:

 Data: d41d8cd98f00b204e9800998ecf8427e Encrypted: ê÷#¯KžViiÖŠŒÆÜ,ÑFÕUW£´Œt?†÷>c×åóéè+„N Decrypted: d41d8cd98f00b204e9800998ecf8427e 

Проблема заключается в том, что когда я помещаю функцию шифрования в свой файл передачи (tx.php) и дешифровать в моем получаемом файле (rx.php), данные не полностью дешифрованы (оба файла имеют одинаковый набор констант для ключа, cypher и режим).

 Data before passing: a:4:{s:3:"err";i:1024;s:3:"msg";s:4:"Oops";s:4:"file";s:46:"/Applications/MAMP/htdocs/projects/txrx/tx.php";s:4:"line";i:80;} Data decrypted: Mª4:{s:3:"err";i:1024@7OYªç`^;g";s:4:"Oops";s:4:"file";sôÔ8F•Ópplications/MAMP/htdocs/projects/txrx/tx.php";s:4:"line";i:80;} 

Обратите внимание на случайные символы посередине.

Мой завиток довольно прост:

 $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, 'data=' . $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($ch); 

Вещи, которые, как я подозреваю, могут быть причиной этого:

  • Кодирование запроса на завивание
  • Что-то делать с отсутствием байтов mcrypt
  • Я слишком долго смотрел на него и пропустил что-то действительно действительно очевидное

Если я отключу функции криптографии (поэтому передача tx-> rx незашифрована), данные получаются штрафом.

Любая помощь очень ценится!

Спасибо, Адам

Зашифрованные данные двоичные, но вы не кодировали URL. Сделайте это в CURL,

 $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, 'data=' . urlencode($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($ch); 

Я понял это – должен был base64_encode данные после шифрования, а затем base64_decode перед расшифровкой.

Спасибо тем, кто думал от моего имени!

Ни один из ответов не подходит для меня. Base64_encode по-прежнему небезопасен и имеет проблемы с пробелами и плюс знаки для более длинных строк. Я нашел эти функции полезными:

 <?php function urlsafe_b64encode($string) { $data = base64_encode($string); $data = str_replace(array('+','/','='),array('-','_','.'),$data); return $data; } function urlsafe_b64decode($string) { $data = str_replace(array('-','_','.'),array('+','/','='),$string); $mod4 = strlen($data) % 4; if ($mod4) { $data .= substr('====', $mod4); } return base64_decode($data); } ?> 

Надеюсь, это поможет кому-то.