2009-12-28 3 views
1

У меня есть класс, который принимает строку в следующем формате:Проблема шифрования/кодирования 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 или это даже имеет значение?

ответ

3

Вы используете случайный IV для шифрования, а a различный случайный IV для расшифровки. Расшифрованная строка никогда не будет соответствовать оригиналу. Чтобы правильно расшифровать исходную строку, вы должны использовать тот же IV, который использовался во время шифрования. Обычно это достигается за счет добавления IV, используемого для зашифрованной строки. При дешифровке вы должны сначала извлечь IV из значения, инициализировать ключ с этим значением, а затем расшифровать остальные использовать правильно инициализированный ключ.

Я не синтаксический анализатор для проверки этого, но это должно быть что-то вроде:

private function _code_encryption($enc_type,$a_string){ 
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); 
if($enc_type == self::ENCRYPT_STRING){ 
    //encrypt then return base64 encoded 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, self::AUTH_ENCRYPTION_KEY, $a_string, MCRYPT_MODE_CBC, $iv); 
    return base64_encode($iv.$encrypted); 
} elseif ($enc_type == self::DECRYPT_STRING){ 
    $decoded = base64_decode($a_string); 
    $iv = substr($decoded,0,$iv_size); 
    $cipher = substr($decoded,$iv_size); 
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, self::AUTH_ENCRYPTION_KEY, $cipher, MCRYPT_MODE_CBC, $iv); 
    return trim($decrypted); 
} 
} 
+0

Вы intentially пропуске 1-й символ в IV (подстрока (декодируется $, 1, $ iv_size))? Я думал, что все работает правильно (извлечение IV из char 0, а не 1), но я получаю смешанные результаты. Например, шифрование/кодирование этой строки «67: 1262031751: 4b38e2cab2353» отлично работает, но этот «24: 1262031777: 4b38e2cab2353» никогда не работает вообще и возвращает строку символов 64 символов фиктивных символов. – eCaroth

+0

Нет, id не пропустил 1-й шар намеренно. Я просто не помню, если он основан на 0 или 1. –

+0

Если некоторые строки работают некорректно, убедитесь, что кодировка/декодирование base64 верна. base64 выдает выходной сигнал с помощью '=', и если urlencode/decode разбивает '=', то кодировка/декодирование base64 повреждается, и результат шифрования повреждается. вы будете брать это по одному и проверять на каждом шаге, что работает обратная операция (расшифровать вывод после шифрования и проверки, декодировать после кодирования и проверить и т. д.). –

Смежные вопросы