Функции шифрования mcrypt


Я тут узнал, что это небезопасно для разработки алгоритмов шифрования с нуля. Учитывая, что советы, я сделал пару функций шифрования mcrypt:

function aes128ctr_en($data,$key,$hmac = false) {
    $key = ($hmac===false) ? hash('sha256',$key,true) : hash_hmac('sha256',$key,$hmac,true);
    $data .= hash('md5',$data,true);
    $iv = mcrypt_create_iv(16,MCRYPT_DEV_URANDOM);
    return mcrypt_encrypt('rijndael-128',$key,$data,'ctr',$iv).$iv;
}

function aes128ctr_de($data,$key,$hmac = false) {
    $key = ($hmac===false) ? hash('sha256',$key,true) : hash_hmac('sha256',$key,$hmac,true);
    $iv = substr($data,-16);
    $data = substr($data,0,strlen($data)-16);
    $data = mcrypt_decrypt('rijndael-128',$key,$data,'ctr',$iv);
    $md5 = substr($data,-16);
    $data = substr($data,0,strlen($data)-16);
    return (hash('md5',$data,true)===$md5) ? $data : false;
}

$encrypted = aes128ctr_en('secret text','password');
echo aes128ctr_de($encrypted,'password');
  1. Они безопасны?
  2. Что о IV? Это ОК, чтобы просто добавить его в конец зашифрованную строку?
  3. Это было бы лучше/быстрее сделать все это по модулю, то есть с помощью mcrypt_module_open?


563
19
задан 3 января 2011 в 08:01 Источник Поделиться
Комментарии
3 ответа

Нет это не безопасно.
Для простоты предположим, что ваши данные D ровно один квартал.
Тогда шифротекст содержит 3 16-байтовых блоков следующим образом.


С0 || С1 || С2

= Д гаммирования шифрование AES(ИЖ) || MD5 в(Д) исключающее ИЛИ АЭС(И.+1) || ИЖ

(IV в. обычно в начале сообщения, но это не имеет никакого значения здесь).

Если злоумышленник может угадать D, то злоумышленник может извлечь АЭС(IV) и АЭС(И.+1), а затем
создать другой действительный зашифрованный с помощью вычислительной


Д' исключающее ИЛИ АЭС(раздел IV) || MD5 в(Д') XOR с АЭС(И.+1) || ИЖ

по каким сообщение Д' он любит.

В unkeyed хэш просто не дает целостности, что вы хотели бы. Как обычно, следует использовать код HMAC или что-то подобное вместо алгоритма MD5. Отсюда и самая большая слабость в вашем протоколе нет примитивов, которые вы используете, но то, что вы не используете их должным образом. И просто ответ на другой вопрос, заданный здесь: люди на столько далеки от будучи достаточно компетентным, чтобы найти все ошибки в новый протокол. Так что лучше искать существующего стандарта.

Позвольте мне также добавить, что протоколы похож на тот, здесь были предложены в 80-х годах. Е. Г., Протокол Kerberos был подобный дефект. Лучше аутентификации сообщений, таких как HMAC были предназначены именно для предотвращения такого рода шифротекст манипуляций.

16
ответ дан 3 января 2011 в 10:01 Источник Поделиться

То, что может или не может быть проблемой:


  1. Вы не соление паролей. Если вы храните пароли для более чем одного пользователя и несколько пользователей имеют один и тот же пароль, вы сможете просмотреть базу данных и определить с первого взгляда, что пользователи разделяют один и тот же пароль. В идеале, этого следует избегать.

  2. Вы не используете Ключ-укрепление. Это делает его так, что подобрав пароль будет проще, чем сбрутфорсит сам ключ, что означает, что большинство ваших алгоритма шифрования является де-факто слабее, чем заявлено . Я рекомендую осуществляется для этого; я считаю, что это включено с PHP 5.3+.

Обратите внимание, что ни один из них необходимо обязательно. Вы не определили, почему вы используете шифрование (т. е. то, что вы хотите быть в безопасности от), так что это не возможно, чтобы полностью ответить на ваш вопрос.

4
ответ дан 3 января 2011 в 09:01 Источник Поделиться

Если вы хотите сказать, что не отклоняясь от стандартных процедур шифрования, который, как полагают, быть надежной, то да вы в безопасности.

Если сейф вы имеете в виду, что никто никогда не сможет взломать, то ответ нет. Учитывая достаточно времени и достижения в вычислительной мощности, или криптоанализа в конечном итоге приведет к шифру нарушаются.

Это не требование, чтобы держать ИЖ секрет, и она может быть передана в открытом виде, так что да, вы можете дополнить IV в шифротекст.

3
ответ дан 3 января 2011 в 08:01 Источник Поделиться