Что может заставить PHP mcrypt искажать данные? - PullRequest
2 голосов
/ 27 августа 2011

Я использую функцию mcrypt для шифрования блока текста с использованием TripleDES.90% времени это работает как надо, и я могу прекрасно расшифровать.Остальные 10%, хотя я просто не могу его расшифровать - как будто у меня неправильный ключ или данные искажены.

Функция выглядит следующим образом:

function enc($text, $key, $iv) {
  $text_num = str_split($text, 8);
  $text_num = 8 - strlen($text_num[count($text_num)-1]);

  for ($i=0; $i < $text_num; $i++) {
    $text = $text . chr($text_num);
  }

  $cipher = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'cbc', '');
  mcrypt_generic_init($cipher, $key, $iv);
  $decrypted = mcrypt_generic($cipher, $text);
  mcrypt_generic_deinit($cipher);
  return base64_encode($decrypted);
}

Они нажимают &IV - правильные длины (24/8 соответственно) и никогда не меняются.Как я уже сказал, он запускает точный один и тот же код на всем, но только 10% терпит неудачу таким образом.

Есть ли что-то, что я мог передать в $text, что вызывает это?Разве это не нравится определенные наборы символов?Или это может произойти из-за нехватки памяти / какого-либо другого состояния сервера?

Любая помощь, фиксирующая это, будет принята с благодарностью.Спасибо!

1 Ответ

0 голосов
/ 28 августа 2011

(скопировано из комментария) 3DES имеет 64-битный размер блока (8 байт).Вам нужно посмотреть на точный размер открытого текста, чтобы проверить его с точки зрения количества блоков.Посмотрите в документации для упоминания заполнения, вероятно, PKCS5 или, возможно, PKCS7.Ваш "10%" сбой на самом деле 12,5% (1 из 8)?Это может указывать на то, что связано с блокировкой.

...