mcrypt_decrypt возвращает странный код

Я попытался зашифровать массив, а затем дешифровать его обратно в строку, вызвав функцию, кажется, что возвращает правильное значение, если я все время зашифровываю и дешифрую сразу в функции, однако, если я возвращаю значение шифрования, а затем вызываю функцию снова, чтобы расшифровать, он вернет мне какой-то странный код.

Пример 1:

public main() { $dataArray = array("one"=>1, "two"=>2, "three"=>3); $a = $this->encryptDecryptInfo(json_encode($dataArray),$this->key); var_dump($a); } public function encryptDecryptInfo($text,$key) { $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, $text= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv)); return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_CFB, $iv); } 

Это вернет мне правильное значение, которое является строкой (27) "{" one ": 1," two ": 2," three ": 3}"

Пример 2:

 public main() { $dataArray = array("one"=>1, "two"=>2, "three"=>3); $a = $this->encryptDecryptInfo(json_encode($dataArray),$this->key,"encrypt"); $b = $this->encryptDecryptInfo($a,$this->key,"decrypt"); var_dump($b); } public function encryptDecryptInfo($text,$key,$type) { $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB), MCRYPT_RAND); if($type == "encrypt") return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv)); else return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_CFB, $iv); } 

Однако, если я сделаю свой код таким образом, он вернет мне странное значение, которое похоже на эту строку (27) « ÔérôŸY éXgíœÈNN» éà ± œCμÖ » .

Деос знает, почему это происходит? Как шифрование, так и расшифровка кодирования одинаковы для примера 1 и примера 2, но почему вместо этого он вернет странный код в примере? Любой способ исправить эту проблему?

Я думаю, что это проблема с кодировкой для UTF здесь – http://php.net/manual/en/function.base64-encode.php, в комментариях есть функция безопасного кодирования UTF8.

Передавая параметры влево и вправо, вы меняете кодировку, и вы теряете ее в переводе. Добро пожаловать в PHP 🙂

Вы должны использовать тот же IV для расшифровки. Просто сохраните его вместе с зашифрованными данными, например:

 if($type == "encrypt") { $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB), MCRYPT_RAND); return base64_encode($iv . '@@' . mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv)); } else { list($iv, $data) = explode('@@', base64_decode($text)); return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CFB, $iv); } 

У меня была аналогичная проблема. В базе данных я изначально настроил ее на 16 символов. Когда я перешел на шифрование, я забыл изменить этот номер, чтобы все зашифрованное значение не было сохранено. Как только я исправил это, он вернул нормальные символы 🙂