<< Предыдущая

стр. 13
(из 39 стр.)

ОГЛАВЛЕНИЕ

Следующая >>

извлечения персонального ключа пользователя. При сохранении блока данных
через InterLok API все функции шифрования выполняет InterLok. Но, судя по
всему, InterLok использует какой-то потоковый шифр, работающий в режиме
OFB. Во всяком случае, определив один раз, какие именно данные сохраняют-
ся, и сложив их по модулю 2 с данными, записанными на диск, можно вычис-
лить гамму. После этого, зная данные, хранящиеся на диске, легко наложить на
них известную гамму и получить секретную информацию. Самое забавное то,
что для получения доступа к секретным данным даже не требуется знать, каким
алгоритмом они зашифрованы.



7.4. Ошибки в генераторах
псевдослучайных чисел
Генераторы псевдослучайных чисел требуются практически в любом прило-
жении, использующем криптографию. И очень часто разработчики не уде-
ляют достаточно внимания характеристикам используемого генератора. Вот
несколько иллюстраций.
Пожалуй, самый известный пример — ошибка в реализации протокола SSL
(Secure Sockets Layer) в браузере Netscape.

Взлом 128-битового шифрования в Netscape
Компания Netscape разработала протокол SSL и реализовала его в своем брау-
зере. Данные, передаваемые посредством SSL, зашифровывались алгоритмом
RC4 со 128-битовым ключом. 17 сентября 1995 года Йен Голдберг (Ian Goldberg)
82 Часть II. Несколько слов о криптологии

сообщил о том, что ему в сотрудничестве с Дэвидом Вагнером (David Wagner)
удалось обнаружить уязвимость в процедуре выбора 128-битового ключа для
алгоритма RC4. Недостаток процедуры заключался в том, что начальное со-
стояние генератора псевдослучайных чисел основывалось на трех значениях:
идентификаторе процесса, генерирующего ключ, идентификаторе его роди-
тельского процесса и текущем времени. Учитывая то, что значительную часть
информации о номерах процессов и времени можно было предугадать, про-
странство возможных ключей сократилось с 2 1 2 8 до 2 20 , и на поиск ключа шиф-
рования уходило всего 25 секунд.


Следующий пример снова связан с шифрованием в архивах формата ZIP.
Атака на основе известного открытого текста применима только в том слу-
чае, если фрагмент открытого текста доступен (например, когда несколько
файлов зашифровано с одним паролем и один из файлов есть в расшифро-
ванном виде). Однако выяснилось, что в некоторых случаях удается полу-
чить достаточный для проведения атаки объем открытого текста из вспомо-
гательных структур, создаваемых архиватором.

Генератор псевдослучайных чисел в InfoZIP
Согласно спецификации ZIP, после загрузки ключа необходимо зашифровать
12 байт до того, как начать шифровать данные файла. Последний из этих
12 байт является младшим байтом контрольной суммы файла, которая хранит-
ся в заголовке архива в незашифрованном виде. Это позволяет определять .'
неправильный пароль с вероятностью 255/г5б после расшифровки всего 12 байт. |
Остальные байты обычно выбираются случайным образом. I

Существует открытая реализация библиотеки для работы с архивами формата
ZIP, называемая InfoZIP. В этой библиотеке из 12 дополнительных байт не
один, а два последних байта содержат младшие байты контрольной суммы
файла. Для генерации случайных байт используется алгоритм, идентичный
r a n d ( ) из стандартной библиотеки Microsoft Visual C++. Зная 4 байта выхода
этого алгоритма, можно получить начальное состояние генератора и полностью
предсказать его выход.

Псевдослучайные байты, полученные при помощи этого генератора, использу-
ются в InfoZIP таким образом, что для каждого файла в архиве генерируется
10 байт и один из них хранится в архиве в незашифрованном виде. Это позво-
ляет при наличии в архиве пяти файлов, зашифрованных с одним паролем и
подряд (без повторной инициализации генератора), найти начальное состояние
генератора. А зная выход генератора и значения двух младших байт контроль-
ной суммы для каждого из пяти файлов, можно определить ключ шифрования
всех этих файлов менее чем за час.
Глава 7. Насколько надежны алгоритмы и протоколы 83

Кстати, стоит отметить, что популярный архиватор WinZIP как раз основан на
InfoZIP, а значит, созданные им архивы могут быть расшифрованы таким спо-
собом.


Последний пример связан с генерацией ключей RSA в программе, предна-
значенной для защиты других программ от несанкционированного тиражи-
рования.

Ключи RSA-1024 в ASProtect
ASProtect представляет собой средство защиты программ от несанкциониро-
ванного тиражирования, исследования и внесения изменений. Исполняемый
файл при обработке его ASProtect зашифровывается и автоматически рас-
шифровывается при загрузке в память. Но некоторые фрагменты, по желанию
разработчика, могут оставаться зашифрованными до тех пор, пока не будет
введен правильный регистрационный ключ.

Одна из возможностей, предоставляемых ASProtect, заключается в том, что
разработчик генерирует пару ключей RSA-1024: открытый ключ хранится в про-
грамме, а секретный используется для генерации лицензий. Использование
RSA-1024 обеспечивает невозможность генерации (и подделки) лицензий без
знания секретного ключа.

По неподтвержденной информации, 1 января 2001 года Алексей Солодовников
(автор ASProtect) получил от представителей группы DAMN по электронной
почте генератор ключей к своей собственной программе. Примерно в это же
время в Интернете были выложены генераторы лицензий еще к нескольким
десяткам программ, защищенных ASProtect с использованием RSA-1024.

Взлом оказался возможен из-за того, что для генерации ключа RSA-1024 ис-
пользовалась стандартная функция rand(), а начальное состояние генератора
задавалось как:
Л
(time(NDLL) + GetCurrentThreadld()) GetTickCount())


Похоже, в ASProtect использовалась некоторая криптографическая библиотека,
в которой была функция trueRandByte (), которая просто возвращала
(unsigned char)rand().

В результате оказалось возможным подобрать ключ RSA-1024 ко многим про-
граммам. В настоящее время эта ошибка уже исправлена, и новые ключи не
могут быть найдены подобным способом.
84 Часть II. Несколько слов о криптологии

Далее приводятся алгоритмы (листинг 7.2), по которым функционируют не-
которые широко используемые некриптографические генераторы псевдо-
случайных чисел. Коллекция собрана участниками форума www.reversing.net.

Листинг 7.2. Генераторы псевдослучайных чисел, входящие в стандартные
библиотеки популярных языков программирования

s t a t i c unsigned i n t seed;


// G C E X
C/M
unsigned int emx_rand() {
seed = seed * 69069 + 5;
return (seed » 0x10) & 0x7FFF;



// Watcom C/C++
unsigned int wc_rand() {
seed = seed * 0x41C64E6Du + 0x3039;
return (seed » 0x10) & 0x7FFF;



// Borland C++ for OS/2
unsigned int bc2_rand() {
seed = seed * 0xl5A4E35u + 1;
return (seed » 0x10) & 0x7FFF;
)
unsigned int bc2_lrand() {
seed = seed * 0xl5A4E35u + 1 -
,
return seed & 0x7FFFFFFF;



// Virtual Pascal == Delphi
unsigned int vp_random(unsigned int maxrand) {
seed = seed * 0x08088405u + 1-
,
return ((unsigned long long) seed * (unsigned long long) maxrand) » 0x20;




i
Глава 7. Насколько надежны алгоритмы и протоколы 85

// Microsoft Visual C++
unsigned int rand() {
seed = 0x343FD * seed + 0x269EC3;
return (seed » 0x10) & 0x7FFF;




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



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

Блочный алгоритм в режиме ЕСВ
в файлах SealedMedia
В зашифрованных PDF-файлах SealedMedia (с расширением spdf) легко обна-
ружить несколько одинаковых 8-байтных блоков, повторяющихся с периодом
в 40 байт. Только на основании этой информации можно предположить, что ис-
пользуется блочный алгоритм шифрования с размером блока 8 байт (например
DES), зашифрован PDF-файл, а повторяющиеся блоки относятся к таблице пе-
рекрестных ссылок. Каждая запись этой таблицы занимает 20 байт, и большин-
ство элементов таблицы различаются в пяти-шести байтах.

Подтверждением этого предположения является, например, тот факт, что пе-
риод повторений (40 байт) является наименьшим общим кратным размера бло-
ка шифра (8 байт) и размера записи таблицы (20 байт).

Разумеется, вся эта информация не позволяет быстро расшифровать доку-
мент, если используется стойкий алгоритм шифрования. Но если в будущем
в алгоритме будут обнаружены серьезные недостатки, предположения о струк-
туре зашифрованных данных могут дать некоторый объем открытого текста для
атаки. А если бы при шифровании использовался другой режим, получить от-
крытый текст было бы не так просто.
86^ Часть II. Несколько слов о криптологии


7.6. Использование обратимых
хэш-функций
Для проверки целостности данных часто применяют цифровую подпись,
например на основе алгоритма RSA. Подпись реализуется путем зашифро-
вания значения хэш-функции от защищаемых данных на секретном ключе
RSA. Для проверки целостности необходимо снова вычислить значение
хэш-функции от тех же данных, а потом сравнить его со значением, рас-
шифрованным открытым ключом RSA. Если при подписи используется
плохая хэш-функция, то возможно подделать подписанные данные, не
взламывая RSA.

Подпись файла данных в Hardwood Solitaire II
Программа Hardwood Solitaire II, разработанная компанией Silver Creek Enter-
tainment, сочетает в себе несколько десятков карточных пасьянсов в велико-
лепном графическом исполнении.

Для защиты основного файла данных от внесения изменений используется
цифровая подпись на основе RSA по описанной выше схеме. Однако для вы-
числения хэша по непонятным причинам была выбрана функция Adler32,
предназначенная для вычисления 32-битовой контрольной суммы.

Но при использовании Adler32 добавлением максимум 260 байт к любым дан-
ным можно добиться того, чтобы результат вычисления контрольной суммы
оказался равен любому заданному значению. Таким образом, можно в файл
данных внести любые изменения, а затем дополнить этот файл таким образом,
чтобы вычисление Adler32 от него выдавало тот же результат, что и от ориги-
;

нального файла. При этом цифровая подпись не будет разрушена.



7.7. Точное следование
протоколам
При реализации криптографических протоколов некоторые моменты могут
показаться программисту излишними, и он с легкой душой избавится от
ненужного на его взгляд кода, тем самым еще и увеличивая быстродействие
программы.
Например, при реализации шифрования по RSA кажется достаточным про-
сто реализовать операцию модульного возведения в степень. Однако специ-
фикация PKCS#1 (Public-Key Cryptography Standards) требует добавления
к каждой порции шифруемых данных как минимум 8-ми случайных байт.
Глава 7. Насколько надежны алгоритмы и протоколы 87

Дело в том, что при использовании алгоритмов с открытым ключом в рас-
поряжении злоумышленника оказывается возможность расшифровывать все
сообщения, зашифрованные на секретном ключе (что не дает ему значи-
тельного преимущества), а также самостоятельно зашифровывать любые со-
общения на открытом ключе.
Допустим, злоумышленнику удалось перехватить зашифрованное на открытом
ключе сообщение, в котором содержится только одно 32-битовое значение.
Расшифровать это сообщение без знания секретного ключа злоумышленник
не в силах, но он может перебирать все 2 32 возможных значений, зашифровы-
вая их на открытом ключе, пока не получит шифртекст, совпадающий с пере-
хваченным. Если же при зашифровании были добавлены случайные байты,
перебор 232 вариантов уже не принесет желаемого результата.
На практике неполная реализация протокола — довольно распространенное
явление. Разработчик может утешать себя тем, что все работает и так и ни-
кто не станет копаться в двоичном коде в поисках уязвимостей. Однако по-
добный подход может иметь тяжкие последствия при защите информации.

<< Предыдущая

стр. 13
(из 39 стр.)

ОГЛАВЛЕНИЕ

Следующая >>