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

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 17.11.2011
Размер файла 2,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Введение

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

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

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

«Рассредоточение» информации по местам ее хранения и обработки, чему в немалой степени способствовало появление в огромных количествах дешевых персональных компьютеров и построенных на их основе локальных и глобальных национальных и транснациональных сетей ЭВМ, использующих спутниковые каналы связи, создание высокоэффективных систем разведки и добычи информации, обострило ситуацию с защитой информации [1].

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

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

Данная работа посвящена проблемам

– распределения ключей для криптографических алгоритмов;

– обмена информации защищенной от фальсификаций и незаконных пользователей.

1. Информационный обзор

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

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

– государственная тайна;

– военная тайна;

– коммерческая тайна;

– юридическая тайна;

– врачебная тайна и т.д.

Говоря о защищаемой информации, имеем в виду следующие признаки такой информации:

– имеется какой-то определенный круг законных пользователей, которые имеют право владеть этой информацией;

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

1.1 Управление ключами

Эффективными системами криптографической защиты данных являются асимметричные криптосистемы, называемые также криптосистемами с открытым ключом. В таких системах для шифрования данных используется один ключ, а для расшифрования - другой ключ (отсюда и название - ассиметричные). Первый ключ является открытым и может быть опубликован для использования всеми пользователями системы, которые зашифровывают данные. Расшифровывание данных с помощью открытого ключа невозможно [2].

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

Одной из главных сфер применения схемы шифрования с открытым ключом является решение проблемы распределения ключей. Имеется две совершенно различные области использования шифрования с открытым ключом в этой сфере:

– распределение открытых ключей;

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

Рассмотрим каждую из этих областей использования данной схемы шифрования по порядку [11].

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

– публичное объявление;

– публично доступный каталог;

– авторитетный источник открытых ключей;

– сертификаты открытых ключей.

Одной из основных составляющих шифрования с открытым ключом является то, что открытый ключ является общедоступным. Таким образом, при наличии широко используемого алгоритма (например, RSA) любая участвующая в обмене данными сторона может предоставить свой открытый ключ любой другой стороне или передать ключ по средствам коммуникаций для всех вообще (рис. 1.1). Например, из-за возрастающей популярности PGP в которой используется RSA, многие пользователи PGP приняли практику присоединения своих открытых ключей к сообщениям, которые они посылают в открытые форумы, например в группы новостей USENET или списки рассылки Internet.

Рисунок 1.1 - Неконтролируемое распределение открытых ключей

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

Рисунок 1.2 - Публикация открытых ключей

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

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

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

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

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

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

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

Лучшая защита распределения открытых ключей может быть достигнута путем более строгого контроля за распределением открытых ключей из каталога. Типичный сценарий представлен схемой (рис. 1.3), в основу которого положен один из рисунков из [РОРЕ79]. Как и прежде, сценарий предполагает наличие некоторого центрального объекта, уполномоченного поддерживать динамический каталог открытых ключей всех участников обмена данными. Кроме того, каждому из участников достоверно известен открытый ключ центра, но только центр знает соответствующий личный ключ. При этом выполняются следующие действия (их номера согласованы с номерами на рис. 1.3).

Инициатор А посылает сообщение с меткой даты / времени авторитетному источнику открытых ключей с запросом о текущем открытом ключе участника В.

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

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

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

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

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

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

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

Респондент В посылает сообщение инициатору А, шифрованное с помощью KU. и содержащее оказию отправителя А (N1), а также новую оказию, сгенерированную участником В (N2). Ввиду того что только он и мог де шифровать сообщение (3), присутствие N1 в сообщении (6) убеждает участника А в том, что отправителем полученного сообщения был В.

Размещено на http://www.allbest.ru/

Рисунок 1.3 - Сценарий распределения открытых ключей

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

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

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

Альтернативный подход, который предложил Конфельдер (Kohnfelder) [KOHN78], основан на сертификатах, которые могут использоваться участниками для обмена ключами без контакта с авторитетным источником открытых ключей и должны обеспечивать способ обмена, такой же надежный, как способ получения ключей непосредственно от авторитетного источника открытых ключей. Каждый сертификат содержит открытый ключ и другую информацию, создается авторитетным источником сертификатов и выдается участнику вместе с соответствующим личным ключом. Один участник передает информацию о своем ключе другом; с помощью передачи своего сертификата. Другие участники мо гут проверить, что сертификат был создан авторитетным источником. Можно сформулировать следующие требования к этой схеме.

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

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

Только авторитетный источник сертификатов должен иметь возможность создавать и изменять сертификаты.

Все эти требования удовлетворялись первоначальной схемой из [KOHN78]. Деннинг (Denning) добавил к ним следующее дополнительное требование [DENN83].

4. Любой участник должен иметь возможность проверить срок действия сертификата.

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

CA=EKRauth[T, IDA, KUa],

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

D KUauth [CA] = DKUauth[EKRauth[T, IDA, KUa] = (Т, IDA, KUa).

Получатель использует открытый ключ авторитетного источника сертификатов KUauth, чтобы дешифровать сертификат. Ввиду того, что сертификат можно прочитать только с помощью открытого ключа авторитетного источника сертификатов это дает гарантию того, что сертификат пришел именно от авторитетного источника сертификатов. Элементы IDA и KUa сообщают получателю имя и открытый ключ владельца сертификата. Наконец, метка даты / времени Т определяет срок действия сертификата. Метка даты / времени должна быть защищена от следующей последовательности действий. Противник узнает личный ключ А. По этой причине А генерирует новую пару ключей (личный и открытый) и обращается к авторитетному источнику сертификатов за новым сертификатом. Тем временем противник воспроизводит сообщение со старым сертификатом и отсылает его В. Если В будет шифровать сообщения, используя старый скомпрометированный открытый ключ, противник сможет прочитать эти сообщения.

Размещено на http://www.allbest.ru/

Рисунок 1.4 - Обмен сертификатами открытых ключей

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

Распределение секретных ключей с помощью системы с открытым ключом

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

Простое распределение секретных ключей

Исключительно простую схему предложил Меркл (Merkle) [MERK79], рис. 1.5. Если инициатор А намерен обменяться данными с пользователем В, для этого предполагается следующая процедура.

Размещено на http://www.allbest.ru/

Рисунок 1.5 - Простое использование шифрования с открытым ключом при выборе сеансового ключа

Сторона А генерирует пару открытый / личный ключи {KUа, KRа} и передает сообщение стороне В, содержащее KUа и идентификатор отправителя A, IDA.

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

Пользователь А вычисляет DKRа[EKUa[Ka]], чтобы восстановить секретный ключ. Поскольку только пользователь А может дешифровать это сообщение, только участника обмена данными А и В будут знать значение Кa.

Участник А выбрасывает ключ KRa, а участник В-выбрасывает ключ KUa.

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

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

Участник А генерирует пару открытый / личный ключи {KUa, KRa} и передает сообщение адресату В, содержащее KUa и идентификатор участника А IDА.

Противник Е перехватывает сообщение, создает собственную пару открытый / личный ключи {KUe, KRe} и передает сообщение адресату В, содержащее KUe || IDA.

В генерирует секретный ключ Кa и передает ЕKUea].

Противник Е перехватывает это сообщение и узнает Кa, вычисляя DKRe [EKUe [Ka]].

Противник Е передает участнику А сообщение ЕKUaa].

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

Распределение секретных ключей с обеспечением конфиденциальности и аутентификации

Схема на рис. 1.6, основанная на подходе, предлагаемом в [NEED78], обеспечивает защиту и от активной, и от пассивной форм атаки. В качестве исходных условий предположим, что А и В уже обменялись открытыми ключами по одной из схем, описанных выше. Далее следует выполнить следующие действия.

Размещено на http://www.allbest.ru/

Рисунок 1.6 - Распределение секретных ключей с помощью шифрования с открытым ключом

Сторона А использует открытый ключ стороны В, чтобы переслать стороне В шифрованное сообщение, содержащее идентификатор участника A (IDA) и оказию (N1), используемую для идентификации данной конкретной транзакции.

Пользователь В посылает сообщение пользователю А, зашифрованное с помощью KUa и содержащее полученную от него оказию (N1) и новую оказию (N2), сгенерированную пользователем В. Ввиду того что только участник В мог дешифровать сообщение (1), присутствие N1 в сообщении (2) убеждает участника А в том, что респондентом является сторона В.

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

Участник А выбирает секретный ключ Кa посылает участнику В сообщение М = EKUb[EKRa[Ka]]. Шифрование этого сообщения открытым ключом стороны В гарантирует, что только участник В сможет прочитать его, а шифрование личным ключом участника А - что только участник А мог послать его.

Сторона В вычисляет DKUa [EKRb [M]], чтобы восстановить секретный ключ.

Обратите внимание на то, что первые три действия этой схемы соответствуют последним трем действиям схемы, показанной на рис. 1.3. В результате при

обмене секретными ключами эта схема гарантирует как конфиденциальность, так и аутентификацию.

Гибридная схема

Еще одна схема использования шифрования с открытым ключом при распределении секретных ключей представляет гибридный подход, применяемый на мэйнфреймах IBM [LE93]. Эта схема предполагает участие центра распределения ключей (ЦРК), с которым каждый пользователь использует свой главный секретный ключ, и распределение секретных сеансовых ключей, шифруемых главным ключом. Схема шифрования с открытым ключом служит для распределения главных ключей. В основе такого трехуровневого подхода лежит следующая логика.

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

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

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

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

1.2 Постановка задачи

ключ секретный открытый генерация

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

– модуль клиентской части;

– модуль серверной части.

Модуль клиентской части должен выполнять функции:

– генерации ключей;

– шифрования открытого сообщения и расшифровывания пришедшего шифр-текста;

– выполнять ЭЦП передаваемого сообщения;

– проверять ЭЦП в пришедшем от пользователей системы сообщении;

Модуль серверной части:

– организовывать пересылку ключей (группам пользователей);

– формировать группу пользователей или канал между двумя пользователями;

– принимать и перераспределять команды клиентского модуля одного пользователя клиентским модулям других пользователей

2. Выбор метода решения

2.1 Выбор алгоритма генерации ключей, шифрования и организации цифровой подписи

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

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

Алгоритм Диффи-Хеллмана состоит в следующем:

Абонентам A и B, ведущим конфиденциальную переписку, известны некоторые два числа M и N. Эти числа могут быть известны и другим заинтересованным лицам. Для того, чтобы создать неизвестный более никому секретный ключ, оба абонента генерируют случайные или псевдослучайные простые числа:

– абонент A - число X;

– абонент B - число Y.

Затем абонент A вычисляет значение (2.1) и пересылает его абоненту B.

LA=(MX) mod N (2.1)

Абонент B вычисляет значение (2.2) и передает его абоненту A.

LB=(MY) mod N (2.2)

Затем абонент A, на основе имеющегося у него числа X и полученного по сети , вычисляет значение (2.3), а абонент B на основе имеющегося у него числа Y и полученного по сети вычисляет (2.4).

(2.3)

(2.4)

Таким образом, в результате обмена у абонентов A B в силу переносимости операции возведения в степень через операцию взятия модуля по простому числу (2.5) имеется единый ключ .

(2.5)

Однако, рассматриваемый алгоритм генерации ключей Диффи-Хеллмана имеет несколько недостатков.

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

Во-вторых, система, для которой разрабатываются модули, должна работать по нескольким схемам организации связи (рис. 2.1), т.е. ключи необходимо генерировать и хранить в одном центре для всех возможных пар, зарегистрированных участников. Это в свою очередь требует дополнительных материальных и ресурсных затрат на защиту такой базы. Кроме того, несмотря на то, что передаваемая информация может касаться исключительно двух зарегистрированных пользователей системы, воспользоваться ею, имея доступ к ключам, смогут все пользователи системы [9].

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

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

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

Размещено на http://www.allbest.ru/

Рисунок 2.1 - Схемы организации связи между абонентами

2.2 Выбор алгоритма шифрования и организации цифровой подписи

В асимметричных криптосистемах используется два ключа: КА - для шифрования информации, КB - для расшифровывания.

В теории криптографии разработаны требования к асимметричным криптосистемам, которые полностью покрывают требования предъявляемые к модулям разрабатываемой системы:

– вычисление пары ключей (КА, КВ) получателем B на основе начального условия должно быть простым;

– отправитель A, зная открытый ключ КА и сообщение М, может легко вычислить криптограмму C (2.6);

(2.6)

– получатель В, используя секретный ключ КВ и криптограмму C, может легко восстановить исходное сообщение M (2.7)

(2.7)

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

– злоумышленник, зная пару (КА, С), при попытке вычислить исходное сообщение M наталкивается на непреодолимую вычислительную проблему.

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

Рассмотрим подробнее алгоритм Ель-Гамаля.

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

. (2.8)

Кроме ключа для шифрования сообщения М, выбирают случайное целое число К, удовлетворяющее условию (2.9)

(2.9)

Затем вычисляют числа а, b (2.10)

(2.10)

Пара чисел (а, b) является шифр-текстом. Заметим, что длина шифр-текста вдвое больше длины исходного открытого текста М.

Для того чтобы расшифровать шифр-текст (а, b), используют (2.11)

(2.11)

данное соотношение справедливо в силу (2.12).

(2.12)

Анализируя работу алгоритма Ель-Гамаля, можно сделать вывод, что алгоритм имеет два недостатка.

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

2. Шифрование выполняется как маскировка открытого текста M (2.10), а рас - шифрование информации - как снятие такой маскировки (2.12).

Алгоритм RSA является более надежным, в плане шифрования чем алгоритм Эль Гамаля. Шифрование в нем происходит путем возведения чисел, характеризующих открытый текст, в большую степень по модулю большого числа, что обеспечивает высокую стойкость шифра к взлому. При попытке взлома RSA-шифра необходимо произвести факторизацию большого числа, что является трудно разрешимой задачей [9].

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

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

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

– маскарад. Абонент С посылает документ абоненту В от имени абонента А;

– ренегатство. Абонент А заявляет, что не посылал сообщения абоненту В, хотя на самом деле послал;

– подмена. Абонент В изменяет или формирует новый документ и заявляет, что получил его от абонента А;

– повтор. Абонент С повторяет ранее переданный документ, который абонент А посылал абоненту В.

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

Решить проблему фальсификации документов и передаваемой информации возможно с использованием цифровой подписи.

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

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

При проверке цифровой подписи получатель сообщения снова вычисляет хэш-функцию m = h(М) принятого по каналу текста М, после чего при помощи открытого ключа отправителя проверяет, соответствует ли полученная подпись вычисленному значению m хэш-функции (рис 2.2).

Рисунок 2.2 - Схема реализации цифровой подписи

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

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

Функция хеширования должна иметь следующие свойства

– быть допустимой для блока любой длинны;

– на входе давать значение фиксированной длинны;

– дайджест h=Н(x) должен вычисляться легко для любого заданного значения х, а алгоритм вычисления должен быть практичным со взгляда, как аппаратной, так и программой реализации.

– для любого данного дайджеста h должно быть практически невозможным вычисление x, для которого H(x)=h.

– для любого блока х должно быть практически невозможным исчисление ух, для которого H(x)=H(y). практично невозможно исчислить какую-либо пару разных х и у, для которых H(x)=H(y).

В качестве хеш-функции, применяемой в разрабатываемой в системе, выберем хеш-функцию, основанную на побитовом сложении по модулю 2. Эта функция удовлетворяет всем перечисленным требованиям, является достаточно простой в реализации и имеет высокую скорость исполнения [8].

2.3 Математическая модель

В криптосистеме RSA открытый ключ , секретный ключ КB, сообщение М и криптограмма С принадлежат множеству целых чисел

ZN={0,1,2,…, N-1}, (2.13)

где N - модуль:

N = P*Q. (2.14)

Здесь Р и Q - случайные большие простые числа. Для обеспечения максимальной безопасности выбирают Р и Q равной длины и хранят в секрете.

Множество ZN с операциями сложения и умножения по модулю N образует арифметику по модулю N.

Открытый ключ выбирают случайным образом так, чтобы выполнялись условия (2.15) и (2.16)

(2.15)

, (2.16)

где - функция Эйлера (2.17)

(2.17)

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

* = 1 (mod) (2.20)

или

Это можно осуществить, так как получатель В знает пару простых чисел (P, Q) и может легко найти . Заметим, что и N должны быть взаимно простыми.

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

Выбранная функция хеширования является функцией, которая связывает все блоки, на которые разбивается исходное сообщение М, операцией XOR (2.21).

, (2.21)

Где - сообщение, представленное в виде последовательности бит,

- j-бит дайджеста , который вычисляется по формуле (2.22)

, (2.22)

Где m - число n-битових блоков,

- j-й бит в i-м блоке, ,

- операция XOR.

Роботу хеш-функция проиллюстрировано на рис. 2.3.

Рисунок 2.3 - Работа хеш-функции

2.4 Алгоритм работы системы генерации ключей и обмена конфиденциальной информацией

Модули системы функционируют согласно следующему алгоритму.

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

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

3. Зарегистрировавшийся пользователь получает от модуля серверного приложения клиентскую часть - модуль генерации ключей

4. Модуль генерации ключей генерирует на машине зарегистрированного пользователя А два ключа открытый ключ и личный ключ .

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

6. Если пользователю А необходимо передать секретную информацию пользователю В, он выбирает в списке зарегистрированных пользователей пользователя B и сообщает системе, что будет генерировать шифрованное сообщение. Модуль серверной части дает команду клиентскому модулю пользователя B сгенерировать ключи , и модуль для организации шифрования данных. Сгенерированный набор ( и ) передается пользователю A.

7. Получив ключ ( и ) пользователь А выполняет шифрование и передает сообщение В.

8. Пользователь B получает шифр и расшифровывает его своим личным сгенерированным для данной сессии ключом и .

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

10. Модуль клиента A:

- создает дайджест сообщения, разбивая сообщение на блоки по 64 бита и используя операцию XOR создает 8-битный дайджест;

- подписывает дайджест личным ключом ;

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

11 Модуль пользователя, которому было адресовано подписанное сообщение, при получении пакета (сообщение, подписанный дайджест)

- создает дайджест полученного сообщения от пользователя А;

- на пришедший от пользователя А дайджест накладывает открытый ключ , расшифровывая дайджест пользователя А;

- сравнивает открытый дайджест с дайджестом полученного сообщения. Если сравнение прошло успешно - сообщение, пришедшее от A, аутентично, т.е. сообщение не было изменено в процессе пересылки [4].

3. Программная реализация

3.1 Переменные, процедуры и функции приложения

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

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

P, Q - простые числа для реализации алгоритма RSA

N - модуль, по которому выполняется шифрование сообщения

fn - функция Эйлера

Ka, Kb - открытый и личный ключи пользователя системы

Возможности, предоставляемые пользователям системы клиентским приложением, определены в модуле как элементы массива ClCmds

ClCmds:array [1..3] of string = ('-msg', '-RSA', '-sig');

Здесь

'-msg' - передача открытого сообщения,

'-RSA' - организация процесса шифрования и передачи сообщения,

'-sig' - реализация цифровой подписи для сообщения.

Процедура

ChooseCommand (RecText:string)

отвечает за обработку команды сервера и выбор нужного действия

Центральное место в реализации алгоритмов шифрования и цифровой подписи занимает функция нахождения НОД - iNOD

function iNOD (a, b:real):real;

var

i:real;

xnod:real;

begin

if a<b then xnod:=a

else xnod:=b;

i:=xnod;

while i>0 do

begin

if ((iMod (a, i)=0) and (iMod (b, i) = 0))

then

begin

xnod:=i;

i:=0;

end

else

i:=i-1;

end;

iNOD:=xnod;

end;

Генерация ключей реализована в процедуре RSA_keys

procedure RSA_keys (P, Q:integer; var N, fn, Ka, Kb:integer);

begin

N:=P*Q;

fn:=(P-1)*(Q-1);

randomize;

repeat

begin

repeat

Ka:=(Random (fn-2)+2)

until (iNod (fn, ka)=1);

repeat

Kb:=(Random (fn-2)+2)

until (((Ka*Kb) mod fn=1));

end

until ((Ka<>Kb) and (iNod (Kb, N)=1));

end;

Ключи, сгенерированные в процедуре RSA_keys используются в функции шифрования сообщения методом RSA - shifrD. В зависимости от того, какое значение Ka или Kb было присвоено формальному параметру Kab, будет выполнятся либо шифрование сообщения либо его расшифровывание.

function shifrD (Kab, N:integer; input:string):string;

var

i, codeS:integer;

code, cod:real;

res, tmp:string;

iCode, iKab, jN, iRes:TFGInt;

begin

res:='';

Base10StringToFGInt (FloatToStr(Kab), iKab);

Base10StringToFGInt (IntToStr(N), jN);

for i:= 1 to length(input) do

begin

code:=ord (input[i]);

Base10StringToFGInt (FloatToStr(code), iCode);

FGIntModExp (iCode, iKab, jN, iRes);

FGIntToBase10String (iRes, tmp);

codeS:=StrToInt(tmp);

res:=res+ chr(codes);

end;

shifrD:=res;

end;

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

function ch8to64b (InputText:string):string,

которая переводит 8 символов таблицы ASCII кодов в 64-битный блок:

function ch8to64b (InputText:string):string;

var

i, j:integer;

BinText, tmp:string;

smb, tsmb:array [1..8] of string;

begin

for i:=1 to 8 do

begin

tsmb[i]:=IntToBin (ord(InputText[i]));

for j:=1 to 8 do

begin

tmp:=tsmb[i];

smb[i]:=smb[i]+tmp [j+24];

end;

end;

for i:= 1 to 8 do

BinText:=BinText+smb[i];

ch8to64b:=BinText;

end;

Функция function xHash (inp: string):string

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

function iHash (tmp:string):string.

function xHash (inp: string):string;

var

tmp, res, inp2:string;

i:integer;

begin

inp2:=inp;

while (length(inp) mod 8 <>0) do

begin

inp:=inp+'а';

end;

tmp:='';

res:='';

for i:=1 to length(inp) do

begin

tmp:=tmp+inp[i];

if (i mod 8 = 0) then

begin

res:= res+iHash(tmp);

tmp:='';

end;

end;

xHash:=res;

end;

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

function shifr_hash (res1:string; Keyb, n:real):string;

var

i, fx, fcode:integer;

res2, tmp:string;

iKab, jN, ifx, iRes:TFGInt;

begin

res2:='';

Base10StringToFGInt (FloatToStr(Keyb), iKab);

Base10StringToFGInt (FloatToStr(N), jN);

for i:=1 to length(res1) do

begin

fx:=ord (res1 [i]);

Base10StringToFGInt (FloatToStr(fx), ifx);

FGIntModExp (ifx, iKab, jN, iRes);

FGIntToBase10String (iRes, tmp);

fcode:=StrToInt(tmp);

res2:=res2+chr(fcode);

end;

shifr_hash:=res2;

end.

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

Function BinToInt (binText:string):longint;

var

bin, mult:longint;

i:integer;

begin

mult:=1;

bin:=0;

for i:=length(binText) downto 1 do

begin

if binText[i]='1' then bin:=bin+mult;

mult:=mult shl 1;

end;

BinToInt:=bin;

End.

3.2 Инструкция по использованию программного продукта

1 При запуске серверной части приложения (project1.exe) необходимо ввести имя базы, в которой будет храниться информация о пользователях. Для корректной работы приложения имя базы должно быть root:

Рисунок 3.1

2 Нажатие клавиши «Start server» (рис. 3.2) приводит к активизации работы серверной части приложения.

Рисунок 3.2 - Запуск работы серверного приложения

3 Клиентское приложение, можно запускать только в случае активированной работы серверной части. Прежде чем нажимать клавишу «Connect» в клиентском приложении необходимо удостовериться, что порт сервера и клиента совпадают (рис. 3.3).

Рисунок 3.3. - Согласование работы серверного и клиентского приложения

4 Удостовериться, что в поле «Имя хоста» указано имя компьютера, на котором запущен сервер.

Рисунок 3.4 - Проверка правильности заполнения имени хоста

5 Для установления связи между приложениями необходимо нажать кнопку «Connect» (рис 3.5)

Рисунок 3.5

6 Установив соединение, клиентское приложение предложит произвести авторизацию пользователя, т.е. ввести имя пользователя и пароль (рис. 3.6)

Рисунок 3.6 - Авторизация пользователя

При успешной авторизации на сервере появляется соответствующее сообщение (рис. 3.7):

Рисунок 3.7

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

Рисунок 3.8 - Список возможных операций при отправке сообщения

8 Для отправки подписанного ЭЦП или зашифрованного сообщения необходимо сгенерировать ключи, нажав кнопку Generate keys (рис. 3.9)

Рисунок 3.9 - Процесс генерации ключей

9 После генерации ключей в поле «Message» можно ввести текст и отправить его, нажав кнопку «SendMessage» (рис. 3.10).

Рисунок 3.10

10 Зашифрованное сообщение приходит на сервер в виде шифра (рис. 3.11)

Рисунок 3.11 - Отображение шифра в окне сообщений сервера

11 Клиентское приложение получателя сообщения автоматически расшифровывает переданное серверной частью приложение и предоставляет пользователю-адресату расшифрованный текст (рис. 3.12).

Рисунок 3.12

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

Рисунок 3.13 - Результат проверки аутентичности сообщения

Страница Shifr Check клиентского приложения предназначена для проверки правильности работы алгоритма RSA и цифровой подписи (рис. 3.14).

Рисунок 3.14

Сервер также может отсылать сообщения клиентам, для этого необходимо ввести сообщение в поле Message и нажать кнопку Send Message.

Рисунок 3.15 - Отправка сообщений клиентам системы с сервера

Кнопка «Update list» предназначена для обновления списка подключённых пользователей (рис. 3.16)

Рисунок 3.16

Выводы

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

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

– модуль клиентской части;

– модуль серверной части.

Модуль клиентской части выполняет функции:

– генерации ключей;

– шифрования открытого сообщения и расшифровывания пришедшего шифр-текста;

– выполняет ЭЦП передаваемого сообщения;

– проверяет ЭЦП в пришедшем от пользователей системы сообщении;

Модуль серверной части:

– организовывает пересылку ключей (группам пользователей);

– формирует группу пользователей или канал между двумя пользователями;

– принимает и перераспределяет команды клиентского модуля одного пользователя клиентским модулям других пользователей.

Список литературы

1 Иванов И.И. Криптология - М., высшая школа, 1984 - 230 с.

2 А.Ю. Винокуров. ГОСТ не прост., а очень прост, М., Монитор. - 1995.-N1.

3 А.Ю. Винокуров. Еще раз про ГОСТ., М., Монитор. - 1995.-N5.

4 А.Ю. Винокуров. Алгоритм шифрования ГОСТ 28147-89, его использование и реализация для компьютеров платформы Intel x86., Рукопись, 1997.

5 А.Ю. Винокуров. Как устроен блочный шифр?, Рукопись, 1995.

6 М.Э. Смид, Д.К. Бранстед. Стандарт шифрования данных: прошлое и будущее.

7 /Пер. с англ./ М., Мир, ТИИЭР. - 1988.-т. 76.-N5.

8 Системы обработки информации. Защита криптографическая. Алгоритм криптографического преобразования ГОСТ 28147-89, М., Госстандарт, 1989.

9 Б.В. Березин, П.В. Дорошкевич. Цифровая подпись на основе традиционной криптографии // Защита информации, вып. 2., М.: МП «Ирбис-II», 1992.

10 W. Diffie, M.E. Hellman. New Directions in cryptography // IEEE Trans. Inform. Theory, IT-22, vol 6 (Nov. 1976), pp. 644-654.

11 У. Диффи. Первые десять лет криптографии с открытым ключом. /Пер. с англ./ М., Мир, ТИИЭР. - 1988.-т. 76.-N5.

12 Водолазкий В., «Стандарт шифрования ДЕС», Монитор 03-04 1992 г. С.

13 Воробьев, «Защита информации в персональных ЭВМ», изд. Мир, 1993 г.

14 Ковалевский В., «Криптографические методы», Компьютер Пресс 05.93 г.

15 Мафтик С., «Механизмы защиты в сетях ЭВМ», изд. Мир, 1993 г.

Размещено на Allbest.ru


Подобные документы

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

    курсовая работа [98,3 K], добавлен 26.09.2012

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

    презентация [561,0 K], добавлен 16.10.2013

  • Использование электронных ключей как средства аутентификации пользователей. Анализ методов идентификации и аутентификации с точки зрения применяемых в них технологий. Установка и настройка средств аутентификации "Rutoken", управление драйверами.

    курсовая работа [4,6 M], добавлен 11.01.2013

  • Основы криптографических систем. Алгоритм создания открытого и секретного ключей. Схема передачи шифрованной информации и алгоритм для цифровой подписи. Преимущества и недостатки системы RSA. Основные формулы для создания RSA-ключей шифрования.

    курсовая работа [683,6 K], добавлен 18.12.2011

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

    дипломная работа [1,2 M], добавлен 20.06.2011

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

    лабораторная работа [326,0 K], добавлен 04.11.2013

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

    курсовая работа [450,8 K], добавлен 22.07.2012

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

    отчет по практике [64,6 K], добавлен 18.09.2013

  • Описания режимов шифрования с использованием электронной книги кодов, с посимвольной и внутренней обратной связью. Генератор реальных случайных последовательностей. Линейный сдвиговый регистр с обратной связью. Генерация ключей в министерстве обороны США.

    реферат [206,1 K], добавлен 18.01.2015

  • Краткие сведения о истории криптографии. Симметричные криптосистемы (системы с секретным ключом) и системы с открытым ключом. Аутентификация и идентификация, электронная цифровая подпись. Управление ключами, их архивирование, хранение и восстановление.

    доклад [458,9 K], добавлен 08.11.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.