У меня есть класс, который принимает строку в следующем формате:Проблема шифрования/кодирования URL переменной
000067000000000012620060324b38e2cab3353
, шифрует строку затем присоединяет его в качестве переменной получить в URL.
Класс, который делает шифрование имеет функцию, которая выглядит следующим образом:
private function _code_encryption($enc_type,$a_string){
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
if($enc_type == self::ENCRYPT_STRING){
//encrypt then return base64 encoded
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, self::AUTH_ENCRYPTION_KEY, $a_string, MCRYPT_MODE_CBC, $iv);
return base64_encode($encrypted);
}elseif($enc_type == self::DECRYPT_STRING){
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, self::AUTH_ENCRYPTION_KEY, base64_decode($a_string), MCRYPT_MODE_CBC, $iv);
return trim($decrypted);
}
}
Когда строка шифруется я UrlEncode значение и добавить его в URL, как URL-адрес выглядит как "https://secure.mysite.com/index.php?action=someaction&transfer_code=XXXXX где ХХХХ зашифрованная строка urlencoded.
Теперь, когда URL проанализирован и обработан, значение $ _GET ['transfer_code'] передается в вышеуказанную функцию _code_encryption, но не возвращает правильно дешифрованное значение и вместо этого возвращает искаженные символы my браузер не отображает. Есть ли потребность в длине e ключ, который я использую для шифрования/дешифрования? Я пытался что-то вроде
$key = hash('sha256',self::AUTH_ENCRYPTION_KEY,true);
, но это не сработало ...
Кроме того, я не раскодирование переменного $ _GET [ «transfer_code»], потому что состояние PHP человека страниц, которые получают вары являются уже urlencoded ...
Должен ли я быть кодировкой UTF-8 буквенно-цифровой строки ПЕРЕД шифрованием/base64_encoding или это даже имеет значение?
Вы intentially пропуске 1-й символ в IV (подстрока (декодируется $, 1, $ iv_size))? Я думал, что все работает правильно (извлечение IV из char 0, а не 1), но я получаю смешанные результаты. Например, шифрование/кодирование этой строки «67: 1262031751: 4b38e2cab2353» отлично работает, но этот «24: 1262031777: 4b38e2cab2353» никогда не работает вообще и возвращает строку символов 64 символов фиктивных символов. – eCaroth
Нет, id не пропустил 1-й шар намеренно. Я просто не помню, если он основан на 0 или 1. –
Если некоторые строки работают некорректно, убедитесь, что кодировка/декодирование base64 верна. base64 выдает выходной сигнал с помощью '=', и если urlencode/decode разбивает '=', то кодировка/декодирование base64 повреждается, и результат шифрования повреждается. вы будете брать это по одному и проверять на каждом шаге, что работает обратная операция (расшифровать вывод после шифрования и проверки, декодировать после кодирования и проверить и т. д.). –