Я использую функцию mcrypt для шифрования блока текста с помощью TripleDES. 90% времени он работает так, как должен, и я могу расшифровать только штраф. Остальные 10%, хотя я просто не могу расшифровать его вообще - как будто у меня есть неправильный ключ, или данные искажены.Что может вызвать PHP mcrypt для блокировки данных?
Функция выглядит следующим образом:
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
, что вызывает это? Не нравится ли это некоторым наборам символов? Или это может случиться из-за низкого состояния памяти/какого-либо другого сервера?
Любая помощь, связанная с этим, была бы высоко оценена. Благодаря!
Как долго заканчиваются незашифрованные тексты? Являются ли они последовательно меньше, чем блок или больше, чем блок? Являются ли они краткими блоками? В вашем коде не указано заполнение. – rossum
Plaintexts - это примерно 1500 символов +/- 300. Отступ, о котором я не очень уверен - это не сделано, прежде чем он будет передан этой функции, поэтому я думаю, что ничего не выполняется. Я унаследовал код и не был криптовариант каким-либо образом, я бы не знал, что изменить. –
Почему он все это делает '$ text'? Похоже, он пытается его проложить, но это необязательно. Что произойдет, если вы просто удалите первые 6 строк функции (например: от '$ text_num = str ...' до конца цикла for) – NullUserException