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

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

ОГЛАВЛЕНИЕ

Следующая >>



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


7.1. Слабости в алгоритмах
Криптографические алгоритмы сами по себе проходят многократную экс-
пертную проверку, прежде чем начинают массово применяться на практике.
Бывают, конечно, редкие исключения, но они скорее только подтверждают
правило.
Одна из криптографических хэш-функций, разработанных Роном Ривестом
(Ronald Rivest), называется MD4. Аббревиатура MD расшифровывается как
Message Digest (дайджест сообщения). В течение примерно 2-х лет после
опубликования спецификации MD4 было представлено как минимум
3 серьезных независимых работы, посвященных криптоанализу хэш-
функции MD4. В одной из этих работ описывался взлом последних двух из
трех раундов алгоритма обработки данных, а в остальных работах — взлом
первых двух раундов. И хотя алгоритм в целом устойчив ко всем этим мето-
дам взлома, MD4 не рекомендуется использовать в реальных приложениях.
Не лишен недостатков и потоковый алгоритм шифрования, используемый
в архивах формата ZIP. Этот алгоритм был разработан Роджером Шлафлай
(Roger Schlafly). Внутреннее состояние шифра определяется тремя 32-битовыми
регистрами, инициализируемыми следующими значениями:
keyO = 0x12345678;

keyl = 0x23456789;

key2 = 0x34567890;
76 Часть II. Несколько слов о криптологии

Алгоритм изменения внутреннего состояния может быть представлен сле-
дующей функцией на языке С:
unsigned char PKZIP_stream_byte (unsigned char pt) {
unsigned short temp;


keyO = crc32 (keyO, pt) ;
keyl = (keyl + (keyO & OxFF)) * 0x08088405 + 1;
key2 = crc32 (key2, keyl » 24);
temp = (key2 & OxPFFC) | 2;
Л
return ((temp * (temp D ) » 8) & OxFF;
}
Здесь pt (от "plaintext") содержит следующий байт открытого текста, воз-
вращаемое функцией значение представляет собой следующий байт шифр-
текста, а сгсзг — макрос или функция, принимающая предыдущее значение
CRC32 и очередной байт и вычисляющая следующее значение многочлена
CRC32, образованного "магическим числом" 0xEDB88320.
Загрузка ключа шифрования (установка состояния внутренних регистров)
происходит путем передачи функции PKZip_stream_byte последовательно
всех байтов пароля. Возвращаемые значения при этом игнорируются.
8 1994 году Эли Бихэм (Eli Biham) и Пол Кошер (Paul Kocher) опубликова-
ли статью, посвященную атаке на алгоритм шифрования ZIP. Для нахожде-
ния ключа шифрования (состояния внутренних регистров после загрузки
пароля) достаточно знать 13 последовательных байт открытого текста и
примерно 2 38 раз выполнить действия, предсташтенные в функции PKZIP_
streamjoyte. Если же объем доступного открытого текста превышает
13 байт, трудоемкость атаки значительно снижается. Так, например, нали-
чие 40 байт открытого текста позволяет найти ключ шифрования всего за
2 34 операций, 110 байт — за 2 3 2 операций, а 1000 байт — за 229.
Несмотря на то, что недостатки этого алгоритма были опубликованы почти
9 лет назад, он до сих пор остается самым часто используемым в архивах
формата ZIP. Некоторое время назад в архиваторах PKZIP и WinZip появи-
лась поддержка других, более стойких алгоритмов шифрования, но пока но-
вое шифрование не слишком популярно по нескольким причинам. Во-
первых, новые форматы зашифрованных данных в PKZIP и WinZip не со-
вместимы между собой — то, что создано одним архиватором, не может
быть прочитано другим (и похоже вообще никаким другим архиватором,
в то время как старый формат шифрования поддерживали практически все
программы, умеющие работать с архивами ZIP). А во-вторых, компания
Глава 7. Насколько надежны алгоритмы и протоколы 77

PKWARE, создавшая PKZIP, обвиняет авторов WinZip в том, что, реализо-
вав свое шифрование, они нарушают патенты, принадлежащие PKWARE.




7.2. Ошибки
в кодировании алгоритмов
Многие криптографические алгоритмы весьма сложны, и при их реализации
легко допустить ошибку. Хотя можно допустить ошибку и при реализации
сравнительно простых алгоритмов.
В феврале 2001 года в почтовой рассылке cryptography-digest происходило
обсуждение ошибки при реализации алгоритма шифрования Alleged RC4
на языке ADA.


История алгоритма шифрования RC4
Потоковый шифр RC4 был разработан Роном Ривестом в 1987 году. Этот шифр
позволяет использовать ключи размером от 8 до 2048 бит (с шагом 8). В RC4
для зашифрования и расшифрования применяются одни и те же действия: ге-
нерируется гамма, которая накладывается на шифруемое сообщение путем
сложения по модулю 2 (операция XOR).

RC4 применяется в таких продуктах, как Microsoft Office, Lotus Notes, Adobe
Acrobat и др.

Алгоритм RC4 является собственностью компании RSA Data Security, Inc. Его
описание никогда не было опубликовано и предоставлялось партнерам только
после подписания соглашения о неразглашении. Однако в сентябре 1994 года
в списке рассылки Cipherpunks (Шифропанки) кто-то анонимно опубликовал ал-
горитм шифрования, который на всех известных тестовых значениях совпадал
с RC4. С тех пор сам алгоритм перестал быть секретом, но название RC4 оста-
ется торговой маркой. То есть, чтобы получить право заявлять, что в коммер-
ческом программном продукте используется RC4, необходимо приобрести ли-
цензию на этот алгоритм у RSA Data Security. А без лицензии можно
утверждать лишь то, что "используется алгоритм, похожий на RC4 и совпадаю-
щий с ним на всем известном множестве тестов". Именно поэтому на языке
ADA был реализован Alleged (предполагаемый) RC4.


Одно из достоинств RC4 (кроме обещаний компании RSA Data Security, Inc.,
что алгоритм устойчив к дифференциальному и линейному методам криптоана-
лиза и, вероятно, не содержит коротких циклов) — его простота (листинг 7.1).
78 Часть II. Несколько слов о криптологии

:
! Листинг 7.1. Исходный текст алгоритма RC4 на языке г:



typedef unsigned char RC4_CELL;
typedef struct { // структура для хранения текущего состояния ключа
RC4_CELL state[256]; // таблица перестановок
RC4_CELL х, у;
} RC4_KEY;


void swap_byte (RC4_CELL *a, RC4_CELL *b) { // обмен значений двух ячеек
RC4_CELL t = *а; *a = *b; *b = t;
}


void RC4_setKey ( // загрузка ключа (инициализация таблицы перестановок)
RC4_KEY *key, // хранилище ключа
int len, // длина ключа
RC4_CELL *data // данные ключа



RC4_CELL t, *s = key->State;
int i, id;


for (i = 0; i < 256; i++) s[i] = i;
key->x = key->y = 0;


for (id = i = 0; i < 256; i++) {
id = (datati % len] + s[i] + id) & Oxff;
swap_byte (&s[i], &s[id]);




void RC4 ( // процедура шифрования
RC4_KEY *key, // хранилище ключа
int len, // длина шифруемых данных
RC4_CELL *data // шифруемые данные
Глава 7. Насколько надежны алгоритмы и протоколы 79

{
RC4_CELL *s = key->state, x = кеу->х, у = кеу->у;


for (; len > 0; len--, data++) {
x = {x + 1) Sc Oxff;
у = (s[x] + y) & Oxff;
swap_byte (&s[x], &s ty));
л
*data = s[(s[x] + s[y]) & Oxff];
}
key->x = x; key->y = y;
}



Как видно, и в процедуре загрузки ключа, и в процедуре шифрования при
вызове функции swap_byte() происходит обмен местами двух элементов
таблицы перестановок.
Существует алгоритм обмена содержимого двух ячеек без использования
вспомогательных переменных. Для того чтобы поменять местами д и в ,
необходимо выполнить три операции:
А = А хог В; В = В xor A; А = А хог В;
Именно этот прием и был использован в реализации RC4 на языке ADA.
Однако автор кода не учел одну простую вещь: алгоритм обмена содержи-
мого двух ячеек памяти без использования вспомогательных переменных
работает только для разных переменных. Если значения, хранящиеся в А и
в, совпадают, алгоритм работает правильно. Но если А и в — одна и та же
переменная, ее значение будет обнулено при попытке обмена.
В RC4 индекс одного из перестаатяемых элементов таблицы последовательно
(циклически) возрастает, а индекс другого элемента вычисляется по текущему
состоянию ключа. И, разумеется, возникают ситуации, когда значения индек-
сов совпадают. При этом в корректной реализации таблица перестановок
просто остается без изменений, а при использовании обмена без вспомога-
тельных переменных один из элементов таблицы будет обнулен.
Очень интересно посмотреть, как такая ошибка скажется на работе алго-
ритма шифрования в целом.
Во-первых, этот алгоритм может показаться полностью работоспособным,
т. к. и зашифрование, и расшифрование будут идти совершенно одинаково.
А значит, данные, зашифрованные этим алгоритмом, могут быть им же ус-
пешно расшифрованы.
80 Часть II. Несколько слов о криптологии

Во-вторых, на коротких сообщениях алгоритм с ошибкой может работать
в точности так же, как и правильно реализованный алгоритм. То есть ошиб-
ка может остаться незамеченной, если тестировать алгоритм шифрования
только на коротких образцах.
И, в-третьих, при шифровании значительного объема данных без смены
ключа все большее число элементов таблицы перестановок будет становить-
ся нулевыми. А так как преобразование шифруемых данных осуществляется
путем наложения выбранного элемента таблицы перестановок при помощи
операции XOR:
Л
* d a t a = s [ ( s [ x ] + s [ у ] ) & Oxff];
то шифртекст во многих местах будет совпадать с открытым текстом.
То есть изрядная часть данных окажется вообще незашифрованной.



7.3. Многократное использование ключа
потокового шифра
Использование правильно реализованного алгоритма шифрования еще не
гарантирует, что данные будут действительно хорошо защищены. Так, весь-
ма распространенная ошибка при использовании потоковых шифров —
шифрование нескольких потоков на одном ключе.
Как было показано ранее, потоковые шифры вроде RC4 являются генерато-
рами гаммы, которая накладывается на шифруемые данные путем сложения
по модулю 2. Имея только зашифрованные данные, получить открытый
текст без знания ключа практически невозможно. Однако, зная шифртекст
и соответствующий ему открытый текст, не составляет труда вычислить
фрагмент гаммы, соответствующей ключу. Это нормальная ситуация, т. к.
хороший алгоритм шифрования по фрагменту гаммы не должен позволять
определить ключ или другие фрагменты гаммы. Но если на том же самом
ключе был зашифрован другой поток данных, то, зная шифртекст и фраг-
мент гаммы, элементарно вычислить открытый текст, соответствующий из-
вестному фрагменту гаммы.
Тот факт, что один и тот же ключ потокового алгоритма, работающего в ре-
жиме OFB, нельзя использовать дважды, можно отнести к азам криптогра-
фии, которые должен знать каждый, имеющий дело с информационной
безопасностью. Однако даже разработчики, называющие себя профессиона-
лами в области защиты программ от компьютерного пиратства, грешат
невыполнением прописных истин.

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

Шифрование пользовательских данных в РАСЕ InterLok
Система защиты программного обеспечения от компьютерного пиратства РАСЕ
InterLok разработана компанией РАСЕ Anti-Piracy. На страницах интернет-сайта
компании утверждается, что РАСЕ Anti-Piracy имеет более 14 лет опыта в соз-
дании защит от пиратства (по состоянию на 2003 год).

Программы, защищенные с помощью InterLok, хранятся в зашифрованном виде
и расшифровываются прямо в памяти в момент выполнения. Кроме того, спе-
циальный драйвер, устанавливаемый вместе с программой, не позволяет ис-
пользовать отладчики во время выполнения программы. Также программисту
доступны вызовы InterLok API, позволяющие, среди прочего, сохранять на дис-
ке секретные данные в зашифрованном виде, а потом их восстанавливать. Од-
нако то, как используется шифрование, оставляет широкие возможности для
атак.

Программа Adobe eBook Reader V2.2.203 защищена InterLok и использует Inter-
Lok API для того, чтобы сохранить секретную информацию, необходимую для

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

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

ОГЛАВЛЕНИЕ

Следующая >>