Хэш-функции.
Хэш-функция должна отображать входные данные произвольного
размера в выходной набор бит фиксированного размера. Отображение
должно быть равновероятным и случайным. Если на выходе
хэш-функции, реализующей равновероятное отображение, получается,
например, 128-битовое значение и хэш-функция была вычислена от
212 8 разных сообщений, это не значит, что каждое из возможных
выходных значений получилось ровно один раз. Учитывая тот факт,
что отображение случайно и равновероятно значение хэш-функции от
следующего сообщения с вероятностью будет совсем падать с одним
из уже полученных значений. И с каждым новым хэша вероятность
возникновения коллизии будет только возрастать.
Если
результат вычисления хэш-функции без каких-либо изменений и
дополнений снова подается на вход той же хэш-функции и так
повторяется многократно (например для снижения скорости атаки
подбором), мы можем получить вырождение хэша. Вырождение
возникает, когда любые входные сообщения отображаются в очень
малое множество выходных значений (значительно меньшее, чем
2128) и вероятность подбора двух сообщений с одинаковым
значением хэша становится сравнительно большой. Для того чтобы
хэш не вырождался при циклическом вычислении, необходимо на
каждом раунде подавать на вход хэш-функции некоторые новые
данные, например номер раунда.
Генераторы случайных чисел.
Привычные
генераторы псевдослучайных чисел, реализованные в стандартных
библиотеках популярных языков программирования, не пригодны для
криптографии. Для того чтобы использовать криптографические
генераторы псевдослучайных чисел, их необходимо
проинициализировать истинно случайными данными, полученными из
физических источников. Популярным способом сбора случайных
данных является измерение задержек между нажатиями клавиш на
клавиатуре или анализ перемещения указателя мыши, выполняемого
пользователем.
Однако оба этих способа имеют два серьезных недостатка. Первый
недостаток заключается в том, что невозможно точно сказать,
сколько бит действительно случайных данных может быть получено
из одной пары нажатий или одного движения мышью. У людей с
профессиональными навыками машинописи, как правило, очень
высокая ритмичность нажатия клавиш. А случайные данные должны
получаться независимо от того, кто сидит за клавиатурой. Да и
щелчки при нажатии кнопок могут быть легко записаны
злоумышленником на магнитофон, а потом воспроизведены для
повторения задержек. С мышью тоже не все понятно — данные,
которые получает программа, проходят много инстанций. Мышь
передает информацию о перемещении с определенной периодичностью,
а не в тот момент, когда датчик перемещения получает информацию
о том, что мышь была сдвинута. А драйвер мыши извещает программу
о состоянии мыши со своей дискретностью. Все это приводит к
тому, что программа получает далеко не полную информацию о том,
что произошло с мышью, и основная часть случайных данных, на
которые рассчитывала программа, может при определенной
комбинации мыши, драйвера и компьютера оказаться совсем не
случайной. (продолжение)
|