Построения систем защиты информации для программных пакетов, используемых в монопольном доступе

Вопросы защиты информации, стоящие перед автоматизированными системами дистанционного обучения. Криптосистема Ривеста-Шамира-Эйделмана, основанная на эллиптических кривых. Адаптированный метод асимметричного шифрования. Язык программирования С++.

Рубрика Программирование, компьютеры и кибернетика
Вид диссертация
Язык русский
Дата добавления 15.01.2009
Размер файла 713,4 K

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

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

Описание используемых параметров:

name - имя открываемого файла.

uptFileNameForRead - имя файла с алгоритмом расшифрования.

uptFileNameForWrite - имя файла с алгоритмом шифрования.

handle - возвращаемый дескриптор открытого файла.

HRESULT Close(

[in] short handle);

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

Описание используемых параметров:

handle - дескриптор закрываемого файла.

HRESULT Write(

[in] short handle,

[in] VARIANT buffer,

[out, retval] long *written);

Функция Write производит запись в файл данных, переданных в переменной типа VARIANT. Запись производится в файл связанный с дескриптором, передаваемый в параметре handle. В возвращаемом значении written после завершения работы функции, будет указано количество байт записанных в файл.

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

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

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

Описание используемых параметров:

handle - дескриптор файла для записи.

buffer - записываемое значение.

written - возвращает размер записанных данных в байтах.

HRESULT Read(

[in] short handle,

[out] VARIANT *buffer,

[out, retval] long *read);

Функция Read читает из файла данные и возвращает их в виде переменной типа VARIANT. Чтение производится из файла связанного с дескриптором, передаваемого в параметре handle. В возвращаемом значении read после завершения работы функции будет указано количество прочитанных из файла байт.

Описание используемых параметров:

handle - дескриптор файла для чтения.

buffer - возвращаемые данные.

read - возвращает размер прочитанных данных в байтах.

HRESULT WriteString(

[in] short handle,

[in] BSTR buffer,

[out, retval] long *written);

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

Описание используемых параметров:

handle - дескриптор файла для записи.

buffer - записываемая строка.

written - возвращает размер записанных данных в байтах.

HRESULT ReadString(

[in] short handle,

[out] BSTR *buffer,

[out, retval] long *read);

Функция ReadString служит для чтения строки из зашифрованного файла.

Описание используемых параметров:

handle - дескриптор файла для чтения.

buffer - возвращаемая строка.

read - возвращает размер прочитанных данных в байтах.

HRESULT FromFile(

[in] short handle,

[in] BSTR FileName,

[out, retval] long *read);

Функция FromFile позволяет записать в зашифрованный файл данные, прочитанные из другого файла. Иначе говоря, данная функция сохраняет целиком произвольный файл в зашифрованном файле. Это может быть удобно, если, например, следует сохранить и зашифровать набор картинок в формате jpg. Если бы данная функция отсутствовала, то пришлось бы вначале программно считывать эти файлы в память, а уже затем записывать в зашифрованный файл. Чтобы облегчить задачу программисту и была создана эта функция. Обратным действием - извлечением файла из зашифрованного хранилища - занимается функция ToFile. В результате получается искомый файл в незашифрованном виде. Это может показаться слабым местом в организации защиты. Но в этом есть смысл с точки зрения удобства адаптации уже существующих программный комплексов обучения и тестирования. Сразу хочется заметить, что если есть желание обойтись без временных файлов в незашифрованном виде, то никаких сложностей нет. Рассмотрим на примере jpg файла. Достаточно записать такой файл в зашифрованном виде, используя функцию Write. Это достаточно просто, так как тип VARIANT может хранить массивы байт. В дальнейшем этот массив байт будет возможно непосредственно считать в память и отобразить на экране, не прибегая к временным фалам не диске. Но дело в том, что часто это требует существенной доработки уже существующего программного обеспечения. И проще, по крайней, мере на начальном этапе внедрения системы защиты, за счет некоторого понижения степени надежности, быстро модифицировать уже имеющуюся программу. Эта может быть весьма важным моментом. Как только файл будет отображен на экране, этот временный файл можно тут же стереть.

Описание используемых параметров:

handle - дескриптор файла для чтения.

FileName - имя файла добавляемого в зашифрованное хранилище.

read - возвращает размер прочитанных данных в байтах.

HRESULT ToFile(

[in] short handle,

[in] BSTR FileName,

[out, retval] long *written);

Функция ToFile производит обратное действие относительно FromFile. Она извлекает файл из хранилища.

Описание используемых параметров:

handle - дескриптор файла для чтения.

FileName - имя извлекаемого файла.

written - возвращает размер записанных данных в байтах.

Интерфейс IProtectConformity объединяет набор вспомогательных функций, призванных облегчить использование системы с большим количеством файлов, с алгоритмами и зашифрованными данными. Например, возьмем АРМ преподавателя. В этой системе может быть большое количество различных данных, связанных с определенными студентами. Если эти данные зашифрованы, то необходимо знать, каким именно файлом с алгоритмом это сделано. Все эти взаимосвязи необходимо хранить. В случае, если такая система написана с использованием СУБД, сложностей возникнуть не должно. Если же нет, то придется вносить некоторую дополнительную функциональность, которая является подмножеством возможности СУБД. Чтобы облегчить адаптацию таких проектов, не использующих БД, предназначены функции описываемого интерфейса. Фактически, они позволяют строить и работать с таблицами соответствий. Такая таблица представляет собой набор пар, содержащий имя зашифрованного файла и имя соответствующего файла алгоритма для шифрования или расшифрования. В такой таблице возможен поиск, как по имени зашифрованного файла, так и по имени файла с алгоритмом. В дальнейшем файлы, хранящие информацию о соответствии файлов с данными и соответствующими файлами с алгоритмами, будем называть файлами соответствий. Отметим также, что файлы соответствий тоже подвергаются шифрованию.

interface IProtectConformity : IDispatch

{

[id(1), helpstring("method Create Conformity File")]

HRESULT CreateConformityFile(

[in] BSTR name,

[in] BSTR uptFileNameForRead,

[in] BSTR uptFileNameForWrite,

[in] BSTR ArrayOfStrings);

[id(2), helpstring("method Easy Create Conformity File")]

HRESULT EasyCreateConformityFile(

[in] BSTR name,

[in] BSTR uptFileNameForCreate,

[in] BSTR ArrayOfStrings);

[id(3), helpstring("method Read Conformity File")]

HRESULT ReadConformityFile(

[in] BSTR name,

[in] BSTR uptFileNameForRead,

[out, retval] BSTR *ArrayOfStrings);

[id(4), helpstring("method Get UptAlgName by FileName")]

HRESULT GetAlgName(

[in] BSTR Strings,

[in] BSTR SearchName,

[out, retval] BSTR *ResultStr);

[id(5), helpstring("method Get FileName by UptAlgName")]

HRESULT GetDataName(

[in] BSTR Strings,

[in] BSTR SearchName,

[out, retval] BSTR *ResultStr);

[id(6), helpstring("method Get UptAlgName by FileName From File")]

HRESULT GetAlgFromFile(

[in] BSTR FileName,

[in] BSTR uptFileNameForRead,

[in] BSTR SearchName,

[out, retval] BSTR *ResultStr);

[id(7), helpstring("method Get FileName by UptAlgName From File")]

HRESULT GetDataFromFile(

[in] BSTR FileName,

[in] BSTR uptFileNameForRead,

[in] BSTR SearchName,

[out, retval] BSTR *ResultStr);

};

Теперь опишем каждую из функций интерфейса IProtect.

HRESULT CreateConformityFile(

[in] BSTR name,

[in] BSTR uptFileNameForRead,

[in] BSTR uptFileNameForWrite,

[in] BSTR ArrayOfStrings);

Функция CreateConformityFile создает новый файл соответствий и записывает в него соответствующую таблицу. Таблица предается в виде одной строки, в которой последовательно записаны имена файлов. Все нечетные - имена файлов с данными, все четные - соответствующие алгоритмы шифрования или расшифрования. Имена должны быть заключены в двойные кавычки. Это связано с тем, что иначе невозможно работать с именами файлов, содержащими пробелы. Между кавычкой в конце имени одного файла и кавычкой перед именем второго может стоять произвольное количество пробелов и символов табуляции или возврата каретки и переноса строки. Поддержка одновременного хранения информации как о файлах для шифрования, так и для расшифрования не осуществлена. Это сделано по двум причинам. Во-первых, совсем не сложно завести два файла, а интерфейс функций и их количество существенно сокращается. Во-вторых, данная функциональность соответствия двух файлов может быть применена и для других целей. Хочется сделать ее более абстрактной. Следует дать следующий совет если для шифрования большого количества файлов одним алгоритмом: удобно создать соответствующий каталог, в который помещаются шифруемые файлы, записать в файл соответствий имя этого каталога и соответствующий алгоритм шифрования/расшифрования для работы с файлами в этом каталоге.

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

Описание используемых параметров:

name - имя создаваемого файла, для хранения информации о соответствии.

uptFileNameForRead - имя создаваемого файла с алгоритмом расшифрования.

uptFileNameForWrite - имя создаваемого файла с алгоритмом шифрования.

ArrayOfStrings - строка с информацией о соответствиях.

HRESULT EasyCreateConformityFile(

[in] BSTR name,

[in] BSTR uptFileNameForCreate,

[in] BSTR ArrayOfStrings);

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

name - имя создаваемого файла, для хранения информации о соответствии.

uptFileNameForCreate - имя файла с алгоритмом шифрования.

ArrayOfStrings - строка с информацией о соответствиях.

HRESULT ReadConformityFile(

[in] BSTR name,

[in] BSTR uptFileNameForRead,

[out, retval] BSTR *ArrayOfStrings);

Функция ReadConformityFile читает содержимое файла соответствий и возвращает его в виде строки. Строка имеет тот же формат, что и передаваемая например в функцию CreateConformityFile.

Описание используемых параметров:

name - имя зашифрованного файла c информацией о соответствиях.

uptFileNameForRead - имя файла с алгоритмом расшифрования.

ArrayOfStrings - возвращаемая строка с информацией о соответствиях.

HRESULT GetAlgName(

[in] BSTR Strings,

[in] BSTR SearchName,

[out, retval] BSTR *ResultStr);

Функция GetAlgName, используя имя файла с данными, возвращает соответствующий алгоритм шифрования или расшифрования. Поиск производится в переданной строке. Формат строки эквивалентен формату, с которым работают и другие функции. Например, EasyCreateConformityFile или ReadConformityFile.

Описание используемых параметров:

Strings - строка с информацией о соответствиях.

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

ResultStr - возвращаемое имя файла с алгоритмом.

HRESULT GetDataName(

[in] BSTR Strings,

[in] BSTR SearchName,

[out, retval] BSTR *ResultStr);

Функция GetDataName, используя имя файла с алгоритмом, возвращает имя соответствующего файла с данными. Поиск производится в переданной строке. Формат строки эквивалентен формату, с которым работаю и другие функции. Например EasyCreateConformityFile или ReadConformityFile.

Описание используемых параметров:

Strings - строка с информацией о соответствиях.

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

ResultStr - возвращаемое имя файла с данными.

HRESULT GetAlgFromFile(

[in] BSTR FileName,

[in] BSTR uptFileNameForRead,

[in] BSTR SearchName,

[out, retval] BSTR *ResultStr);

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

Описание используемых параметров:

FileName - имя файла с зашифрованной информацией о соответствиях.

uptFileNameForRead - файл с алгоритмом расшифрования.

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

ResultStr - возвращаемое имя файла с алгоритмом.

HRESULT GetDataFromFile(

[in] BSTR FileName,

[in] BSTR uptFileNameForRead,

[in] BSTR SearchName,

[out, retval] BSTR *ResultStr);

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

Описание используемых параметров:

FileName - имя файла с зашифрованной информацией о соответствиях.

uptFileNameForRead - файл с алгоритмом расшифрования.

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

ResultStr - возвращаемое имя файла с данными.

4.3. Руководство программиста по использованию программы ProtectEXE.exe

Программа ProtectEXE.EXE предназначена для защиты исполняемых файлов от модификации. Под исполняемыми модулями понимаются EXE файлы в формате PE (Portable Executables). Защита исполняемых модулей основана на их шифровании. Особенностью утилиты ProtectEXE является то, что она шифрует каждый исполняемый файл уникальным полиморфным алгоритмом. Это затрудняет возможность использования программного взломщика, основанного на модификации определенных кодов в программе. Поскольку каждый исполняемый файл зашифрован своим методом, то и модифицировать их единым методом невозможно. Утилита ProtectEXE.EXE не позволяет защититься от динамического модифицирования в памяти. Это слишком сложно и не может быть достигнуто без существенной переделки исходного текста самой защищаемой программы. Но в рамках защиты дистанционных средств обучения такая защита должна быть достаточно эффективна, так как создание взламывающей программы экономически мало целесообразно, а следовательно и скорее всего не будет осуществлено.

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

Опишем этап создания зашифрованного файла. Для создания зашифрованного файла необходимо запустить ProtectEXE.EXE, указав в качестве параметра имя шифруемого исполняемого файла. Можно указать не только имя, но и путь. В результате буду сгенерированы два файла. Если было указано только имя, то файлы будут располагаться в текущем каталоге. Если был указан путь к файлу, то сгенерированные файлы будут созданы в том же каталоге, где расположен и шифруемый файл. Первый файл будет иметь расширение upb. Он представляет собой непосредственно зашифрованный исполняемый файл. Второй файл будет иметь расширение upu. Он представляет собой ключ, необходимый для расшифровки исполняемого файла. При разработке ProtectEXE было принято решение хранить зашифрованный файл и ключ для его расшифровке не в едином файле, а раздельно. Это было сделано с целью большей гибкости. Если хранить все в одном файле, это будет означать, что его всегда будет возможно запустить. Раздельное хранение ключа позволяет создавать систему, где запуск определенных программ будет запрещен. Например, программа дистанционного обучения может позволять запускать набор определенных программ только тогда, когда будет выполнен ряд условий. Допустим, после сдачи определенного набора работ. Когда определенные работы будет сданы и защищены, АРМ преподавателя выдает студенту необходимые для дальнейшей работы ключевые файлы. Можно было бы, конечно, выдавать сразу расшифрованный бинарный файл, но программа может быть достаточно большой, и это просто нерационально. И, тем более, тогда нет никаких сложностей скопировать ее другому студенту, которому она еще не должна быть выдана.

Теперь опишем второй режим работы. Это непосредственно запуск зашифрованного модуля. Для его запуска необходимо запустить ProtectEXE, указав в качестве параметра путь и имя зашифрованного файла с расширением upb. Если будет найден ключевой файл с тем же именем, но с расширением upu, то программа будет запущена. При этом будет создан временный файл с расширением exe. Он будет располагаться в том же каталоге, где нахолодятся фалы с расширением upb и upu. Этот файл является временным и будет удален после завершения работы программы. Данный файл, хоть и носит расширение exe, не является исполняемым файлом. В чем можно убедиться, попытавшись запустить его. Результатом будет его зависание. Поэтому не следует бояться, что это расшифрованный файл, и студент сможет скопировать его, когда он будет создан.

4.4. Описание использования системы защиты на примерах

4.4.1. Подключение модуля защиты к программе на языке Visual C++

Распишем шаги, которые наобходимо проделать, чтобы подключить COM модуль Uniprot к программе, написанной на Visual C++.

1. Создайте новый или откройте уже существующий проект.

2. Создайте новую папку в каталоге с проекта или выберете уже существующую и скопируйте в нее необходимые для подключения библиотеки файлы. Это файлы: export.h, export.cpp, Uniprot.tlb.

3. Откройте MFC ClassWizard. Для этого выбирете в меню пункт
View->ClassWizard.

4. Нажмите на кнопку Add Class и выберете пункт "From a type library…".

5. Укажите путь к файлу Uniprot.tlb и откройте его.

6. В диалоге Confirm Classes вам скорее всего будет достаточно сразу нажать кнопку "Ok". Но если вы не согласны с продложенными установками по умолчанию, то можете внести в них соответсвующие изменения.

7. Закройте диалог MFC ClassWizard.

8. Включите в проект файлы export.h, export.cpp.

9. Добавить include "export.h" в те модуле, где вы планируете использовать библиотеку Uniprot.

10. Проверьте, что у вас инициализируется работа с COM. То есть вызывается функция CoInitialize.

11. Теперь вы можете работать с библиотекой COM например так.

IProtect ProtectObj;

IProtectFile ProtectFileObj;

ProtectObj.CreateDispatch(UniprotLibID);

ProtectFileObj.CreateDispatch(UniprotLibID);

LPDISPATCH pDisp = ProtectFileObj.m_lpDispatch;

HRESULT hr = pDisp ->QueryInterface(

IProtectFileIntarfaceID,

(void**)&ProtectFileObj.m_lpDispatch);

VERIFY(hr == S_OK);

4.4.2. Подключение модуля защиты к программе на языке Visual Basic

Распишем шаги, которые наобходимо проделать, чтобы подключить COM модуль Uniprot к программе, написанной на Visual Basic.

12. Создайте новый или откройте уже существующий проект.

13. Создайте новую папку в каталоге с проекта или выберете уже существующую и скопируйте в нее необходимый для подключения библиотеки файл. Это файл: Uniprot.tlb.

14. Откройте диалог References. Для этого выбирете в меню пункт
Project->References.

15. Нажмите кнопку Browse.

16. Укажите файл Uniprot.tlb и откройте его.

17. Поставьте в списке галочку напротив появившейся строки Uniprot 1.0 Type Library и нажмите Ok.

18. Теперь вы можете работать с библиотекой COM например так.

Dim handle As Integer

Dim obj As New protect

Dim ver As Integer

Dim strInfo As String

obj.GetInfo ver, strInfo

Dim s As String

s = "Version:" + Str(ver / 256) + "." +

Str((ver Mod 256) / 16) + Str(ver Mod 16)

s = s + Chr(13) + "Info:" + strInfo

MsgBox s

Dim file As IProtectFile

Set file = obj

handle = file.Create(FileName, Default, cryptUPT)

4.4.3. Пример использования модуля защиты в программе на языке Visual Basic

Рассмотрим несколько демонстрационных программах. Представим, что у нас существует комплекс, состоящий из двух частей. Первая из которых предназначена для преподавателя, а другая - для студента. В дальнейшем будем называть их соответственно "АРМ преподавателя" и "АРМ студента". АРМ преподавателя предназначена для составления вопросов и просмотра результатов тестирования. А АРМ студента предназначена для контроля знаний. Естественно, примеры данных программ будут очень упрощены.

Для начала приведем текст программы АРМ преподавателя без использования защиты. На рисунке 8 показан ее пользовательский интерфейс.

Private Sub Edit_Click()

orm1.ole_doc.DoVerb

End Sub

Private Sub Form_Load()

Form1.ole_doc.Format = "Rich Text Format"

End Sub

Private Sub Load_Click()

Open "c:\temp\temp.rtf" For Input As #1

Dim str, tmp

Do While Not EOF(1)

Input #1, tmp

str = str + tmp

Loop

Close #1

Form1.ole_doc.DoVerb vbOLEDiscardUndoState

Form1.ole_doc.DataText = str

Form1.ole_doc.Update

End Sub

Private Sub Save_Click()

Dim msg

Form1.ole_doc.DoVerb vbOLEDiscardUndoState

msg = Form1.ole_doc.DataText

Open "c:\temp\temp.rtf" For Output As #1

Print #1, msg

Close #1

End Sub

Private Sub ViewResult_Click()

Open "c:\temp\result.txt" For Input As #1

Dim n As Integer

Input #1, n

Close #1

result = n

End Sub

Рисунок 8. Интерфейс АРМ преподавателя

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

Private Sub SaveResult(a)

Open "c:\temp\result.txt" For Output As #1

Print #1, a

Close #1

End

End Sub

Private Sub Command1_Click(Index As Integer)

SaveResult (2)

End Sub

Private Sub Command2_Click()

SaveResult (2)

End Sub

Private Sub Command3_Click()

SaveResult (5)

End Sub

Private Sub Command4_Click()

SaveResult (2)

End Sub

Private Sub Form_Load()

Form1.ole_doc.Format = "Rich Text Format"

Open "c:\temp\temp.rtf" For Input As #1

Dim str, tmp

Do While Not EOF(1)

Input #1, tmp

str = str + tmp

Loop

Close #1

Form1.ole_doc.DoVerb vbOLEDiscardUndoState

Form1.ole_doc.DataText = str

Form1.ole_doc.Update

End Sub

Рисунок 9. Интерфейс АРМ студента

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

Рисунок 10. Файл с незашифрованным результатом

Естественно, такая система не выдерживает никакой критики с точки зрения защиты. Во-первых, файл с вопросом представляет из себя простой RTF-файл. Конечно, если эти файлы будут храниться в защищенной базе, то проблем не возникнет. Мы же предполагаем, что пока они хранятся открыто. Предположим, что таких файлов много, и недопустимо, чтобы студент имел к ним доступ. Соответственно, это одно из мест, где потребуется модуль защиты. Второе, пожалуй, еще более важное место - это файл с результатом. На данный момент это просто текстовый файл, с числом, обозначающий оценку. Хранение результата в таком виде как просто, так и недопустимо.

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

Кнопка "Сгенерировать пакет" генерирует 4 алгоритма. Первая пара алгоритмов шифрования/расшифрования используется для записи/чтения файла с вопросом. При этом студенту достаточно отдать только файл с алгоритмом расшифрования. Вторая пара используется при работе с файлом, содержащим результат тестирования. Алгоритм шифрования предназначен для АРМ студента. Алгоритм расшифрования относится к АРМ преподавателя и служи для расшифрования этого файла. Передача студенту только некоторых алгоритмов повышает надежность защиты.

Новый интерфейс АРМ преподавателя изображен на рисунке 11.

Рисунок 11. Новый интерфейс АРМ преподавателя

Рассмотрим, какие изменения понадобилось внести в программу. Их совсем не много. Добавилась глобальная перемеренная obj. Она предназначена для взаимодействия с COM-модулем. Глобальной она быть совсем не обязана, просто это было сделано для краткости программы. Типом этой переменный является указатель на интерфейс IProtect. Но использовать этот интерфейс для шифрования/расшифрования не представляется возможным. Поэтому, в дальнейшем obj будем преобразовывать этот указатель к указателю на интерфейс IProtectFile.

Dim obj As New protect

Private Sub Edit_Click()

Form1.ole_doc.DoVerb

End Sub

Private Sub Form_Load()

Form1.ole_doc.Format = "Rich Text Format"

End Sub

Данная подпрограмма предназначена для генерации 4 алгоритмов шифрования/расшифрования. Для простоты она записываются во временную папку. Причем, генерируемые алгоритмы будут ограничены в использовании по времени. Файл "c:\temp\crypt.upt" и "c:\temp\decrypt.upt" предназначены для работы с файлом содержащим вопрос. Файл "c:\temp\cryptres.upt" и "c:\temp\decryptres.upt" предназначены для работы с фалом результата. Следовательно для работы АРМ-преподавателя необходимы файлы "c:\temp\crypt.upt" , "c:\temp\decrypt.upt" и "c:\temp\decryptres.upt". А для АРМ-студента необходимы файлы "c:\temp\decrypt.upt", "c:\temp\cryptres.upt".

Private Sub Generate_Click()

Dim days As Integer

days = DaysLimit

obj.GenerateTimeLimitUPTfiles "c:\temp\crypt.upt", "c:\temp\decrypt.upt", days

obj.GenerateTimeLimitUPTfiles "c:\temp\cryptres.upt", "c:\temp\decryptres.upt", days

End Sub

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

Private Sub Import_Click()

Open "c:\temp\temp.rtf" For Input As #1

Dim str, tmp

Do While Not EOF(1)

Input #1, tmp

str = str + tmp

Loop

Close #1

Form1.ole_doc.DoVerb vbOLEDiscardUndoState

Form1.ole_doc.DataText = str

Form1.ole_doc.Update

End Sub

Вот новая подпрограмма чтения текста вопроса из файла. Дадим комментарии к некоторым строчкам.

Dim file As IProtectFile - объявляет указатель на интерфейс IProtectFile, который позволяет шифровать/расшифровывать файлы.

handle = file.Open("c:\temp\temp.dat", "c:\temp\decrypt.upt", "c:\temp\crypt.upt") - открываем файл с вопросом и сохраняем дескриптор открытого файла.

readSize = file.Read(handle, v) - читаем переменную типа Variant, которая на самом деле будет представлять из себя строку.

file.Close (handle) - закрывает файл.

Private Sub Load_Click()

Dim handle As Integer

Dim file As IProtectFile

Set file = obj

handle = file.Open("c:\temp\temp.dat", "c:\temp\decrypt.upt", "c:\temp\crypt.upt")

Dim readSize As Long

Dim v As Variant

readSize = file.Read(handle, v)

Dim str As String

str = v

Form1.ole_doc.DoVerb vbOLEDiscardUndoState

Form1.ole_doc.DataText = str

Form1.ole_doc.Update

file.Close (handle)

End Sub

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

Private Sub Save_Click()

Dim handle As Integer

Dim file As IProtectFile

Set file = obj

handle = file.Create("c:\temp\temp.dat", Default, "c:\temp\crypt.upt")

Dim writeSize As Long

Dim v As Variant

Dim str As String

str = Form1.ole_doc.DataText

v = str

writeSize = file.Write(handle, v)

file.Close (handle)

End Sub

И последнее, это новая подпрограмма чтения файлов с результатом тестирования.

Private Sub ViewResult_Click()

Dim handle As Integer

Dim file As IProtectFile

Set file = obj

handle = file.Open("c:\temp\result.dat", "c:\temp\decryptres.upt", "c:\temp\cryptres.upt")

Dim readSize As Long

Dim v As Variant

readSize = file.Read(handle, v)

Dim str As String

result = v

file.Close (handle)

End Sub

Внешний вид АРМ студента не изменился. Приведем только текст программы.

Dim obj As New protect

Private Sub SaveResult(a)

Dim handle As Integer

Dim file As IProtectFile

Set file = obj

handle = file.Create("c:\temp\result.dat", Default, "c:\temp\cryptres.upt")

Dim writeSize As Long

Dim v As Variant

Dim str As String

str = Form1.ole_doc.DataText

v = a

writeSize = file.Write(handle, v)

file.Close (handle)

End

End Sub

Private Sub Command1_Click(Index As Integer)

SaveResult (2)

End Sub

Private Sub Command2_Click()

SaveResult (2)

End Sub

Private Sub Command3_Click()

SaveResult (5)

End Sub

Private Sub Command4_Click()

SaveResult (2)

End Sub

Private Sub Form_Load()

Form1.ole_doc.Format = "Rich Text Format"

Dim handle As Integer

Dim file As IProtectFile

Set file = obj

handle = file.Open("c:\temp\temp.dat", "c:\temp\decrypt.upt", "c:\temp\crypt.upt")

Dim readSize As Long

Dim v As Variant

readSize = file.Read(handle, v)

Dim str As String

str = v

Form1.ole_doc.DoVerb vbOLEDiscardUndoState

Form1.ole_doc.DataText = str

Form1.ole_doc.Update

file.Close (handle)

End Sub

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

Рисунок 12. Файл с зашифрованным результатом

4.4.4. Пример использования программы ProtectEXE.exe

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

void CreateEncryptedModule(const CString &FileName)

{

CString Line(_T("ProtectExe.exe "));

Line += FileName;

STARTUPINFO StartupInfo;

memset(&StartupInfo, 0, sizeof(StartupInfo));

StartupInfo.cb = sizeof(StartupInfo);

PROCESS_INFORMATION ProcessInformation;

if (!CreateProcess(Line, NULL, NULL, NULL, FALSE, 0,

FALSE, NULL, &StartupInfo,

&ProcessInformation))

throw _T("Error run ProtectExe.exe");

WaitForInputIdle(ProcessInformation.hProcess,

INFINITE);

WaitForSingleObject(ProcessInformation.hProcess,

INFINITE);

CloseHandle(ProcessInformation.hProcess);

DeleteFile(FileName);

}

void RunEncryptedModule(const CString &FileName)

{

CString EncryptedFileName(FileName);

EncryptedFileName = EncryptedFileName.Mid(0, FileName.GetLength() - 3);

EncryptedFileName +=_T("upb");

CString Line(_T("ProtectExe.exe"));

Line += EncryptedFileName;

STARTUPINFO StartupInfo;

memset(&StartupInfo, 0, sizeof(StartupInfo));

StartupInfo.cb = sizeof(StartupInfo);

PROCESS_INFORMATION ProcessInformation;

if (!CreateProcess(Line, NULL, NULL, NULL, FALSE, 0,

FALSE, NULL, &StartupInfo, &ProcessInformation))

throw _T("Error run ProtectExe.exe");

WaitForInputIdle(ProcessInformation.hProcess, INFINITE);

WaitForSingleObject(ProcessInformation.hProcess, INFINITE);

CloseHandle(ProcessInformation.hProcess);

}

4.5. Общие рекомендации по интеграции системы защиты

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

1. Перед началом работ по модификации существующего программного обеспечения с целью интеграции системы защиты рекомендуется тщательно ознакомиться с приведенной документацией и с примерами по использованию различных функций. Также необходимым требованием перед началом работ, является базовые навыки работы с технологией COM. Если вы не знакомы с технологией COM, то здесь можно порекомендовать в качестве литературы по данной теме следующие книги: Модель COM и применение ATL 3.0 [31], Сущность технологии COM. [33], Programming Distributed Applications with COM and Microsoft Visual Basic 6.0 [34].

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

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

4. Еще одной из рекомендаций будет создание системного журнала. По этому поводу рекомендуется ознакомиться со статьей Оганесяна А. Г. " Проблема «шпаргалок» или как обеспечить объективность компьютерного тестирования?" [28].

5. Создавая АСДО, позаботьтесь о дублировании информации. В противном случае, уничтожение, например, базы с данными о сданных работах может иметь весьма тяжелые последствия. Это - совет не относится к защите информации, но может помочь весьма повысить надежность системы в целом.

ОСНОВНЫЕ ВЫВОДЫ И РЕЗУЛЬТАТЫ

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

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

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

4. Разработана система защиты, руководство для программиста, набор тестовых примеров и рекомендации по ее применению. Созданная система была интегрирована в уже существующий комплекс Aquarius Education 4.0, разработанный на кафедре АТМ.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Аунапу Т.Ф., Веронская М.В. Автоматизация обучения с позиций системного анализа // Управление качеством высшего образования в условиях многоуровневой подготовки специалистов и внедрения образовательных стандартов: Тез. докладов республиканской научно-методической конферен-ции. -- Барнаул: Алт. гос. техн. ун-т, 1996. -- С. 5 -- 6. д

2. Брусенцов Н.П., Маслов С.П., Рамиль Альварес X. Микроко-мпьютерная система «Наставник». -- М.: Наука, 1990. -- 224 с.

3. Кондратова О.А. Психологические требования к проектированию компьютерных учебных средств и систем обучения // Проблемы гуманизации и новые методы обучения в системе инженерного образования: Тез. докл. межвузовской научно-практической конференции. -- Новокузнецк: Сиб. Гос. горно-металлургическая академия, 1995. -- С. 78 -- 80.

4. Федеральная целевая программа «Развитие единой образовательной информационной среды на 2002 -- 2006 годы» (проект). -- М.: Миноб-разования, 2001. -- 35 с.

5. Кручинин В.В., Ситникова Е.А. Проблема защиты компьютерных экзаменационных программ в ТМЦ ДО // Современное образование: массовость и качество. Тез. докл. региональной научно-методической конференции. -- Томск: ТУСУР, 2001. -- С. 144.

6. Махутов Б.Н., Шевелев М.Ю. Защита электронных учебников в дистанционном обучении // Образование XXI века: инновационные технологии, диагностика и управление в условиях информатизации и гуманизации: Материалы III Всероссийской научно-методической конференции с международным участием. -- Красноярск: КГПУ, 2001. -- С. 106 -- 108.

7. Раводин О.М. Проблемы создания системы дистанционного образования в ТУСУРе // Дистанционное образование. Состояние, проблемы, перспективы. Тез. докл. научно- методической конференции, Томск, 19 ноября Э 1997 г. -- Томск: ТУ СУР, 1997. -- С. 19 -- 25.

8. Шевелев М.Ю. Автоматизированный внешний контроль самосто-ятельной работы студентов в системе дистанционного образования /У Дистанционно образование. Состояние, проблемы, перспективы. Тез. докл. научно-методической конференции. -- Томск: ТУСУР, 1997. -- С. 49.

9. Шевелев М.Ю. Прибор для дихотомической оценки семантических сообщений в автоматизированных обучающих системах // Современные техника и технологии. Сб. статей международной научно-практической конференции. -- Томск: ТПУ, 2000. -- С. 152.

10. Шевелев М.Ю. Программно-аппаратная система контроля и защиты информации // Современное образование: массовость и качество. Тез. докл. научно-методической конференции 1-2 февраля 2001 г. -- Томск: ТУСУР, 2001.--С. 99--100.

11. Шелупанов А.А., Пряхин А.В. Анализ проблемы информации в системе дистанционного образования // Современное образование: массовость и качество. Тез. докл. региональной научно-методической конференции. -- Томск: ТУ СУР, 2001. -- С. 159 -- 161.

12. Кацман Ю.Я. Применение компьютерных технологий при дистанционном обучении студентов // Тез. докладов региональной научно методической конференции "Современное образование: массовость и качество". - Томск: ТУСУР, 2001. - С.170 - 171.

13. Пресс-группа СГУ. Компьютер-экзаменатор. // Электронный еженедельник "Закон. Финансы. Налоги." - 2000. - № 11 (77).

14. Белокрылова О.С. Использование курса дистанционного обучения на экономическом факультете РГУ // Cовременные информационные технологии в учебном процессе: Тез. докл. Учебно-методическая конференция. - Апрель 2000.

15. Алешин С.В. Принципы построения оболочки информационно - образовательной среды CHOPIN // Новые информационные технологии : Тез. докл. Восьмая международная студенческая школа семинар. - Крым: Алтайский государственный технический университет, Май 2000.

16. Оганесян А.Г. Проблема обратной связи при дистанционном обучении // Открытое образование. - 2002. - март.

17. Занимонец Ю.М., Зинькова Ж.Г. Проведение всероссийского компьютерного тестирования "Телетестинг-2000" в Ростовском госуниверсите // Современные информационные технологии в учебном процессе : Тез. докл. Учебно-методическая конференция. - 2000. - апрель.

18. Сенцов, В.С. Программный комплекс тестового контроля знаний «Тест» // Новые информационные технологии: Тез. докл. Восьмая международная студенческая школа семинар. - Крым: Алтайский государственный технический университет, Май 2000.

19. Мицель. А.А. Автоматизированная система разработки электронных учебников // Открытое образование. - 2001. - май.

20. Жолобов Д.А. Генератор мультимедиа учебников // Новые информационные технологии: Тез. докл. Восьмая международная студенческая школа семинар. - Крым: Астраханский государственный технический университет, Май 2000.

21. Вергазов Р. И., Гудков П. А. Система автоматизированного дистанционного тестирования // Новые информационные технологии: Тез. докл. Восьмая международная студенческая школа семинар. - Крым: Пензенский государственный университет, Май 2000.

22. Ложников П. С. Распознавание пользователей в системах дистанционного образования: обзор // Educational Technology & Society. - 2001. - № 4, http://ifets.ieee.org/russian/depository/v4_i2/html/4.html

23. Расторгуев С.П., Долгин А.Е., Потанин М.Ю. Как защитить информацию // Электронное пособие по борьбе с хакерами. http://kiev-security.org.ua

24. Ерижоков А.А. Использование VMWare 2.0 // Публикация в сети ИНТЕРНЕТ на сервере http://www.citforum.ru/operating_systems/vmware/index.shtml.

25. Баpичев С. Kpиптогpафия без секретов. - М.: Наука, 1998. - 105 с.

26. Маутов Б.Н. Защита электронных учебников на основе программно-аппаратного комплекса "Символ-КОМ" // Открытое образование. - 2001. - апрель.

27. Тыщенко О.Б. Новое средство компьютерного обучения - электронный учебник // Компьютеры в учебном процессе. - 1999. - № 10. - С. 89-92.

28. Оганесян А. Г., Ермакова Н. А., Чабан К. О. Проблема «шпаргалок» или как обеспечить объективность компьютерного тестирования? // «Львіська політехніка». - 2001. - № 6. Публикация в сети ИНТЕРНЕТ на сервере http://www.mesi.ru/joe/N6_00/oga.html.

29. Романенко В.В. Автоматизированная система разработки электронных учебников. // Новые информационные технологии в университетском образовании: Тез. докл. Материалы седьмой Международной Научно-Методической конференции. - Томск: Томский Государственный Университет Систем Управления и Радиоэлектроники, Март 2000.

30. Касперский Е.В. Компьютерные вирусы: что это такое и как с ними бороться. - М.: СК Пресс, 1998. - 288 с., ил.

31. Трельсон Э. Модель COM и применение ATL 3.0: Пер. с англ. - СПб. БХВ-Петербург, 2001. - 928 с. ил.

32. Баричев С. Г. и др. «Основы современной криптографии». - М.: «Горячая линия -Телеком», 2001 - 120 с.

33. Бокс. Д. Сущность технологии COM. Библиотека программиста. - СПб.: Питер, 2001. - 400 с.: ил.

34. Ted Pattison. Programming Distributed Applications with COM and Microsoft Visual Basic 6.0. - Microsoft Press, 1998. - 260 c. ISBN 1-57231-961-5


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

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

    лабораторная работа [24,3 K], добавлен 20.02.2014

  • Основные способы криптографии, история ее развития. Принцип шифрования заменой символов, полиалфавитной подстановкой и методом перестановки. Симметричный алгоритм шифрования (DES). Открытое распределение ключей. Шифры Ривеста-Шамира-Алдемана и Эль Гамаля.

    реферат [39,3 K], добавлен 22.11.2013

  • Понятие объектно-ориентированного программирования, характеристика используемых языков. Практическая разработка средств объектно-ориентированного программирования в задачах защиты информации: программная реализация на языке С++, а также Turbo Pascal.

    курсовая работа [275,9 K], добавлен 22.12.2011

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

    контрольная работа [25,5 K], добавлен 12.07.2014

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

    реферат [43,6 K], добавлен 22.05.2013

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

    контрольная работа [3,2 M], добавлен 30.11.2013

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

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

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

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

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

    реферат [17,4 K], добавлен 16.05.2015

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

    курсовая работа [371,2 K], добавлен 07.08.2012

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