2011-08-26 5 views
2

Я использую функцию 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, что вызывает это? Не нравится ли это некоторым наборам символов? Или это может случиться из-за низкого состояния памяти/какого-либо другого сервера?

Любая помощь, связанная с этим, была бы высоко оценена. Благодаря!

+0

Как долго заканчиваются незашифрованные тексты? Являются ли они последовательно меньше, чем блок или больше, чем блок? Являются ли они краткими блоками? В вашем коде не указано заполнение. – rossum

+0

Plaintexts - это примерно 1500 символов +/- 300. Отступ, о котором я не очень уверен - это не сделано, прежде чем он будет передан этой функции, поэтому я думаю, что ничего не выполняется. Я унаследовал код и не был криптовариант каким-либо образом, я бы не знал, что изменить. –

+0

Почему он все это делает '$ text'? Похоже, он пытается его проложить, но это необязательно. Что произойдет, если вы просто удалите первые 6 строк функции (например: от '$ text_num = str ...' до конца цикла for) – NullUserException

ответ

0

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