WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 || 3 | 4 |   ...   | 5 |

«ДМИТРИЙ И ВЗЛОМА ИНФОРМАЦИИ САНКТ-ПЕТЕРБУРГ 2004 Содержание Посвящается 1 Введение 3 ЧАСТЬ I. КОМУ НУЖНА ЗАЩИТА? 5 Глава ]. Общие сведения о защите информации 7 1.1. Что и от чего защищать 7 1.1.1. ...»

-- [ Страница 2 ] --

6.2. Литература по криптологии Первые работы, связанные с криптографией и криптоанализом, появились очень давно. Так, например, известно, что Аристотелю, жившему в 384—322 гг.

до н. э., принадлежит способ взлома шифра, использовавшегося греками в вв. до н. э.

Очень важный труд, имеющий отношение к криптоанализу, был написан в IX веке одним из крупнейших ученых арабского мира, носившим имя Абу Юсуф Якуб ибн-Исхак ибн-Ас-Сабах ибн-Умран ибн-Исмалил Аль Кинди, более известный на западе как В его работе впервые описыва лось применение частотного анализа для взлома шифров простой замены.

До первой мировой войны информация о новейших достижениях в крип тологии периодически появлялась в открытой печати. В 1918 году увидела свет монография Вильяма Фридмана (William F. Friedman) "Индекс совпа дения и его применение в криптографии" ("Index of Coincidence and Its Applications in Cryptography"). Это была одна из самых значительных работ XX века в области криптоанализа.

64 Часть II. Несколько слов о После первой мировой войны открытых новаторских работ по криптогра фии почти не публиковалось. Следующим значительным событием стала уже упомянутая статья Клода Шеннона "Теория связи в секретных систе мах" (см. гл. 5), появившаяся в 1949 году.

В 1967 году вышла книга Дэвида Кана (David "Взломщики кодов" ("The Codebreakers: The Story of Secret которая не была посвящена научной стороне криптографии, но содержала огромный исторический ма териал. В книге описывались имевшие место случаи успешного использова ния криптоанализа, включая факты, которые правительство США все еще считало секретными.

Значительный импульс широкому развитию криптографии дала опублико ванная в 1976 году статья Уитфилда Диффи Diffie) и Мартина Хеллмана (Martin "Новые направления в криптографии" ("New Directions in Cryptography"), положившая начало криптографии с открытым Статья Диффи и Хеллмана подтолкнула к занятиям криптографией большое количество людей, что привело к значительному росту числа опубликован ных разными авторами книг и статей. В настоящее время новые работы по являются чуть ли не ежедневно. Так, например, список литературы, приве денный в русскоязычном издании книги Брюса Шнайера (Bruce "Прикладная криптография" ("Applied Cryptography"), занимает 56 страниц и содержит ссылки на 1653 работы. J Довольно интересно сложилась ситуация с литературой по криптографии в России. С того момента, как криптография оказалось рассекречена, нача-, ли появляться открытые публикации, в разных издательствах вышло не сколько десятков книг, у которых в названии присутствует слово с корнем "крипто". Информационное наполнение всех этих изданий можно разделить на четыре основных категории.

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

Ко второй категории относится высоконаучная литература по криптогра фии. Она может показаться увлекательной людям, у которых не оставляет ощущения недопонимания происходящего фраза "канторовское множество возрастает на мере Лебега нуль" (впрочем, не имеющая отношения к крип тографии). Однако для большинства людей, не имеющих глубокого матема тического образования, понять то, что относится к научной криптографии, почти нереально: все-таки криптография нашего времени — это чистая ма тематика. К счастью, данная категория литературы нужна, в основном, раз Глава 6. Криптография для нематематиков работникам криптографических алгоритмов и криптоаналитикам и почти бесполезна для тех, кто использует алгоритмы и протоколы.

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

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

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

Однако редкая книга акцентирует внимание читателя на том, что нужно де лать обязательно, а чего никогда нельзя допускать.

Из книг по криптографии, изданных на русском языке, в первую очередь стоит порекомендовать уже упомянутую "Прикладную криптографию" Брю са Шнайера. В аннотации к русскому изданию сказано, что это самая чи таемая книга по криптографии в мире. Ее первое издание вышло в США в 1994 году, а второе, исправленное — в 1996 году. Русскоязычная версия, официально появившаяся только в 2002 году, основана на втором издании и не отражает событий, произошедших за последние годы. Однако информа ция, собранная на восьми с лишним сотнях страниц, не становится от этого менее актуальной и полезной. А, по субъективным ощущениям, большинст во изданных в России книг, содержащих описания криптографических ал горитмов, заимствуют их именно из "Прикладной криптографии" (и эта книга — не исключение). Но, к сожалению, иногда заимствование произво дится в весьма значительных объемах и без ссылки на первоисточник.

Несмотря на все бесспорные достоинства, к русскому изданию "Прикладной криптографии" стоит относиться с некоторой осторожностью. Дело в том, что примерно в середине 2001 года в Интернете появилась электронная вер сия "Прикладной криптографии" на русском языке, не содержащая указа ний на авторов перевода. Точность русскоязычной версии, похоже, была не очень высока, а вторая половина девятой и вся десятая глава вообще не бы ли переведены. Скорее всего, бумажное издание 2002 года основывается именно на упомянутой электронной версии. Во всяком случае, по словам научно-технического редактора перевода Павла Семьянова, при редактирова нии было исправлено огромное количество ошибок, опечаток, неточностей, ошибок переводчика, неверных терминов и т. п., и Семьянов не рекоменду ет использовать электронную версию, т. к. она содержит ошибки, в том числе в описании алгоритмов и протоколов.

Часть II. Несколько слов о Но даже после редактирования перевод содержит некоторое количество ошибок, унаследованных от электронной версии. Список найденных опеча ток доступен по адресу:

Существует еще одна книга-справочник по криптографии, имеющая похо жее название — "Handbook of Applied Cryptography". Она была впервые из дана в 1996 году и не переводилась на русский язык. Полная электронная версия книги доступна по адресу:

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

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

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

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

Теперь рассмотрим основные свойства базовых криптографических прими тивов.

6.3.1. Блочные шифры Блочные алгоритмы шифрования применяются, пожалуй, чаще, чем любые другие шифры. Блочный шифр выполняет операции над блоками — пор циями данных фиксированного размера. Обычно размер блока составляет Глава 6. Криптография для нематематиков 6?

64 бита (8 байт) или 128 бит (16 байт), но некоторые алгоритмы используют и другие значения. Блочный шифр всегда преобразует определенный блок открытого текста в один и тот же шифртекст независимо от того, какие данные были зашифрованы до этого.

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

Если алгоритм оперирует 8-байтовыми блоками данных, а в последнем бло ке, например, только 3 байта полезных данных, то все неиспользуемые бай ты, кроме самого последнего, можно заполнить любым значением, а в по следнем байте записать число, равное количеству неиспользуемых байтов.

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

Блочные алгоритмы шифрования могут быть использованы в нескольких режимах, например:

режим простой замены (Electronic CodeBook, В);

• с зацеплением блоков шифртекста (Cipher Block Chaining, с обратной связью по шифртексту (Cipher FeedBack, CFB);

с обратной связью по выходу (Output FeedBack, OFB);

по счетчику (Counter);

с зацеплением блоков открытого текста (Plaintext Block Chaining, с обратной связью по открытому тексту (Plaintext FeedBack, PFB);

с усиленным сцеплением блоков шифртекста (различные модификации режима СВС);

с обратной связью по выходу и нелинейной функцией (Output FeedBack with Nonlinear Function, OFBNLF);

• счетчику с нелинейной функцией (Counter with Nonlinear CNLF).

Этот список далеко не полный и может быть расширен чуть ли не до беско нечности.

68 Часть II. Несколько слов о криптологии Каждый режим имеет свои особенности: он может требовать те или иные дополнительные операции, быть устойчивым или, наоборот, неустойчивым к определенным атакам, лучше или хуже восстанавливаться при сбоях и т. д.

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

6.3.2. Потоковые шифры Потоковый шифр выполняет операции над битами или символами (напри мер 8-, 16- или 32-битовыми). Потоковый шифр преобразует один и тот же символ открытого текста в разные символы шифртекста, например в зави симости от того, сколько и каких символов было обработано ранее.

Во многих потоковых шифрах зашифрование производится следующим об разом. Генератор гаммы, основанный на генераторе псевдослучайных чисел, выдает последовательность битов (гамму). Эта гамма накладывается на от крытый текст с помощью побитовой операции В результате получается шифртекст. Для расшифрования необходимо выполнить в точности ту же процедуру, только наложить гамму, с использованием идентич ного генератора с точно таким же начальным на шифртекст.

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

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

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

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

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

Более детальное описание достоинств и недостатков потоковых шифров также можно найти в специализированной литературе по криптографии.

6.3.3. Алгоритмы с открытым Асимметричные алгоритмы подразумевают использование двух математиче ски связанных ключей. Один ключ называют персональным (секретным), и он должен храниться в тайне, а парный ему ключ называют публичным (от крытым), и доступ к нему должны иметь все участники информационного обмена. Необходимым требованием для стойкого алгоритма является невоз можность эффективного вычисления секретного ключа по открытому ключу.

Стойкие алгоритмы с открытым ключом, как правило, основываются на ма тематических задачах, которые на настоящий момент не имеют эффектив ного решения. Однако далеко не все стойкие алгоритмы применяются на практике. Некоторые из них требуют очень больших ключей. Например, размер открытого ключа криптосистемы HFE (Hidden Fields Equations) мо жет достигать десятков мегабайт, что затрудняет распределение таких ключей.

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

Алгоритмы с открытым ключом используются для решения двух основных задач: шифрования данных и цифровой подписи, причем многие алгоритмы для решения только одной из этих задач. Также некоторые алго позволяют вырабатывать общий сеансовый ключ, который злоумыш енник не сможет получить, даже если он перехватит все сообщения между Общей проблемой алгоритмов с открытым ключом является необходимость распространения этих самых открытых ключей. Используя асимметричную криптографию, можно вести защищенный диалог с абонентом, с которым был совершен обмен открытыми ключами. Но в случае, не проводя подготовительных действий и не имея общего секрета, невозможно с уве ренностью утверждать, что абонент является именно тем, за кого он себя выдает. Для решения этой проблемы используется инфраструктура откры Часть II. Несколько слов о криптологии ключей (Public Key Infrastructure, PKI), которая при помощи иерархии сертификатов позволяет свести доверие абоненту к доверию корневому сер тифицирующему центру.

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

6.3.4. Хэш-функции Хэш-функция должна отображать входные данные произвольного размера в выходной набор бит фиксированного размера. Отображение должно быть равновероятным и случайным.

Похожие требования предъявляются к функциям вычисления контрольных сумм (Cyclical Redundancy Check, CRC), таким как CRC32 или Adler32.

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

Например, достаточно откорректировать всего 4 идущих подряд байта, рас положенных в любом месте изменяемого сообщения, чтобы значение CRC32 для этого сообщения осталось таким же, как до внесения измене ний. Поэтому контрольные суммы (обычно очень простые в реализации) не стоит использовать в криптографии.

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

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

Глава 6. Криптография для нематематиков Для того чтобы хэш не вырождался при циклическом вычислении, необхо димо на каждом раунде подавать на вход хэш-функции некоторые новые данные, например номер раунда.

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

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

Первый недостаток заключается в том, что невозможно точно сказать, сколько бит действительно случайных данных может быть получено из од ной пары нажатий или одного движения мышью. У людей с профессио нальными навыками машинописи, как правило, очень высокая ритмичность нажатия клавиш. А случайные данные должны получаться независимо от того, кто сидит за клавиатурой. Да и щелчки при нажатии кнопок могут быть легко записаны злоумышленником на магнитофон, а потом воспроиз ведены для повторения задержек. С мышью тоже не все понятно — данные, которые получает программа, проходят много инстанций. Мышь передает информацию о перемещении с определенной периодичностью, а не в тот момент, когда датчик перемещения получает информацию о том, что мышь была сдвинута. А драйвер мыши извещает программу о состоянии мыши со своей дискретностью. Все это приводит к тому, что программа получает далеко не полную информацию о том, что произошло с мышью, и основная часть случайных данных, на которые рассчитывала программа, может при определенной комбинации мыши, драйвера и компьютера оказаться совсем не случайной.

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

В качестве претендентов на действительно случайные данные можно рас сматривать значение хэша от содержимого экрана и от всех данных, прочи танных с диска с момента загрузки операционной системы. Однако очевид но, что пока не запущено ни одно интерактивное приложение, состояние экрана можно попытаться предугадать, а сразу после получения порции слу чайных данных повторный запрос может вернуть тот же самый результат.

72 Часть II. Несколько слов о Иногда в распоряжении программиста оказывается аппаратное устройство, являющееся, согласно прилагаемой документации, генератором истинно случайных чисел. Наличие такого источника случайности очень полезно во многих ситуациях, но таит в себе опасность.

Проблема в том, что по выходу генератора нельзя однозначно определить, действительно ли выдаваемая последовательность случайна. Можно создать такой генератор псевдослучайных чисел, выход которого успешно пройдет все известные статистические тесты на случайность. И все же, выход гене ратора на самом деле будет определяться детерминированным алгоритмом.

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

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

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

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

6.4. Разработка собственных криптографических алгоритмов Иногда программист приходит к идее разработать свой собственный крип тографический алгоритм или получает аналогичные инструкции от началь ства. Разумеется, ничего плохого в такой попытке нет, но практика показы вает, что очень редко кто достигает на этом пути положительных результатов.

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

В общем, на настоящий момент существует достаточно много самых разно образных криптографических алгоритмов, почти на любой вкус. Большин ство популярных алгоритмов прошли проверку временем и заслужили по ложительные отзывы криптоаналитиков. И разработка нового алгоритма, наверное, имеет смысл только в одном из двух случаев: если новый алго ритм будет быстрее уже существующих (без потери стойкости) или если он будет более стойким.

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

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

Бывают, конечно, редкие исключения, но они скорее только подтверждают правило.

Одна из криптографических хэш-функций, разработанных Роном Ривестом (Ronald Rivest), называется MD4. Аббревиатура MD расшифровывается как Message Digest (дайджест сообщения). В течение примерно 2-х лет после опубликования спецификации MD4 было представлено как минимум 3 серьезных независимых работы, посвященных криптоанализу хэш функции MD4. В одной из этих работ описывался взлом последних двух из трех раундов алгоритма обработки данных, а в остальных работах — взлом первых двух раундов. И хотя алгоритм в целом устойчив ко всем этим мето дам взлома, MD4 не рекомендуется использовать в реальных приложениях.

Не лишен недостатков и потоковый алгоритм шифрования, используемый в архивах формата ZIP. Этот алгоритм был разработан Роджером Шлафлай (Roger Внутреннее состояние шифра определяется тремя 32-битовыми регистрами, инициализируемыми следующими значениями:

= 0x12345678;

key2 = 76 Часть II. Несколько слов о Алгоритм изменения внутреннего состояния может быть представлен сле дующей функцией на языке С:

unsigned char PKZIP_stream_byte (unsigned char pt) { unsigned short temp;

keyO = crc32 pt) ;

= + (keyO & OxFF)) * 0x08088405 + 1;

key2 = crc32 (key2, keyl » 24);

temp = (key2 | 2;

return ((temp * (temp » 8) & OxFF;

} Здесь pt (от "plaintext") содержит следующий байт открытого текста, воз вращаемое функцией значение представляет собой следующий байт шифр текста, а — макрос или функция, принимающая предыдущее значение CRC32 и очередной байт и вычисляющая следующее значение многочлена CRC32, образованного "магическим числом" 0xEDB88320.

Загрузка ключа шифрования (установка состояния внутренних регистров) происходит путем передачи функции последовательно всех байтов пароля. Возвращаемые значения при этом игнорируются.

1994 году Эли Бихэм (Eli и Пол Кошер (Paul опубликова ли статью, посвященную атаке на алгоритм шифрования ZIP. Для нахожде ния ключа шифрования (состояния внутренних регистров после загрузки пароля) достаточно знать 13 последовательных байт открытого текста и примерно раз выполнить действия, в функции Если же объем доступного открытого текста превышает 13 байт, трудоемкость атаки значительно снижается. Так, например, нали чие 40 байт открытого текста позволяет найти ключ шифрования всего за 234 операций, байт — за 232 операций, а 1000 байт — за 229.

Несмотря на то, что недостатки этого алгоритма были опубликованы почти 9 лет назад, он до сих пор остается самым часто используемым в архивах формата ZIP. Некоторое время назад в архиваторах PKZIP и WinZip появи лась поддержка других, более стойких алгоритмов шифрования, но пока но вое не слишком популярно по нескольким причинам. Во первых, новые форматы зашифрованных данных в PKZIP и WinZip не со вместимы между собой — то, что создано одним архиватором, не может быть прочитано другим (и похоже вообще никаким другим архиватором, в то время как старый формат шифрования поддерживали практически все программы, умеющие работать с архивами во-вторых, компания Глава 7. Насколько надежны алгоритмы и протоколы PKWARE, создавшая PKZIP, обвиняет авторов в том, что, реализо вав свое шифрование, они нарушают патенты, принадлежащие PKWARE.

7.2. Ошибки в кодировании алгоритмов Многие криптографические алгоритмы весьма сложны, и при их реализации допустить ошибку. Хотя можно допустить ошибку и при реализации сравнительно простых алгоритмов.

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

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

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

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

78 Часть II. Несколько слов о г:

unsigned char struct { // структура для хранения текущего состояния ключа // таблица перестановок х, у;

} RC4_KEY;

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

*a = *b;

= t;

} void ( // загрузка ключа (инициализация таблицы перестановок) // ключа int // длина ключа *data // данные ключа t, *s = key->State;

int i, id;

for (i = 0;

i < 256;

i++) s[i] = i;

= = for (id = i = 0;

i < 256;

i++) { id = % len] + s[i] + id) Oxff;

void RC4 ( // процедура шифрования *key, // хранилище ключа int len, // длина шифруемых данных *data // шифруемые данные Глава 7. Насколько надежны алгоритмы и протоколы { RC4_CELL *s = key->state, x = кеу->х, у = for (;

> 0;

{ x = {x + 1) Oxff;

у = (s[x] + y) Oxff;

&s s[(s[x] + & Oxff];

} key->x = x;

key->y = y;

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

Существует алгоритм обмена содержимого двух ячеек без использования вспомогательных переменных. Для того чтобы поменять местами необходимо выполнить три операции:

А = А В;

В = В A;

А = А В;

Именно этот прием и был использован в реализации RC4 на языке ADA.

Однако автор кода не учел одну простую вещь: алгоритм обмена содержи мого двух ячеек памяти без использования вспомогательных переменных работает только для разных переменных. Если значения, хранящиеся в А и в, совпадают, алгоритм работает правильно. Но если А и в — одна и та же переменная, ее значение будет обнулено при попытке обмена.

В RC4 индекс одного из элементов таблицы последовательно (циклически) возрастает, а индекс другого элемента вычисляется по текущему состоянию ключа. И, разумеется, возникают ситуации, когда значения индек сов совпадают. При этом в корректной реализации таблица перестановок просто остается без изменений, а при использовании обмена без вспомога тельных переменных один из элементов таблицы будет обнулен.

Очень интересно посмотреть, как такая ошибка скажется на работе алго ритма шифрования в целом.

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

А значит, данные, зашифрованные этим алгоритмом, могут быть им же ус пешно расшифрованы.

80 Часть II. Несколько слов о Во-вторых, на коротких сообщениях алгоритм с ошибкой может работать в точности так же, как и правильно реализованный алгоритм. То есть ошиб ка может остаться незамеченной, если тестировать алгоритм шифрования только на коротких образцах.

И, в-третьих, при шифровании значительного объема данных без смены ключа все большее число элементов таблицы перестановок будет становить ся нулевыми. А так как преобразование шифруемых данных осуществляется путем наложения выбранного элемента таблицы перестановок при помощи операции XOR:

s[(s[x] + то шифртекст во многих местах будет совпадать с открытым текстом.

То есть изрядная часть данных окажется вообще незашифрованной.

7.3. Многократное использование ключа потокового шифра Использование правильно реализованного алгоритма шифрования еще не гарантирует, что данные будут действительно хорошо защищены. Так, весь ма распространенная ошибка при использовании потоковых шифров — шифрование нескольких потоков на одном ключе.

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

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

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

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

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

Программа Adobe eBook Reader V2.2.203 защищена InterLok и использует Inter Lok API для того, чтобы сохранить секретную информацию, необходимую для извлечения персонального ключа пользователя. При сохранении блока данных через InterLok API все функции шифрования выполняет InterLok. Но, судя по всему, InterLok использует какой-то потоковый шифр, работающий в режиме Во всяком случае, определив один раз, какие именно данные сохраняют ся, и сложив их по модулю 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. Недостаток процедуры заключался в том, что начальное со стояние генератора псевдослучайных чисел основывалось на трех значениях:

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

Следующий пример снова связан с шифрованием в архивах формата ZIP.

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

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

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

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

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

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

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

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

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

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

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

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

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

// unsigned int emx_rand() { seed = seed * + 5;

return (seed » 0x10) & 0x7FFF;

// C/C++ unsigned int { seed = seed * 0x41C64E6Du + 0x3039;

return (seed » 0x10) & 0x7FFF;

// Borland C++ for OS/ unsigned int bc2_rand() { seed = seed * + 1;

return (seed » 0x10) 0x7FFF;

) unsigned int bc2_lrand() { seed = seed * + return seed & 0x7FFFFFFF;

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

i Глава 7. Насколько надежны алгоритмы и протоколы // Microsoft Visual C++ unsigned int rand() { seed = 0x343FD * seed + 0x269EC3;

return (seed » 0x10) & Как видно, все приведенные алгоритмы построены очень похоже, и ни один из них не стоит использовать для решения задач, требующих применения криптографии.

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

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

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

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

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

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

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

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

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

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

Глава 7. Насколько надежны алгоритмы и протоколы Дело в том, что при использовании алгоритмов с открытым ключом в рас поряжении злоумышленника оказывается возможность расшифровывать все сообщения, зашифрованные на секретном ключе (что не дает ему значи тельного преимущества), а также самостоятельно зашифровывать любые со общения на открытом ключе.

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

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

На практике неполная реализация протокола — довольно распространенное явление. Разработчик может утешать себя тем, что все работает и так и ни кто не станет копаться в двоичном коде в поисках уязвимостей. Однако по добный подход может иметь тяжкие последствия при защите информации.

Цифровая подпись в библиотеке представляет собой библиотеку для работы с большими целыми числами и включает в числе прочих поддержку алгоритма цифровой подписи EIGamal.

Но вычисление и проверка этой подписи в FGInt были реализованы с некото рыми отступлениями от спецификации.

Во-первых, при проверке целостности подписи должна выполняться проверка того, что значения двух составляющих подписи и s не превышают значения использованного модуля р. На случай если эта проверка не выполняется, в книге "Handbook of Applied Cryptography" приводится алгоритм атаки, позво ляющий при наличии одного подписанного сообщения вычислить цифровую подпись для любого другого сообщения.

Во-вторых, в подписи должно использоваться не само сообщение, а его хэш.

Причина этого заключается в том, что без использования хэш-функции оказы вается возможным подобрать сообщение, соответствующее заданному значе нию подписи, вычисленному определенным образом. Данная атака также опи сана в книге "Handbook of Applied Cryptography". А если подписывается значение хэша, то для отыскания подходящего сообщения придется обратить еще и хэш, что при использовании стойкой криптографической хэш-функции сделать почти невозможно.

Описанные выше недостатки в FGInt были обнаружены и успешно использова представителями группы CORE, что позволило им выпустить генераторы Часть II. Несколько слов о регистрационных кодов к нескольким версиям программы защи щенной с использованием цифровой подписи EIGamal с ключом длиной 960 бит, реализованной через библиотеку Подытоживая все написанное про алгоритмы и протоколы, можно что хотя криптографическая часть любой защиты, возможно, поддается формализации легче многих других элементов, это не делает ее ванно стойкой. Существует множество способов из надежных составляющих построить слабую систему. И только глубокие знания в криптогра фии, подкрепленные постоянной практикой, помогают снизить вероят ность неудачи.

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

8.1. Конкурсы по выбору стандартов шифрования Хорошим примером того, как стоит подходить к выбору алгоритма шифро вания, может послужить описание процесса выбора алгоритма Advanced Encryption Standard (AES) — нового стандарта шифрования США, пришед шего на смену DES.

8.1.1. Стандарт шифрования США В 1996 году национальный институт стандартов и технологий США (National Institute of Standards and Technology, начал работу над орга низацией конкурса по выбору лучшего алгоритма для нового стандарта.

2 января 1997 года NIST официально объявил о запуске программы по раз работке нового федерального стандарта обработки информации (Federal Information Processing Standard, 12 сентября 1997 года начался прием заявок на участие в конкурсе. К кан дидатам предъявлялись следующие обязательные требования:

алгоритм должен относиться к симметричной криптографии (с секрет ным ключом);

алгоритм должен являться блочным шифром;

О алгоритм должен поддерживать следующие комбинации размеров ключа и блока шифрования: 128—128, 192—128 и 256—128.

90 Часть II. Несколько слов о 15 июня 1998 прием заявок закончился, и к участию в конкурсе оказа лись допущены 15 алгоритмов, разработанных криптографами из 12 стран.

В процессе сравнения конкурсантов оценивались следующие характеристики:

О криптостойкость — объем усилий, необходимых для успешного криптоа нализа. Эта характеристика является наиболее важной для алгоритма шифрования и строится на основе следующих факторов:

• реальная криптостойкость алгоритма по сравнению с конкурентами (при одинаковых размерах блока и ключа шифрования);

• насколько выход алгоритма неотличим от случайной перестановки (пермутации) входного блока;

• серьезность математического обоснования стойкости алгоритма;

• другие факторы, проявившиеся во время открытого публичного изу чения свойств алгоритма;

• стоимость реализации — затраты, с которыми придется столкнуться при использовании алгоритма. Стоимость определяется совокупностью сле дующих критериев:

• лицензионные требования. Предполагается, что AES должен получить не меньшее распространение, чем имел DES, т. е. применяться массо во. Следовательно, предпочтение отдается алгоритмам, которые или не покрываются патентами, или допускают неограниченное бесплат ное использование в любой точке мира;

• вычислительная эффективность (скорость алгоритма). Предполагается, что алгоритм должен быть достаточно быстрым как при программной, так и при аппаратной реализации;

• требования к памяти. Оценивается объем необходимой постоянной ' и оперативной памяти при программной реализации в разных средах, а также число вентилей для аппаратной реализации;

• функциональные характеристики алгоритма, такие как:

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

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

О возможность надежной и эффективной реализации на большом ко личестве разных платформ: на восьмибитовых процессорах, в сетях асинхронной передачи данных (Asynchronous Transfer Mode, ATM), в голосовых и спутниковых коммуникациях, в телевидении высо кой четкости (High Definition Television, HDTV) и т. Д.;

Глава 8. Рекомендации по выбору алгоритмов g О возможность использования алгоритма для построения эффектив ного потокового шифра, генератора кодов, хэш-функции, генератора псевдослучайных чисел и т. д.;

• удобство программной и аппаратной реализации. Алгоритм не должен быть спроектирован с ориентацией только на аппаратную или только на программную реализацию. Если алгоритм может быть реализован как встроенная программа (firmware), это является его достоинством;

• простота. Чрезмерное усложнение алгоритма затрудняет его анализ и реализацию, поэтому предпочтение отдается сравнительно простым алгоритмам.

Вычислительной эффективности и требованиям к памяти имеет смысл уде лить чуть больше внимания.

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

Рассмотрим два алгоритма: RC4 и DES.

Программная реализация алгоритма шифрования RC4 очень проста (см. разд. 7.2). Внутреннее состояние шифра описывается 256-байтовой табли цей перестановок state двумя регистрами х и у. Для шифрования одного бай та необходимо произвести 3 операции чтения и 2 операции записи в таблицу перестановок, а также выполнить 3 операции сложения по модулю 256.

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

С алгоритмом шифрования DES все иначе. Исходный текст DES на языке С за нимает десятки килобайт и весьма сложен для первичного восприятия.

В процессе работы DES оперирует не байтами или словами, а отдельными би тами. Но в процессорах архитектуры к которым относятся Intel Pentium и AMD Athlon, практически нет готовых команд для работы с битами — каждую операцию DES приходится реализовывать посредством нескольких команд процессора. То же самое, наверное, справедливо для большинства современ ных универсальных процессоров. А при аппаратной реализации такие опера ции, как, например, перестановки битов, можно реализовать на схемном уровне, Часть II. Несколько слов о и они будут выполняться за один такт. И аппаратная реализация DES оказыва ется значительно быстрее, чем программная, даже несмотря на тактовые час тоты современных универсальных процессоров, уже давно измеряемые в гигагерцах.

Одна из важных областей применения нового стандарта шифрования — смарт карты. Стоимость карты явным образом зависит от размеров доступной внутри карты оперативной и постоянной памяти. Самые дешевые смарт-карты стоят около 25 центов, но имеют всего 2 Кбайта постоянной памяти для хранения ал горитмов и констант и 64 байта оперативной памяти для хранения промежуточ ных значений и шифруемых данных. Разумеется, гораздо выгоднее иметь в качестве стандарта те криптографические алгоритмы, которые смогут рабо тать в самых дешевых картах при минимальных ресурсах.

Вернемся к конкурсу AES. В 1999 году, после проведения второй конферен ции по выбору кандидата на AES, из 15 осталось только 5. Это были алгоритмы RC6, Rijndael, MARS, Serpent и Безусловного ли дера среди них не оказалось, но были явные кандидаты на выбывание. Так, например, оказался медленней всех конкурентов в программной реализации, a MARS — в аппаратной. Ни для одного из пяти финалистов не было предложено метода криптоанализа, позволяющего взломать алгоритм быстрее, чем полным перебором, но для RC6 был разработан способ взлома 15 из 20 используемых циклов шифрования.

В итоге, 2 октября 2000 года победителем конкурса был объявлен алгоритм шифрования Rijndael, разработанный бельгийцами Винсентом Райменом (Vincent и Йоханом Дайменом (Joan Название алгоритма было образовано из начальных букв их фамилий.

26 ноября 2001 года NIST объявил о том, что в США Rijndael получил статус федерального стандарта обработки информации — нового стандарта шифро вания данных.

8.1.2. Европейские криптографические схемы AES — не единственный открытый конкурс по выбору стандарта шифрова ния. Аналогичный конкурс проводится также еврокомиссией и носит назва ние NESSIE (New European Schemes Signature, Integrity and Encryption, новые европейские схемы для цифровой подписи, контроля целостности и шифрования).

Размах у проекта NESSIE значительно шире, чем был у AES. В рамках NESSIE не просто ведется выбор симметричного блочного алгоритма, Глава 8. Рекомендации по выбору алгоритмов но делается попытка подобрать коллекцию надежных и эффективных крип тографических алгоритмов. Рассматриваются такие криптографические примитивы, как симметричные блочные и потоковые шифры, хэш функции, алгоритмы контроля целостности сообщений, схемы цифровой подписи и шифрования с открытым ключом.

Проект NESSIE был начат в январе 2000 года. Предполагается, что после выработки рекомендаций по алгоритмам в отдельных категориях, NESSIE окажет существенное влияние на применение криптографии в Европе.

Стандарт Параллельно с проектом NESSIE работы по стандартизации криптографиче ских алгоритмов проводит и 27-ой подкомитет первого объединенного тех нического комитета международной электротехнической комиссии при ме ждународной организации по стандартизации (International Organization for Standardization / International Electrotechnical Commission, Joint Technical Committee 1 / Subcommittee 27, ISO/IEC JTC 27). Указанный подкоми тет самостоятельно не проводит сравнительного тестирования криптографи ческих алгоритмов, но принимает решения, основываясь на информации, полученной в рамках таких открытых проектов, как NESSIE.

Выбранные алгоритмы должны стать частью стандарта ISO/IEC 18033. Есть основания полагать, что новый стандарт будет иметь много общего с реко мендациями NESSIE и существующими стандартами, такими как IEEE 8.1.4. Стандарт шифрования Японии Агентство развития информационных технологий Японии (Information technology Promotion Agency, субсидируемое японским министерством международной торговли и индустрии, проводит оценку различных крип тографических технологий в рамках проекта CRYPTREC. Целью проекта является формирование набора криптографических которые будут использоваться в рамках программы электронного правительства Япо нии, инфраструктура которого должна быть сформирована в 2003 году.

CRYPTREC оценивает асимметричные криптографические технологии, пригодные для шифрования, аутентификации, цифровой подписи и распре деления ключей, а также симметричные потоковые и блочные шифры, ге нераторы псевдослучайных чисел и хэш-функции.

94 Часть II. Несколько слов о 8.2. Практические рекомендации известных специалистов Когда для решения конкретной задачи требуется выбрать алгоритм, устраи вать открытый конкурс — не самый быстрый путь. В большинстве случаев достаточно выбрать его из уже существующих алгоритмов.

Авторы книги "Криптография. Официальное руководство RSA Security" ("RSA Security's Official Guide to Cryptography") Стив (Steve Burnett) и Стивен Пэйн (Stephen Paine) для шифрования соединений между компью терами рекомендуют использовать потоковый алгоритм т. к. он обес печивает достаточно высокую скорость. Для таких приложений, как базы данных, электронная почта и защищенное (зашифрованное) хранение фай лов, рекомендуется использовать блочные алгоритмы шифрования, в част ности AES (Rijndael).

Брюс Шнайер (Bruce Schneier) вместе с Нилсом Фергюсоном (Niels Ferguson) в своей книге "Практическая криптография" ("Practical Cryptography") считают, что с точки зрения безопасности карьеры лица, принимающего решение, Rijndael — действительно самый приемлемый блочный алгоритм шифрования. Он принят в качестве стандарта в США, и если в AES в буду щем будут обнаружены серьезные недостатки, наказывать за это, скорее всего, никого не станут. Кроме того, AES уже достаточно широко распро странен и поддерживается большим числом библиотек. Так что AES — поч ти беспроигрышный выбор.

Если очень важно обеспечить максимальную стойкость шифрования, а ско рость играет малозначительную роль, рекомендуется обратить внимание на другого финалиста конкурса AES — алгоритм Serpent, который большинство серьезных криптологов назвали самым надежным (или самым консерватив ным) из всех на конкурс.

В качестве хэш-функции Шнайер и Фергюсон рекомендуют выбирать мо дификацию одного из алгоритмов семейства SHA (Secure Hash Algorithm).

В настоящий момент существуют спецификации алгоритмов SHA-256, SHA-384 и SHA-512, вычисляющих хэш размером 160, 256, 384 и 512 бит соответственно: Модификация заключается в том, что хэш-функция от со общения m вычисляется как SHA-x (SHA-x (/и)), что позволяет исключить атаку расширения длины сообщения (Length Extension), которой подверже ны все хэш-функции семейства SHA и MD (MD2, MD4 и MD5).

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

RSA часто используется и для цифровой подписи, но кроме него существует множество других алгоритмов и схем, из которых наиболее широко распро Глава 8. Рекомендации по выбору алгоритмов странен стандартизованный в США алгоритм DSA (Digital Signature Algorithm). Чуть меньшую популярность имеет реализация DSA на эллипти ческих кривых, носящая название ECDSA (Elliptic Curves DSA).

8.3. Патенты на алгоритмы и протоколы В России не действуют патенты на криптографические алгоритмы и прото колы. Но во многих странах такие патенты допускаются законодательством.

Если разрабатываемая программа будет использоваться не только на терри тории России, при выборе используемых в ней криптографических алгорит мов стоит оценить их применимость с точки зрения патентной чистоты.

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

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

Патент на алгоритм Алгоритм RSA получил свое название по первым буквам фамилий авторов. Ро нальд Ривест (Ronald Rivest), Ади Шамир (Adi Shamir) и Леонард Аделман (Leonard впервые опубликовали описание алгоритма в апреле 1977 года. Алгоритм RSA составляет существенную часть патента США № 4405829, выданного Ривесту, Шамиру и сроком до 20 сентября 2000 года. Но уже через 9 дней после получения патента эксклюзивная лицен зия была предоставлена компании RSA Data Security, Inc., которая и выступала много лет как владелец прав на одноименный криптографический алгоритм.

Все желающие использовать алгоритм RSA в коммерческих приложениях должны были приобрести у RSA Data Security лицензию на криптографическую библиотеку BSAFE. Кроме BSAFE в RSA Data Security была разработана и бес платная библиотека RSAREF, предназначенная для некоммерческого исполь зования. Другим производителям не разрешалось распространять на террито рии США свои библиотеки, поддерживающие алгоритм RSA.

96 Часть II. Несколько слов о криптологии Однако с практической точки зрения к патентам можно относиться очень по-разному. Так, например, Шнайер и Фергюсон рекомендуют в своей книге не читать патенты и аргументируют это следующим образом.

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

Если вы после прочтения патента уверены, что ваши действия не нарушают патент, это еще не значит, что судья, рассматривающий иск о нарушении, придет к такому же заключению. Даже эксперт в некоторой технической области, к которой относится патент, не в состоянии судить, что покрывает ся патентом, а что нет. Это может сделать только патентный юрист, кото рый берет за такую работу вознаграждение. Таким образом, чтобы не пла тить тройную компенсацию, придется платить юристу. Но патентов, которые могут случайно быть нарушены, очень много, и оплачивать услуги юриста для анализа каждого из них кажется не самым разумным решением.

В результате получается, что для минимизации расходов на решение про блем с патентами самое разумное — это не читать патенты вообще, как ни парадоксально это звучит.

Часть КАК НЕ НАДО ЗАЩИЩАТЬ ПРОГРАММЫ Глава 9. Актуальные задачи защиты программ Глава Регистрационные коды для программ Глава Привязка к носителям информации Глава Аппаратные ключи защиты Глава Использование навесных защит Глава 14. Приемы, облегчающие работу противника III. Как не надо защищать программы Эта часть книги посвящена вопросам защиты коммерческого программного обеспечения от нелегального тиражирования. В ней подробно рассматрива ются наиболее популярные и эффективные решения, а также проблемы, связанные с их реализацией.

Глава Актуальные задачи защиты программ Глобальная цель защиты программных продуктов, по большому счету, все гда одна — повысить прибыль, получаемую от продажи программного обес печения. Чаще всего это выражается в ограничении возможностей по рас пространению программы.

Однако в попытках достижения этой цели почти всегда возникает целый ряд подзадач, требующих решения.

9.1. Модели распространения программного обеспечения Существует довольно много различных моделей распространения программ ного обеспечения. Рассмотрим характерные особенности некоторых их них.

9.1.1. Бесплатные программы (Freeware) Эта модель распространения программного обеспечения подразумевает от сутствие оплаты за использование программ. Очень часто по такому прин ципу распространяются небольшие утилиты, которые, по мнению авторов, могут оказаться полезными широкому кругу пользователей, но не будут иметь спроса, если назначить плату за их использование.

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

Многие бесплатные программы распространяются в исходных текстах.

Но надо отдавать себе отчет в том, что программы в исходных текстах и бесплатные программы — это совсем не одно и то же. Коммерческие про дукты тоже могут поставляться в исходных текстах.

Часть III. Как не надо защищать программы Довольно часто встречается ситуация, когда программа или библиотека бес платна для личного использования, но требует лицензии (иногда весьма не дешевой) для коммерческого применения.

Не редки случаи, когда бесплатное программное обеспечение разрабатыва ется крупными коммерческими компаниями для упрочнения положения на рынке. Так, например, документы в формате PDF вряд ли имели бы сегодня такую популярность, если бы никогда не существовала бесплатная програм ма для их просмотра — Adobe Acrobat Reader, дополняющая линейку плат ных продуктов для создания PDF-документов (Acrobat Exchange, Distiller, Business Tools, Approval и т. д.). Аналогично, для документов, созданных в коммерческой программе Microsoft Word, существовала бесплатная про грамма просмотра Microsoft Word Viewer, также разработанная корпорацией Microsoft.

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

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

9.1.2. Почти бесплатные программы Иногда авторы программ по каким-то соображениям не хотят распростра нять их как коммерческие продукты, но и не возражают против получения какой-нибудь отдачи, не считая морального удовлетворения. Чаще всего вы бирается один из следующих методов распространения".

• Cardware — каждый пользователь программы, желающий зарегистриро ваться, должен послать автору программы почтовую открытку с видом местности, где он проживает;

— более современный вариант Cardware, подразумевающий от сылку автору электронного письма. Как правило, в ответ автор присылает регистрационный код, дающий возможность работать с программой;

— это когда автор не требует никакой оплаты, но предлагает всем, кому понравилась программа, пожертвовать произвольную сумму, чтобы поддержать разработку;

— почти то же самое, что и Donationware, но автор готов прини мать не только денежные пожертвования, но и другие подарки;

— благодарность за программу принимается в виде пива;

• — автор собирает с пользователей плату за программу в форме рецептов вегетарианских блюд;

Глава 9. Актуальные задачи защиты программ Memorialware — человек по имени Гари Крэмблитт (Gary по святил свою программу памяти отца и распространяет ее как Memorialware. Для пользователей программа бесплатна, но всем желаю щим предлагается помочь мемориальному фонду 9.1.3. Программы, показывающие рекламу В последние годы XX века, когда бурный рост интернет-технологий еще не успел перейти в глубокий кризис, была популярна модель распространения программного обеспечения, демонстрирующего рекламу. "Ad" со кращением от английского слова Advertisement — реклама.

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

Разумеется, этот подход годился преимущественно для программ, работа которых прямо связана с доступом в Интернет.

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

9.1.4. Коммерческие программы (Commercial) Коммерческое программное обеспечение, очевидно, создается с целью из влечения прибыли и распространяется за материальное вознаграждение. На верное, коммерческие программы больше всего похожи на обычные товары, которые люди привыкли покупать в магазинах.

Прежде всего, для программного обеспечения, распространяемого как чисто коммерческое, применяется принцип "деньги — вперед", т. е. пользователь получает программу только после полного внесения оплаты.

Очень многие программы, распространяемые таким способом, являются "коробочными" — при покупке пользователь получает коробку, в которой уложены носители информации (например DVD или компакт-диски), доку ментация, регистрационная карточка и еще все что угодно, на усмотрение продавца.

Часть III. Как не надо защищать программы Разумеется, автор (или правообладатель) кровно заинтересован в том, чтобы собрать плату с каждого пользователя программы. Для достижения этого необходимо применять технологические методы, ограничивающие распро странение нелегальных копий программы. К попу лярным технологическим методам относятся различные аппаратные защиты, системы регистрации и активации, проверка лицензии через Интернет при каждом запуске программы и т. д.

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

Для того чтобы не отпугнуть покупателей, продавцы часто вынуждены обе щать возврат денег в течение, например, двух недель с момента покупки, если программа не понравится.

9.1.5. Почти работоспособные программы Разработчики коммерческих программ в рекламных целях выпускают огра ниченные ознакомительные версии своих продуктов. Такие версии обычно не позволяют плодотворно работать, но создают правдивое впечатление о функциональности программы. Можно выделить несколько основных ти пов ограниченных программных продуктов:

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

• — подразумевается наличие ограничений по времени использо вания. Ограничения могут выражаться в виде длительности периода вре мени, на протяжении которого можно пользоваться программой (напри мер 30 дней с момента инсталляции) или в виде фиксированной даты истечения тестового периода. Может ограничиваться число запусков программы или число процессов обработки;

— пользователь регулярно извещается о том, что данная версия программы не является полноценной коммерческой версией. Такое из вещение может выглядеть как диалоговое окно, появляющееся при за пуске программы и с некоторой периодичностью во время работы, до полнительные надписи, выводимые на принтер или экран, и т. д.

Разумеется, возможны различные комбинации описанных ограничений.

И далеко не каждый коммерческий продукт имеет ознакомительную версию — такой подход скорее исключение.

Глава 9, Актуальные задачи защиты программ 9.1.6. Условно бесплатные продукты (Shareware) Наличие возможности оценить программу до покупки ("try before you buy") является отличительной чертой условно бесплатных продуктов. Share пере водится с английского языка как разделять, совместно использовать. Подра зумевается, что незарегистрированную версию условно бесплатной про граммы можно свободно распространять в неизмененной форме.

Условно бесплатное программное обеспечение так же, как и коммерческое, разрабатывается с целью извлечения прибыли. Но потенциальному пользо вателю до того, как он заплатит деньги, обязательно предоставляется воз можность попробовать программный продукт в действии в течение некото рого периода времени.

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

Обычно условно бесплатные программы доставляются через Интернет и имеют небольшой размер (единицы мегабайтов). Также очень часто для превращения ограниченной версии в полнофункциональную не требуются никакие дополнительные файлы — достаточно ввести правильный регист рационный код, полученный от продавца.

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

Условно бесплатные продукты очень популярны. крупные разработ чики берут на вооружение концепцию "try before you чтобы заинтере совать покупателей. По сути, ограниченные ознакомительные версии ком мерческих продуктов являются всего лишь одной из модификаций идеи Shareware. Даже корпорация Microsoft бесплатно распространяет 120-дневные версии Windows 2003 Server и Visual Studio Правда, небольшое отли чие заключается в том, что для превращения 120-дневной версии в Ценную придется получить диск с новой версией и процедуру обновления, а для "классических" условно бесплатных программ переход к полной версии происходит сразу же после ввода правильного регистраци онного кода.

104 Часть III. Как не надо защищать программы 9.2. От чего защищают программы Коммерческие программы обычно защищают от несанкционированного ти ражирования.

Наличие доступа только к носителю информации с дистрибутивом (набором инсталляционных файлов) программного продукта не должно давать воз можности установить работоспособную копию программы. То есть данных дистрибутива, который можно скопировать или незаметно взять на несколь ко дней, не должно хватать для создания работоспособной копии програм мы. Подобные ограничения могут быть реализованы разными способами.

Например, очень многие коммерческие программы при инсталляции требу ют ввести серийный номер, напечатанный на коробке или указанный в од ном из прилагаемых к программному продукту документов (у Microsoft — в сертификате аутентичности). | Также часто возникает потребность ограничить число пользователей, одновре менно работающих с программой. То есть человек, который приобрел лицен зию на одно рабочее место, не должен иметь возможности создать 2 рабочих места, функционирующих одновременно. Это достигается за счет использова ния аппаратных ключей, менеджеров лицензий и процедуры активации.

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

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

Условно бесплатные продукты, в отличие от ограниченных по функ циональности оценочных версий коммерческих программ, после ввода регистрационного кода должны предоставлять доступ ко всем функциям, предусмотренным в полной версии программы. То есть в бесплатно распро страняемой версии программы должны быть реализованы все функции полной версии. Следовательно, желательно так организовать защиту, чтобы зло умышленник не смог добраться до функций, присущих только полной сии, пока в его распоряжении не будет правильного регистрационного Процедуры проверки правильности серийных номеров, а также кодов и кодов активации должны строиться таким образом, чтобы злоумышленник не мог самостоятельно генерировать правильные коды и, в то же время, длина кодовой строки не была очень большой.

Глава 9. Актуальные задачи защиты программ Также может возникнуть потребность защищать любые исполняемые файлы от внесения изменений, дизассемблирования, исследования под отладчиком и т. д.

9.3. Основные форматы исполняемых файлов За время существования персональных компьютеров на процессорах семей ства х86 (начиная от IBM PC XT на процессоре Intel 8086) успело смениться несколько форматов двоичных файлов, предназначенных для хранения от компилированного кода программы.

В операционной системе DOS (Disk Operating System) поддерживалось два основных формата исполняемых файлов: и СОМ-файлы загру жались в оперативную память без каких-либо дополнительных настроек, и их размер не должен был превышать 64 Кбайта. ЕХЕ-файлы не имели таких жестких ограничений на размер и состояли из заголовка, включающего всю необходимую информацию для правильной загрузки программы в память, и собственно кода программы. Заголовок DOS-овских ЕХЕ-файлов начинался с символов 'MZ' или 'ZM', и до сих пор его так и называют — MZ Header (MZ-заголовок). Буквы MZ являются инициалами Марка Збыковски (Mark Zbikowski), являвшегося разработчиком данного формата. Сейчас все испол няемые файлы содержат MZ-заголовок, за которым может следовать ин формация о другом формате.

С появлением 16-битовой версии Windows возникла потребность в расши ренном формате исполняемых файлов. В Windows была реализована под держка динамически подсоединяемых библиотек (dynamic-link library. DLL), поэтому новый формат должен был обеспечить возможность хранения, в частности, таблиц экспортируемых (находящихся в DLL и доступных модулям) и импортируемых (находящихся во внешних библиотеках) Кроме этого в Windows широко используются ресурсы — двоич ные данные, содержащие иконки, курсоры, описания диалогов и т. д., кото рые желательно хранить внутри исполняемых файлов. Все актуальные на тот требования были учтены при разработке формата, получившего на звание New Executable (NE, новый исполняемый файл). Заголовок такого начинается с символов 'NE'.

Для хранения драйверов виртуальных устройств Windows (Virtual device driver, VxD) применялся формат Linear Executable (LE, линейный исполняе мый файл). Его модификация под названием Linear executable (LX) исполь зовалась для хранения исполняемых файлов, используемых в операционной системе OS/2 начиная с версии 2.0.

Часть III. Как надо защищать программы В связи с появлением 32-битовой операционной системы Windows NT в Microsoft был разработан формат Portable Executable (РЕ, переносимый исполняемый файл). Точнее, был доработан до своих нужд взятый за прото тип формат объектных файлов COFF (Common Object File Format), исполь зуемый в Unix. Слово "переносимый" в названии, скорее всего, было при звано отражать тот факт, что один и тот же формат файла использовался как во всех 32-битовых операционных системах Microsoft на платформе так и в Windows NT на других платформах (MIPS, Alpha и Power PC). Этот формат является основным для всех современных версий Windows, и имен но ему в книге будет уделено наибольшее внимание.

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

Заголовок РЕ-файла содержит очень большое число различных полей и таб лиц. Одно из полей определяет так называемую точку входа (Entry Point) — то место в программе, куда будет передано управление после загрузки про граммы в память. В DLL управление передается на точку входа не только при загрузке библиотеки, но и при ее выгрузке из памяти, а также при соз дании и уничтожении потоков выполнения внутри программы.

Обычно исполняемый файл состоит из нескольких (точное количест во секций указано в РЕ-заголовке). Редактор связей (Linker), как правило, объединяет в одну секцию однотипную информацию.

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

В секции кода помещаются собственно команды процессора, исполняемые в ходе работы программы. Эта секция имеет атрибуты, разрешающие испол нение кода и запрещающие запись.

Статические данные не изменяются после загрузки программы в память.

поэтому для секции статических данных обычно не устанавливается атрибут.

разрешающий запись. Попытка записи в эту секцию в момент выполнения Глава 9. Актуальные задачи защиты программ программы приведет к выработке исключительной ситуации (exception).

Атрибуты секции динамических данных, напротив, разрешают запись в нее.

Секция ресурсов также не должна изменяться в процессе выполнения про граммы, и поэтому она не имеет атрибута, разрешающего запись.

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

Кроме описания секций в заголовке РЕ-файла присутствует специальный каталог Directory), описывающий размер и положение служебных структур, необходимых для правильной загрузки программы в память. Эти структуры определяют, в каком месте программы хранятся ресурсы, как ис кать адреса экспортируемых функций, как настраивать ссылки на импорти руемые функции и т. д.

Каталог импорта Запись для Запись для Запись для адресов ф-ции Ссылки на имена Ссылка на имя Ссылка на имя Ссылка на имя N Описатель имени Номер функции (hint) Имя функции "CreateFileA' Рис. 9. 1. Таблицы импорта 108 Часть III. Как не надо защищать программы Импортируемые функции, т. е. функции, код которых находится в других ис полняемых модулях, но используется во время работы программы, описы ваются посредством таблиц импорта. Это четыре связанных между собой таблицы: каталог импорта (Import Directory Table), таблица ссылок на имена функций (Lookup Table), таблица имен функций (Hint-Name Table) и табли ца адресов импортированных функций Address Table, Таблицы импорта предназначены для того, чтобы правильно заполнить все значения в таблице адресов импортированных функций. Каждое из этих значений представляет собой адрес определенной функции во внешней биб лиотеке после ее загрузки в адресное пространство процесса 9.1).

РЕ-файлы содержат еще много разных таблиц и атрибутов. Более подробная информация может быть найдена в технической документации на этот формат.

Глава Регистрационные коды для программ Процедура регистрации приобретаемой продукции существует в мире до вольно давно. После совершения покупки потребитель заносит некоторые сведения о себе в регистрационную карточку и отправляет ее производите лю. Таким образом, потребитель становится зарегистрированным пользова телем и получает все причитающиеся ему привилегии, например техниче скую поддержку и гарантийное обслуживание, а производитель пополняет статистическую информацию о своих клиентах. Многие "коробочные" про граммные продукты также содержат регистрационные карточки, а в послед нее время даже позволяют отсылать регистрационную информацию через Интернет.

Так как имя пользователя не является уникальным, каждый экземпляр про даваемой продукции целесообразно связывать с некоторым неповторяю щимся значением, называемым серийным номером. Этот номер указывается пользователем при заполнении регистрационной карточки и в дальнейшем используется при общении с производителем. А в приложении к программ ным продуктам серийный номер вполне может выполнять и вспомогатель ную функцию — ограничивать нелегальное копирование. Если программа при установке требует ввести правильный серийный номер, украв (скопиро вав) носитель с дистрибутивом программы, который одинаковый у всех пользователей, получить рабочую копию программы не удастся. А распро странение серийного номера позволяет найти и наказать ассоциированного с этим номером пользователя.

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

Часть III. Как не надо защищать программы Иногда серийный номер передается пользователю не в явном виде, а часть кода активации/регистрации.

10.1. Требования и классификация Программа должна содержать некоторый механизм, позволяющий рить, является ли введенный пользователем серийный номер (или регистра-] код) правильным, а возможность вычислять коды должна всегда оставаться только в руках разработчика.

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

Тогда без знания регистрационного кода получить полноценную версию программы не удастся. Подобную функциональность обеспечивают, напри мер, программы ASProtect (ASPack Software) и EXECryptor Development).

Определим несколько критериев, по которым можно сравнивать свойства разных методов генерации и проверки кодов:

возможность связать код с именем пользователя или характеристиками компьютера;

• невозможность вычислить какой-нибудь правильный код, имея в распо ряжении только алгоритм проверки;

невозможность вычислить код для определенного пользователя, зная ал горитм проверки и правильный код другого пользователя;

• невозможность расшифровки программы (получения ключа шифрова ния) при наличии заблокированного (занесенного в черный список) ре гистрационного кода;

• длина ключевой строки (удобство пользователя).

10.2. Методы проверки регистрационных кодов Все методы проверки правильности кодов можно, условно, разделить на три категории:

• алгоритмические, основанные на принципе "черного ящика";

• алгоритмические, основанные на математически сложной задаче;

• табличные. Глава 10. Регистрационные коды для программ 10.2.1. "Черный ящик" Любые алгоритмические методы позволяют связать код с именем пользова теля или информацией о его компьютере, тем самым усложнив получение нескольких копий программы, выглядящих как легальные.

При использовании "черного ящика" разработчик старается запутать алго ритм проверки, чтобы его было труднее понять и обратить. Такой подход, наверное, используется чаще всех остальных вместе взятых. Причем его применяют не только неопытные разработчики. Так, например, именно в надежде на то, что противник не сможет разобраться, что к чему, изна чально строилась система лицензирования разрабатываемая ком панией Globetrotter, а теперь принадлежащая Macrovision. Но противник, зачастую, оказывается одареннее, упорнее и лучше подготовлен в своей профессиональной области, чем разработчик защиты. Возможно, именно поэтому на очень многие продукты, защищенные FLEXlm, в Интернете нетрудно найти поддельные лицензии. А начиная с версии 7.2, FLEXlm поддерживает лицензии на основе эллиптических кривых, поделка которых сводится к решению сложной математической задачи.

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

Правда, попытки запутать алгоритм проверки в последнее время получают научную поддержку. Так на семинаре по проблемам управления цифровыми правами DRM Workshop 2002 была представлена работа "A White-Box DES Implementation" ("Прозрачная реализация DES"), в которой предлагалась реализация DES, где ключ шифрования не фигурирует в явном виде, но яв ляется частью кода, обрабатывающего данные. То есть при смене ключа из менится код функции шифрования. Подобный подход, возможно, является перспективным, но в рамках того же DRM Workshop 2002 была представле на другая работа, в которой анализировалась White-Box DES-реализация и предлагался метод эффективной атаки, приводящей к извлечению ключа шифрования.

Сложная математическая задача Алгоритмические методы проверки регистрационного кода, основанные на сложной математической задаче, не нуждаются в сокрытии деталей реализа ции. Их особенность в том, что для генерации кода и проверки его пра вильности используются два разных алгоритма и получение алгоритма генерации из алгоритма проверки является математической задачей, не Часть III. Как не надо защищать программы имеющей на настоящее время эффективного решения. Чаще всего для этих целей используются криптографические с открытым ключом.

Однако у асимметричной криптографии есть одна особенность: размер бло ка, над которым производятся операции, довольно большой. Так, для RSA-1024 размер блока (а значит, и минимальный размер регистрационного кода) составляет 128 байт. А чтобы двоичные данные можно было ввести с клавиатуры, их кодируют, например, алгоритмом MIME64, который уве личивает размер блока на треть. То есть длина кодовой строки составит как минимум 172 символа. Очевидно, что ввести без ошибок бессмысленную последовательность такой длины, состоящую из букв, цифр и знаков препи нания, почти невозможно. Это делает данную схему неприемлемой для ре гистрации, например, по телефону или факсу.

Делаются попытки создать стойкую систему регистрации, использующую короткие коды и основанную на сложной математической задаче. Так, пания SoftComplete Development в своем продукте HardKey System сии 2.0 (апрель 2002) использовала алгоритм, для взлома которого надо бы ло многократно вычислить дискретный логарифм, что является задачей. Существует изящный способ вычисления дискретного логарифма, который требует времени и памяти квадратному корню из модуля. С его помощью на однопроцессорной машине с тактовой частотой 2 ГГц версия HardKey, использующая 35-битовый модуль, могла быть взло мана примерно за 10 минут, а 47-битовый модуль — за сутки. Но для взлома версии, использующей 62-битовой модуль, потребовалось бы 16 Гбайт опе ративной памяти, что рядовой взломщик себе вряд ли сможет позволить.

Тем не менее, к ReGet Deluxe версии RC, использовавшей именно 62 битовый модуль, группой SSG был создан генератор кодов. Правда, по не проверенной информации, вычисление дискретного логарифма не проводи лось — секретный ключ якобы был похищен с сервера авторизации. Но со временные оценки сложности вычисления дискретного логарифма совпадают с оценками сложности для разложения числа на простые множи тели, выполняемого при взломе RSA. И, как известно, еще в 1999 году был факторизован 512-битовый ключ RSA, а значит, теоретически на современ ной технике можно вычислить и дискретный логарифм по 512-битовому модулю.

HardKey System начиная с версии 3.0 опирается на другую сложную матема тическую проблему — Hidden Field Equations замаскированная систе ма уравнений над полем), которая, на настоящий момент, очень слабо изу чена, но вроде бы позволяет обеспечить достаточно высокий уровень стойкости при малом размере блока. Однако стоит заметить, что HFE явля ется патентованной технологией во многих странах.

Глава Регистрационные коды для программ В любом случае, при правильной реализации алгоритмические методы, ос нованные на математически сложной задаче, не позволяют взломщику, знающему один правильный регистрационный код, генерировать новые коды. Но единственный способ заблокировать украденный код заключается в том, чтобы занести этот код в так называемый "черный список". И оче видно, что обход блокировки требует не решения математической задачи, а исправления логического условия. То есть при желании взломщик может получить полностью работоспособную версию расшифрованной программы, имея только заблокированный код.

Табличные методы В табличных методах генерируется заданное количество регистрационных кодов (по числу возможных пользователей), и в программе хранятся табли цы, построенные на основе этих кодов. Разумеется, коды не могут зависеть от имени пользователя или характеристик системы, т. к. генерируются до того, как появляются первые зарегистрированные пользователи.

+ шифрования / / Зашифрован ный элемент таблицы 10. 1. Формирование записей в Часть III, Как надо защищать программы код Рис. Проверка регистрационного кода простой способ — хранить в программе результат вычисления крип ографической хэш-функции от каждого кода. При этом легко проверить правильность ключа, вычислив его хэш, но, имея значение хэша, вычислить ключ практически невозможно.

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

Поэтому более правильно для каждой новой публичной версии продукта случайным образом ключ шифрования программы. А каждая Глава 10, Регистрационные коды для программ запись таблицы должна получаться путем зашифрования ключа программы на ключе, полученном из регистрационного кода. И, разумеется, каждая за пись должна содержать некоторую контрольную информацию, позволяю щую оценить правильность расшифровки.

На рис. 10.1 приведена блок-схема алгоритма, используемого для формиро вания записей, соответствующих отдельным регистрационным кодам. Рису нок 10.2 иллюстрирует обратный алгоритм — проверку правильности реги страционного кода и извлечение ключа шифрования программы.

При таком подходе каждый регистрационный код никак не зависит от всех остальных, но позволяет легко вычислить ключ шифрования программы.

А для блокировки кода достаточно удалить соответствующую ему запись из таблицы.

Если выяснится, что количество пользователей может превысить количество сгенерированных регистрационных кодов, таблица может быть увеличена до любого желаемого размера. Правда, владельцы новых (добавленных) регист рационных кодов не будут признаваться старыми версиями программы как лицензированные пользователи.

10.3. Какой метод выбрать У каждого из описанных ранее методов проверки правильности кодов есть свои достоинства и недостатки.

Так "черный ящик" сравнительно прост в реализации и позволяет использо вать короткие коды, привязанные к имени пользователя. Но почти всегда при использовании этого подхода возможно создание генератора ключей.

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

Кроме того, многие алгоритмы покрываются действующими патентами.

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

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

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

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

случаях требуется некоторый способ создания и контроля уникаль носителя.

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

из способов — использование дорожек с нестандартным размером По историческим причинам почти все перезаписываемые носители на компьютерах, которые назывались IBM-совместимыми, размер сектора, равный 512 байтам. В базовую подсистему ввода а (Basic Input-Output System, BIOS) были встроены возможности рабо :екторами других размеров, но для DOS в пределах одного диска все за должны были иметь один и тот же размер.

Часть III. Как не надо защищать программы Защита заключалась в том, что одна из дорожек, не содержащая полезных данных, форматировалась с нестандартным размером сектора, например или 256 байт, и на нее записывалась ключевая информация. Для DOS, уве ренной в неизменности размера сектора не протяжении всего диска, эта до рожка выглядела поврежденной, но программа через BIOS могла читать и записывать на нее необходимые данные. Очевидно, что такой подход позво лял довольно легко повторять манипуляции на уровне BIOS и тиражировать ключевые дискеты.

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

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

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

Защита пыталась читать или писать заранее известную область диска, и если запрос проходил без ошибки, то дискета не признавалась подлинной.

При наличии некоторой практики можно довольно точно воссоздавать по вреждения на другой дискете, но гораздо проще было эмулировать повреж денные сектора, т. к. их список было довольно легко получить, если имелся доступ к оригинальной дискете.

Несмотря на то, что дискеты практически вышли из обихода с появлением перезаписываемых компакт-дисков, последний раз защиту, основанную на использовании испорченных секторов на дискете, мне довелось увидеть в январе 2001 года. Так был защищен один из пакетов программ, предназна ченных для восстановления забытых паролей.

Самый продвинутый способ создания ключевых дискет на уровне портов ввода-вывода контроллера гибких дисков — самом низком Глава Привязка к носителям информации уровне, доступном программисту. Используя хитрые методы записи инфор мации, например форматирование дорожки, прерываемое в ходе выполне ния, удавалось создавать дискеты с такими характеристиками, которые практически невозможно было повторить даже с помощью специальных контроллеров, например платы Option Board Deluxe, разработанной компа нией Central Point Software.

Но в начале 90-х годов появилась программа FDA (Floppy Disk Analyser), разработанная российской компанией Мединком. Эта программа была спо собна анализировать содержимое дорожек дискеты и с высокой степенью точности создавать копии. Большая часть защищенных дискет копировалась в автоматическом режиме, а для особо сложных случаев был предусмотрен режим ручного управления копированием.

Весьма забавно, что сама программа FDA поставлялась на ключевой диске те, допускающей четыре инсталляции с привязкой к компьютеру.

Однако с появлением операционной системы Windows NT, под которой прямая работа с контроллером жестких дисков из прикладной программы стала невозможной (для этого требовалась установка драйвера), ключевые дискеты практически перестали применяться для защиты от копирования.

К тому же, им на смену пришли компакт-диски.

11.2. Привязка к компакт-дискам Несмотря на внешнюю несхожесть дискет и компакт-дисков, очень многие методы создания некопируемых магнитных носителей были успешно пере несены на оптические диски.

Разумеется, большинство используемых компакт-дисков не допускает пере записи, а те, что допускают, не позволяют изменять информацию в произ вольном месте — можно только дописать новые данные или стереть все, что было записано ранее. Поэтому на компакт-дисках не делают защиты со счетчиком установок.

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

Прежде всего, стоит отметить, что получать доступ к содержимому компакт диска можно на нескольких уровнях.

Самый высокий уровень — это уровень файловой системы. Данные записы ваются на диск в определенном формате (например ISO-9660), и драйвер файловой системы компакт-диска File System, отвечает за 120 Часть III. Как не надо защищать программы то, чтобы представить содержимое диска в виде дерева каталогов и файлов.

На этом уровне доступны такие операции, как получение списка файлов, открытие файла с определенным именем и чтение из него информации.

Следующий уровень — уровень секторов. Грубо говоря, на этом уровне представляется как последовательность секторов, содержащих полезные данные, и таблица, описывающая содержимое диска (Table Of Contents, Доступны операции чтения ТОС и секторов с заданными номерами.

Самый низкий уровень — уровень команд контроллера. Разные приводы CD-ROM могут иметь различия в доступном наборе команд, но только на этом уровне можно получить самую полную информацию, которую спосо бен выдать привод относительно установленного диска. Использование этого уровня требует разработки драйвера.

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

Программа, привязанная к компакт-диску, может проверять метку тома диска, которая не сохраняется при копировании файлов на винчестер.

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

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

У какого-нибудь файла в директории компакт-диска можно установить очень большой размер, что не позволит прочитать этот файл, т. к. его дан ные просто не будут существовать.

Но все эти методы оказываются бессильны, если выполняется копирование диска на уровне секторов, а не на уровне файловой системы. Сейчас посек торное копирование поддерживает почти любая хорошая программа для создания компакт-дисков, например Nero Burning ROM, разработанная компанией Ahead Software AG.

И, разумеется, для борьбы с посекторным копированием применяются другие методы.

Глава Привязка к носителям информации Диски большой емкости Стандартный компакт-диск вмещает 640 Мбайт данных. Однако можно, не значительно изменив параметры диска, уместить на него 700 и даже 800 Мбайт. При этом диск без проблем будет читаться в большинстве при водов CD-ROM.

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

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

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

Нарушения стандарта имеют еще один негативный аспект: они могут при вести к тому, что диск не будет читаться на некоторых компьютерах, а то и вообще вызовет поломку привода CD-ROM.

Физические ошибки на диске Если диск содержит сознательно внесенные нарушения в области данных, которые приводят к ошибкам чтения, это не обязательно является наруше нием стандарта — ошибки могли возникнуть и по естественным причинам, таким как загрязнение или механическое повреждение носителя. Следова тельно, все приводы должны правильно отрабатывать ситуации, когда опре деленный сектор не может быть прочитан. А программа может принимать решение о подлинности диска на основании того, что некоторые строго оп ределенные сектора не читаются.

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

Но существуют и другие программы, работающие с контроллером напрямую и выполняющие копирование не на уровне логических секторов, а, факти чески, на уровне "сырых" данных, которые привод получает с диска. Иногда это называют побитовым копированием.

Наверное, самым популярным инструментом для побитового копирования компакт-дисков была программа CloneCD, разработанная компанией;

Elaborate Bytes AG. О программе приходится говорить в прошедшем време ни, т. к. на официальной странице CloneCD в Интернете вывешено сооб щение о том, что продажи и распространение прекращены. Причина такого решения связана с новым законом о защите авторских прав, но деталей, к сожалению, не приводится.

Однако кроме CloneCD существует много других программ, успешно справ ляющихся с побитовым копированием практически любых компакт-дисков и создающих копии, принимаемые защитой за оригинал.

Также существуют программы, эмулирующие компакт-диски. Они позволя ют использовать заранее сохраненный образ компакт-диска для того, чтобы изображать привод CD-ROM с установленным в нем диском. Многие эму ляторы, например Daemon Tools, умеют передавать не только содержимое диска, но и все ошибки, которые используются для предотвращения копи рования и проверки аутентичности компакт-диска.

Однако существуют и системы защиты компакт-дисков, которые долгое время весьма успешно противостояли программам побитового и эмуляторам. Примером такой защиты может служить Система защиты Щ StarForce Professional Про StarForce (SF), систему защиты программного обеспечения, распро страняемого на дисках CD-ROM, от несанкционированного тиражирования, пока написано не очень много. В основном это информация рекламного характера, исходящая от разработчиков, но попадаются высказывания и тех, кто эту защиту пытался обойти.

На официальном интернет-сайте приводится следующее описание характе ристик системы защиты StarForce Professional:

• SF Professional не позволит запустить программный продукт, если компакт-диск идентифицирован как скопированный. Вне зависимости Глава Привязка к носителям информации от того, где и как была сделана копия диска (в домашних условиях или на заводском оборудовании), система определит, что данный диск — не легальный;

D компакт-диски, защищенные SF Professional, не копируются такими программами, как CloneCD, CDRWin, BlindWrite и им подобными.

Защищенные приложения не запускаются на эмуляторах компакт дисков, к которым относятся Daemon Tools, Virtual CD-ROM и т. п.;

• используя комплект разработчика на этапе создания программного кода, можно значительно усилить защиту приложения против самых эффек тивных методов взлома;

• для встраивания защиты SF Professional не требуется специального тех нологического оборудования, нужен только компьютер и доступ на один из серверов StarForce;

• компакт-диски, защищенные SF Professional, максимально совместимы с разнообразными моделями существующих устройств CD/DVD-ROM.

Это обусловлено тем, что в SF Professional используется уникальный ме тод определения подлинности диска без вмешательства в его физическую структуру;

• система защиты использует алфавитно-цифровой 24-значный ключ, ко торый вводится пользователем защищенного программного приложения в процессе эксплуатации только один раз — в момент первого запуска.

Ключ будет работать исключительно с дисками данной партии про граммного обеспечения.

Некоторую полезную информацию можно почерпнуть из интервью с Игорем Павлюком, менеджером по связям с общественностью компании Protection Technology, которая является разработчиком StarForce. В интервью приводятся цитаты, собранные в различных форумах исследователей программ, в том числе зарубежных, где активно происходит обсуждение возможностей взлома или копирования защищенного программного обеспечения.

Так в одном из сообщений на выдвигается призыв уничто жить новую защиту в зародыше Copy protection — Kill the bird in its egg).

другом сообщении на том же сайте можно заметить техническое любо пытство: как StarForce ухитряется обходить методы побитового копирова ния, используемые программами типа CloneCD? (I'm curious how they are able bypass the 1:1 copy-method that CloneCD and all other burning programs use...).

Но любопытство быстро сменяется на серьезные опасения, что новая систе ма защиты скоро станет весьма популярной, потому что не требуется специ альное оборудование, не существует универсального способа взлома и за щищенные диски не копируются с помощью CloneCD (This StarForce system for CD's and CD-R's seems to be very popular soon, because all Часть III. Как не надо защищать steps in making protected cd's can be done also there is no generic available and this protection can't be copied by CloneCD).

А в одном сообщении на форуме поддержки Daemon Tools (одного из мощных эмуляторов компакт-дисков) утверждается, что сделать копию ка, защищенного StarForce, практически невозможно из-за особенностей защитного механизма (ft will be nearly impossible to make a backup of StarForce CDs, because of the nature of their protection). Да и разработчик Daemon Tools подтверждает это утверждение своей репликой о том, что защищенный диск может быть скопирован только на специальную болванку, соответствующую конкретной партии дисков concerns StarForce it is not possible to burn even theoretically with any program or writer, unless you get special media, which can be different for each title or even party of CDs of same title. So forget if).

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

В форуме Daemon Tools один человек утверждал, что ему удалось сделать копию диска, которая опознается как оригинал в 9 случаях из А в другом сообщении разработчик Daemon Tools практически обещает реализовать эмуляцию дисков, защищенных StarForce (You have to wait until dumping programs appear that can dump it correctly. Most likely will be one of the programs capable to produce such images format). Beta version of Daemon already works successfully with mounted StarForce images — so the question is in images only).

На фоне всего вышеизложенного задача оценить, насколько надежной является защита StarForce и что она собой представляет в действительности, показалась довольно интересной. Ниже приводятся результаты научно-исследовательской работы, выполненной кафедрой "Информационная безопасность" (ИУ-8) МГТУ им. Н. Э. Баумана по соглашению с компанией Protection Technology.

Представители Protection Technology не возражали против публикации этих результатов. В качестве экспериментального образца использовалась игра "Heroes of Might and Magic IV", защищенная StarForce 2.0.

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

Глава Привязка к носителям информации Исследование средств защиты исполняемых модулей от отладки и снятия правильно работающего дампа — занятие неблагодарное. Для грамотно за щищенной программы, с умом использующей все возможности, предостав ляемые защитой, процесс восстановления исполняемого модуля доступен высококлассным специалистам и практически не поддается автома гизации. То есть для снятия защиты с каждой новой программы потребуется часть исследований проводить сначала. Да и полной гарантии сто процентной работоспособности получить не удастся. защиты могут быть вставлены в труднодостижимые места. Например, какая-нибудь проверка вполне может выполняться только в седьмой миссии многоуров невой игры, до которой невозможно добраться быстрее, чем за трое суток непрерывных сражений! Так что оставим снятие защиты через восстановле ние исполняемых модулей фанатикам исследований программ и перейдем к рассмотрению части защиты, связанной с проверкой компакт-диска.

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

Гак как же StarForce опознает оригинальный диск? Правильный ответ на этот вопрос знают только разработчики, однако в форуме поддержки Daemon Tools можно найти высказывание, что StarForce использует инфор иацию об углах между секторами и метод получения этой информации со вместим с 99.9 % приводов CD-ROM (StarForce uses angle info and the method retrieving this makes it 99.9 % compatible with any CD-ROM).

Попробуем проверить гипотезу об определении аутентичности диска путем измерения его угловых характеристик. Для этого смоделируем процессы, при чтении диска.

Модель задержек при чтении информации с компакт-диска В популярных источниках легко найти описание характеристик звукового компакт-диска.

126 Часть Как не надо защищать программы Компакт-диск (КД) КД имеет диаметр 120 мм и центральное посадочное отверстие диаметром мм. Зона записи звука заключена в кольце с внутренним диаметром 50 мм и 116 мм. Вне ее находится зона, содержащая вспомогательную информацию, которая позволяет автоматизировать процесс воспроизведения.

Сигнал записан на дорожке, расположенной на КД в виде спирали. Шаг витков спирали 1.6 мкм, т. е. поперечная плотность записи 625 дорожек/мм. Всего до рожка образует на КД 20 000 витков общей протяженностью 5 км и начинается не у наружной границы зоны записи, как на обычных грампластинках, а у внут ренней.

Все вышесказанное справедливо и для компакт-дисков, на которых записа ны данные. Спираль разбивается на последовательно идущие сектора, дли ной 2352 байт каждый (16-байтовый заголовок, 2048-байтовая область дан ных и 288-байтовая зона коррекции ошибок). Также известно, что линейная плотность информации вдоль спирали является постоянной на всем диске.

Для дальнейших рассуждений примем, что расстояние между дорожками (1.6 мкм) одинаково на любых компакт-дисках, а длина сегмента спирали, принадлежащего одному сектору, является постоянной для конкретного эк земпляра диска. Размеры зоны записи (внутренний и внешний радиусы) и полезная емкость носителя могут варьироваться от одного диска к другому.

Так современные матрицы для записи КД имеют емкость от до 800 Мбайт.

Положение на диске сектора с любым номером однозначно описывается двумя характеристиками диска:

— расстояние от центра диска, на котором начинается нулевой сектор спирали;

— длина сегмента спирали, соответствующая одному сектору.

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

Число витков спирали N с поперечной плотностью D витков/мм от радиуса до радиуса определяется формулой:

N = * D Длина спирали L в том же диапазоне радиусов выражается как:

L = п * + * N = * + R;

J * - * D = n * R,2) * D Глава Привязка к носителям информации Расстояние от начала спирали до сектора будет равно:

* = л * - * D Радиус на котором начинается сектор, определяется как:

= Sqrt (i * + Число витков от начала спирали до сектора вычисляется по формуле:

= * = (Sqrt (i * D/n + - *D Целая часть задает номер витка, а дробная часть — угловое положение сектора.

Теперь перейдем к физическим характеристикам привода.

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

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

Что происходит после того, как пользовательская программа инициировала команду чтения какого-то сектора диска? Грубо последовательность дейст вий может быть описана примерно следующим образом. Сначала запрос на чтение обрабатывается драйверами операционной системы, которые пере дают этот запрос приводу. Привод осуществляет позиционирование голов ки, дожидается, пока диск не повернется до начала сектора, читает данные с диска и передает их в память, а потом присылает извещение о том, что операция чтения завершилась. Дальше происходит окончательная обработка 128 Часть III. Как не надо защищать программы запроса драйверами операционной системы, и прочитанный сектор или не сколько последовательных секторов передаются пользовательской программе.

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

Ту = (n * P, (2) где:

i, j — номер сектора, следующего за последним прочитанным во время первого или второго запроса сектором;

• — задержка между окончаниями выполнения запросов;

• — положения /-ого и сектора на спирали, вычисленные по.

формуле fract (x) — дробная часть период вращения диска (время, за которое происходит один •' оборот);

— произвольное целое число.

То есть задержка состоит из времени, необходимого для нескольких полных оборотов диска, и времени на поворот диска от углового положения fract (NJ до углового положения fract (Nj).

Как StarForce проверяет диск Проверка подлинности диска состоит из нескольких этапов. Сначала чита ется информация о диске, установленном в приводе, и проверяется его мет ка тома. Затем выполняется 8 запросов на чтение случайных одиночных секторов с номерами в диапазоне от 1 до 65 536. Результаты чтения никак не используются, и, скорее всего, эти действия нужны для разгона диска до номинальной скорости вращения. Затем еще раз читается (но уже не прове ряется) информация о диске. Все перечисленное выше проходит через драй вер файловой системы CDFS, никак не защищено от анализа и, следова тельно, наверняка не влияет на процесс аутентификации.

Все остальные обращения к диску идут на более низком уровне. В той вер сии StarForce, анализ которой проводится, обращения адресовались драйве Глава Привязка к носителям информации ру устройства и представляли собой SCSI-команды. Последователь ность этих команд такова.

1. Чтение содержания диска (Table Of Content, 2. Чтение одиночных секторов с номерами 17, 17 (дважды читается сектор).

3. Чтение одиночных секторов с номерами 173117, 173099, 173063, 173045, 173027, 173009, 172991, 172973.

4. Чтение случайных 17 блоков по 8 секторов с номерами первого читае мого сектора в диапазоне примерно от до 173200.

5. SCSI-команда с кодом ОхВВ, описание которой не удалось найти в доку ментации, но которая, скорее всего, отвечает за управление скоростью вращения привода.

6. Чтение одиночного сектора с номером 173117.

Причем если с первой попытки диск не опознан как оригинальный, то шаги 3 и 4 повторяются в цикле. Значит, после выполнения шага 4 вся ин формация, необходимая для аутентификации диска, уже получена.

Попробуем разобраться, зачем может потребоваться каждый из шагов.

Чтение ТОС, скорее всего, требуется для определения номера сектора, с ко торого начинается последняя сессия диска. Так как сес сия всего одна, то в 16 и 17 секторах как раз и хранятся описания структуры тома (метка тома, количество секторов, адрес директории диска и т. д.).

А повторное чтение сектора 17, скорее всего, используется для того, чтобы примерно оценить порядок времени, затрачиваемого на один оборот диска.

Разница времени между двумя чтениями одного сектора должна быть кратна длительности оборота диска.

В последовательности номеров секторов 173099, 173081, 173063, 173045, 173027, 173009, 172991, 172973 легко усматривается закономер ность — каждое следующее значение на 18 меньше предыдущего. Число тоже явно не случайное — на том радиусе диска, где размещаются сектора с указанными номерами, на один виток спирали помещается примерно 18 секторов. А чтение секторов в порядке убывания номера с большой веро ятностью используется для того, чтобы предотвратить чтение с предупреж дением, когда привод считывает во внутренний буфер не только заданные сектора, но и несколько последующих, на случай если данные читаются по следовательно.

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

Pages:     | 1 || 3 | 4 |   ...   | 5 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.