Ня оболочки шифрования


С учетом ответов на мои вопросы здесь и здесь я создал (ну может-быть) улучшенная версия моей оболочки. Ключевой вопрос заключался в том, что если злоумышленник, зная, что кодируется - тогда он может найти ключ и закодировать другого сообщения. Поэтому я добавил исключающее или перед шифрованием. Я также в этой версии добавлять IV в данные, как было предложено.

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

function aes192ctr_en($data,$key) {
    $iv = mcrypt_create_iv(24,MCRYPT_DEV_URANDOM);
    $xor = mcrypt_create_iv(24,MCRYPT_DEV_URANDOM);
    $key = hash_hmac('sha256',$key,$iv,true);
    $data = $xor.((string)$data ^ (string)str_repeat($xor,(strlen($data)/24)+1));
    $data = hash('md5',$data,true).$data;
    return $iv.mcrypt_encrypt('rijndael-192',$key,$data,'ctr',$iv);
}

function aes192ctr_de($data,$key) {
    $iv = substr($data,0,24);
    $data = substr($data,24);
    $key = hash_hmac('sha256',$key,$iv,true);
    $data = mcrypt_decrypt('rijndael-192',$key,$data,'ctr',$iv);
    $md5 = substr($data,0,16);
    $data = substr($data,16);
    if (hash('md5',$data,true)!==$md5) return false;
    $xor = substr($data,0,24);
    $data = substr($data,24);
    $data = ((string)$data ^ (string)str_repeat($xor,(strlen($data)/24)+1));
    return $data;
}

$encrypted = aes192ctr_en('secret text','password');
echo $encrypted;
echo aes192ctr_de($encrypted,'password');

Другой вопрос: режим CTR-это хорошо в данном контексте, было бы лучше, если бы я вместо того, чтобы использовать режим CBC?

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

Может быть, вместо операции XOR, будет ли он безопаснее в использовании случайных исходных данных с другим запустить АЭС или других проще алгоритм, как чай или тривиум?



771
5
задан 4 января 2011 в 02:01 Источник Поделиться
Комментарии
1 ответ

Ваш исключающее ИЛИ шагом-это нонсенс, это не добавляет безопасности.

Причина в том, как CTR режима работы: шифрование счетчика (отсюда и название) с помощью ключа (и IV как отправная точка) и исключающее или открытый текст с результатом.
Сделать XOR открытого текста с некоторыми другими постоянными до шифрования может быть отменено с помощью операции он с тем же значением после шифрования.

Все-таки, режиме CTR (С или без этого XOR) должно быть достаточно для защиты, пока капельницу не повторять. Чтобы разбить его с известным открытым текстом, придется перебрать шифрования борьбе с разными ключами, пока вы не получите тот же вывод, что открытый текст шифротекст исключающее или (на один блок).

Также, вы используете простой MD5 хеш для защита целостности. В то время как в MD5 может быть штраф в таком случае, он теперь имеет репутацию сломан (т. е. есть довольно простое столкновение атаки), что делает его не безопасным. Используете Mac алгоритм защиты целостности, например с hash_hmac (и сильная хэш-функция, как SHA256, который вы использовали раньше).

Кроме этого, в PHP rijndael-192 - это не один из AES алгоритмов. Алгоритм AES Rijndael с размером блока 128 бит (и размером ключа 128, 192 или 256 бит), и вы используете здесь 192-битный размер блока версия. (Это не означает, что это менее безопасно, вы просто не должны называть это ня. Он получил меньше криптоанализа, чем вариант, что есть стандартизированный как AES, хотя.)

7
ответ дан 7 ноября 2011 в 10:11 Источник Поделиться