Использование собственных криптоалгоритмов
Незнание или нежелание использовать известные алгоритмы - такая ситуация, как ни парадоксально, также имеет место, особенно в программах типа Freeware и Shareware, например, архиваторах. Например, архиватор ARJ (до версии 2.60 включительно) использует (по умолчанию) очень слабый алгоритм шифрования - простое гаммирование. Казалось бы, что в данном случае использование его допустимо, т.к. архивированный текст должен быть совершенно неизбыточен, и статистические методы криптоанализа здесь не подходят. Однако после более детального изучения оказалось, что в архивированном тексте присутствует (и это оказывается справедливым для любых архиваторов) некоторая неслучайная информация - например, таблица Хаффмана и некоторая другая служебная информация. Поэтому, точно зная или предсказав с некоторой вероятностью значение этих служебных переменных, можно с той же вероятностью определить и соответствующие символы пароля. Далее, использование слабых алгоритмов часто приводит к успеху атаки по открытому тексту. В случае архиватора ARJ, если злоумышленнику известен хотя бы один файл из зашифрованного архива, он с легкостью определит пароль архива и извлечет оттуда все остальные файлы (криптостойкость ARJ при наличии открытого текста - 20 !). Даже если ни одного файла в незашифрованном виде нет, то все равно простое гаммирование позволяет достичь скорости перебора в 350000 паролей/сек. на машине класса Pentium. Аналогичная ситуация имеет место и в случае с популярными программами из Microsoft Office - для определения пароля там необходимо знать всего 16 байт файла .doc или .xls, после чего достаточно перебрать всего 24 вариантов. В Microsoft Office 97 сделаны значительные улучшения алгоритмов шифрования, в результате чего осталась возможность только полного перебора, но не везде - MS Access 97 использует примитивнейший алгоритм, причем шифруются не данные, а сам пароль операцией XOR с фиксированной константой. В сетевой ОСNovell Netwareфирмы Novell (версии 3.х и 4.х) также применяется собственный алгоритм хэширования. На входе хэш-функция получает 32-байтовое значение, полученное из оригинального пароля пользователя путем либо сжатия пароля длиной более 32 символов с помощью операции XOR, либо размножением пароля длиной менее 32 символов; а на выходе - 16-байтовое хэш-значение (Hash16). Именно оно (для Novell Netware 3.х) хранится в базе данных связок (bindery) в виде свойства "PASSWORD". Одним из основных свойств криптостойкой хэш-функции должно быть то, что она не должна допускать легкого построения коллизий (таковой, например, является функция crypt(), используемая в UNIX, которая основана на DES). Именно это свойство нарушено в хэш-функции, применяемой в Novell Netware. Была построена процедура, которая из данного хэш-значения путем небольшого перебора получает 32-байтовую последовательность, которая, конечно, не является истинным паролем, но тем не менее воспринимается Novell Netware как таковой, т.к. применение к ней хэш-алгоритма, выдает в точности имеющееся хэш-значение. Рассмотренный хэш-алгоритм остался и в 4 версии Novell Netware. В свою очередь, фирма Microsoft также имеет серьезнейшие недостатки в своем основном хэш-алгоритме, применяемом во всех своих ОС, начиная с Windows 3.11, при аутентификации в локальных (протокол NetBIOS) и глобальных (протоколы CIFS и http) сетях, называемым LM (Lan Manager)-хэш. (Впрочем, Microsoft ссылается на то, что он остался еще со времен OS/2 и что его разрабатывала IBM). Он вычисляется следующим образом: 1. Пароль превращается в 14-символьную строку путем либо отсечки болеет длинных паролей, либо дополнения коротких паролей нулевыми элементами. 2. Все символы нижнего регистра заменяются на символы верхнего регистра. Цифры и специальные символы остаются без изменений. 3. 14-байтовая строка разбивается на две семибайтовых половины. 4. Используя каждую половину строки в роли ключа DES, с ним шифруется фиксированная константа, получая на выходе две 8-байтовые строки. 5. Эти строки сливаются для создания 16-разрядного значения хэш-функции. Очевидно, что атаки на LM-хэш легко достигают успеха по следующим причинам: · Преобразование всех символов в верхний регистр ограничивает и без того небольшое число возможных комбинаций для каждого (26+10+32=68). · Две семибайтовых "половины" пароля хэшируются независимо друг от друга. Таким образом, две половины могут подбираться перебором независимо друг от друга, и пароли, длина которых превышает семь символов, не сильнее, чем пароли с длиной семь символов. Таким образом, для гарантированного нахождения пароля необходимо перебрать вместо 940+941+... 9414 ~4^1027 всего лишь 2^(680+681+...+687) ~1^1013 (т.е. почти в 1014 раз меньше) комбинаций. Кроме того, те пароли, длина которых не превышает семь символов, очень просто распознать, поскольку вторая половина хэша будет одним и тем же значением AAD3B435B51404EE, получаемой при шифровании фиксированной константы с помощью ключа из семи нулей. Нет элемента случайности (salt), как это сделано в crypt() - два пользователя с одинаковыми паролями всегда будут иметь одинаковые значения хэш-функции. Таким образом, можно заранее составить словарь хэшированных паролей и осуществлять поиск неизвестного пароля в нем.
|