Читайте также:
|
|
Преимущества и недостатки существующего программного обеспечения.
В данный момент рынок ПО для отдела кадров развит достаточно сильно. На рынке представлены как глобальные продукты для автоматизации информационных процессов («Отдел Кадров Плюс 2012», «Кадры SB»), так и малозначимые продукты с существенно урезанным функционалом («Отдел кадров 6.0»).
Рассмотрим основные возможности данных продуктов, их главные отличия друг от друга. Выявим их основные недостатки для построения необходимой модели программного обеспечения для отдела кадров федеральной службы исполнения наказаний.
Описание программы «Отдел Кадров Плюс 2012»:
Программа позволяет значительно повысить скорость и эффективность работы отдела кадров и автоматизировать кадровый документооборот. Эффект от использования программы в работе отдела кадров высок для предприятий с различной численностью сотрудников. Внедрение программы существенно снижает время, необходимое на обработку информации и оформление кадровых приказов и документов.
Рис.2 – «Главное окно работы программы «Отдел Кадров Плюс 2012»
Преимущества программы «Отдела Кадров Плюс 2012»:
1) Не требуется дополнительного аппаратного обеспечения;
2) Не требуется дополнительного программного обеспечения;
3) Не требуется специального обучения пользователя;
4) Возможность кадрового учета неограниченного количества организаций в одной программе;
5) Нет ограничений по времени использования лицензии на программу;
6) Установка программы не более чем за 1 минуту;
7) Совместимость с MS Office и Open Office;
8) Опыт разработки ПО с 2000 года;
Рис. 3 – «Формирование отчётов в программе «Отдел Кадров2012 Плюс»
Возможности программы «Отдела Кадров Плюс 2012»:
1) Сохранение приказов и отчетов в редактируемых форматах XLS и DOC (MS Office);
2) Совместимость с Open Office;
3) Возможность обмена персональными данными по сотруднику с 1С;
4) Возможность загрузки данных по сотруднику в базу данных программы из Excel (и обратно);
5) Гибкое штатное расписание:
- без ограничений уровней вложенностей
- возможность включения филиалов с собственной структурой и реквизитами;
6) Возможность кадрового учета неограниченного количества организаций водной программе;
7) График отпусков;
8) Возможность хранения внутри программы внешних документов в различных форматах (Word, Excel, изображения и т.д.).
Например: трудовой договор, должностные инструкции.
Количество документов не ограничено.
9) Табель учета рабочего времени. Автоматически формируется на основании существующих приказов по сотруднику и его графика работы. С удобным интерфейсом редактирования и ввода отработанных часов.
10) Формируются печатные формы Т-12 и Т-13;
11) Возможность редактирования табеля сразу по подразделению или всей
организации;
12) Все изменения внесенные в табель сразу отражаются в документообороте в виде соответствующих приказов;
13) Удобный, структурированный журнал приказов;
14) Хранение информации о кандидатах и уволенных сотрудников;
15) Возможность приема нескольких сотрудников по различным ставкам на одну штатную единицу;
16) Возможность работы одного сотрудника на различных должностях в рамках одной организации на различных ставках.
Стоимость данного продукта составляет около 10 т.р. для бессрочного использования. Данный продукт располагается на рынке с 2000г., что говорит о его достаточно развитом и проверенным временем функционале и стабильности. Основным достоинство данного продукта является то, что существует взаимодействие с открытым программным обеспечением OpenOffice и есть возможность управления отделами кадров нескольких организаций.
Рассмотрим основного конкурента на рынке программного обеспечения для отела кадров – продукт «Кадры SB». Данная программа разрабатывается с 2010 года, за это время вышло 4 версии данного программного обеспечения.
Рис. 4 – «Главное окно программы «Кадры SB»
Возможности программы «Кадры SB»
1) Полный кадровый учет:
v ведение личных карточек сотрудников
v сведения о работе
v состав семьи
v расчет выслуги лет
v учет отпусков, отгулов, назначений и перемещений, поощрения, нарушения
v образование, после вузовское образование, повышение квалификации, аттестация, профессиональная переподготовка
v льготы, материальная помощь
2) Генератор документов, позволяющий формировать любые нестандартные документы (например, трудовой договор).
3) Неограниченное число уровней подразделений и отделов (можно использовать одну базу данных для головного предприятия и его филиалов).
4) Учет вакансий и претендентов на должности.
5) Учет листков нетрудоспособности (Больничных листов). Формирование любых отчетов (реестров) по больничным листам в MS Excel.
6) Формирование приказов и записок соответствующих форм, утвержденных постановлением Госкомстата России от 05.01.2004 № 1. (MS Word и Excel)
7) Формирование любых отчетов по персоналу. (MS Word и Excel).
8) Возможность самостоятельно формировать любые отчеты при помощи SQL-запросов.
9) Возможность использования в программе КЛАДР (Классификатор адресов России).
10) Возможность экспорта базы данных программы "Кадры SB" в другие форматы БД (Пункт меню "Файл->Экспорт"):
v MS Access из комплекта MS Office версии 2000, XP, 2003;
v Dbase;
v Файл БД csv;
v ASCII;
v Paradox.
11) Возможность работы нескольких пользователей одновременно (сетевая версия).
12) Возможность ведения баз данных нескольких юридических лиц с одного рабочего места (сетевая версия).
13) Управление правами пользователей для работы в данной программе.
14) Учет трудовых книг и расчет любых видов стажей.
15) Штатное расписание. Возможность формирования штатного расписания отдельно по отделам, подразделениям (Excel).
16) Интеллектуальный мастер устройства на работу, перевода сотрудника на другую должность и увольнения сотрудника.
17) Приятный внешний интерфейс под XP с индивидуальными настройками.
18) Будильник, дни рождения, органайзер и многое другое.
Рис. 5 – «Заполнение личных данных в программе «Кадры SB»
Стоимость данного продукта составляет 15 т.р. для сетевой версии до 5 работников отдела кадров. Основным достоинством данного продукта является наличие генератора документов нестандартной формы, позволяющий хранить любой документ любого произвольного содержания.
Третий, наименее используемый продукт «Отдел Кадров 6.0» обладает достаточно скромным функционалом, что, скорее всего, связано с относительно недавней разработкой.
Рис. 6 –«Заполнение карточки сотрудника в «Отделе Кадров 6.0»
Описание возможностей программы Отдел кадров 2012:
1) Автоматическое составление кадровых документов (в программе используются новейшие бланки документов, утверждённые постановлением Госкомстата России от 05.01.2004 г. № 1).
2) Сохранение приказов и отчетов в форматах XLS, DOC или ODT, ODS (независимо от того, установлен у Вас Microsoft Office или Open Office).
3) Автоматическое составление штатного расписания по форме Т-3 на основе базы данных по сотрудникам. Штатное расписание имеет гибкую структуру без ограничения уровней вложенности подразделений с возможностью включения филиалов с собственной структурой.
4) Автоматическое формирование табеля учёта рабочего времени по формам Т-12 и Т-13. Табель учета рабочего времени автоматически формируется на основании существующих приказов по сотруднику и графику его работы. Табель имеет удобный интерфейс редактирования и ввода отработанных часов. Все изменения, внесённые в табель, автоматически отражаются в документообороте в виде соответствующих приказов.
5) Автоматическое составление личной карточки по форме Т-2 и хранение её в электронном виде в базе данных.
6) Автоматическое составление графика отпусков по форме Т-7
7) Автоматическое составление журнала приказов и ведение электронного архива приказов.
8) Расчёт общего, непрерывного стажа, а также стажа работы на данном предприятии.
9) Импорт и экспорт данных по сотрудникам из программ 1С (Бухгалтерия, Зарплата и Кадры, Комплексная и т.д.).
10) Возможность подключать классификаторы (КЛАДР, ОКИН, ОКСО, ОКПДТР).
11) Возможность приёма нескольких сотрудников с различными ставками на одну штатную единицу.
12) Возможность работы одного сотрудника на различных должностях в рамках одной организации на различных ставках.
13) Возможность хранения в программе ссылок на внешние документы в различных форматах (Word, Excel, изображения и т.д.)
14) Возможность кадрового учета неограниченного количества организаций в одной программе.
15) Расчёт среднесписочной численности сотрудников за любой период.
16) Хранение в базе фотографий сотрудников.
17) Формирование произвольных отчётов на основе информации базы данных (пользователь сам выбирает поля базы данных, которые необходимы ему для отображения в отчёте) с возможностью экспорта в формат Word и Excel.
18) Работа программы в локальной сети (сетевая версия).
19) Напоминание об окончании испытательного срока у сотрудников.
20) Формирование отчёта по движению численности сотрудников за любой период.
21) Экспорт анкетных данных в формат Пенсионного Фонда на дискету (анкетные данные экспортируются из базы по сотрудникам, таким образом нет необходимости заново набирать эти данные) и распечатка всех сопутствующих документов (анкета застрахованного лица - форма АДВ-1, опись пачки анкет и опись пачки документов - форма АДВ - 6).
22) Формирование стандартных отчётов (список сотрудников, список сотрудников по отделам, список вакантных мест, список детей сотрудников, список военнообязанных, список уволенных, список женщин, список мужчин).
23) Учёт командировок, отпусков и поощрений.
24) Ведение статистики по предприятию (количество сотрудников, количество вакантных мест, средний оклад, средний возраст).
25) Автоматическое напоминание о днях рождения сотрудников.
26) Удобный поиск в базе
27) Хранение в базе данных вакантных должностей предприятия.
28) Хранение в архиве базы данных информации об уволенных сотрудниках.
Рис. 7 – «Основной интерфейс программы «Отдел кадров 6.0»
Достаточно широкий функционал данной программы выражается в неудобном и тёмном пользовательском интерфейсе.
Основным недостатком программы является отсутствие должной защиты базы данных от несанкционированного доступа. Программа не требует строгой аутентификации пользователей, например, на основе электронных носителей (token) или биометрических данных. Также существует достаточное количество отзывов о плохой стабильности программы при больших нагрузках.
Все проанализированные программы имеют несколько существенных недостатков, среди которых:
1) Отсутствие шифрования базы данных;
2) Отсутствие взаимодействия с электронными носителями Token;
3) Излишний функционал, мешающий или путающий работников отдела кадров.
Поэтому было решено разработать собственную модель программного обеспечения, которая бы исправляла основные недостатки этих программ, была просто в использовании.
ГЛАВА 3. Теоретическая реализация модели программного обеспечения для отдела кадров
Для начала разработки модели выделим основные компоненты программы, которые понадобятся в работе сотрудников отдела кадров:
1) Чёткая структурированность данных, все данные упорядочены в какой либо известной последовательности;
2) Простота в использовании для сотрудников отдела кадров;
3) Присутствие необходимого функционала;
4) Защита базы данных от несанкционированного доступа;
5) Авторизация с помощью логина и пароля;
6) Дополнительная аутентификация на основе электронного носителя;
7) Разграничение прав доступа.
Рассмотрим подробнее каждый описанный пункт новой модели программного обеспечения.
Структурированные данные – это данные, которые состоят из других типов данных. К ним относятся массивы, строковые величины, данные типа запись, данные типа файл. В данном случае нам будут необходимы файловые данные, содержащие фото или заявления, строковые величины, содержащие ФИО и другие переменные. Все эти данные должны храниться в базе данных и вызываться по первому требованию.
Простота в использовании обусловлена необходимостью в быстрой обработке поступающих данных, их лёгкое извлечение из базы данных и мгновенная распечатка необходимых документов.
Защита базы данных от несанкционированного доступа должна осуществляться за счёт полного или частичного шифрования, как самой базы данных, так и хранимых и обрабатываемых документов. Для этого можно ввести криптозащиту на основе симметричного алгоритма блочного шифрования AES.
В настоящее время криптостойкость алгоритма шифрования играет важную роль. Ведь всё чаще появляется необходимость безопасно передать секретные данные. Но в условиях большого разнообразия шифров трудно выявить наиболее надёжный. Почти все современные алгоритмы шифрования базируются на принципе Кирхгофа, который заключается в том, что секретность шифра обеспечивается секретностью ключа, а не секретностью самого алгоритма шифрования. Стойкость криптосистемы зависит от длины ключа, сложности алгоритмов преобразования, от объёма ключевого пространства, метода реализации (например, при программной реализации нужно обязательно защищаться от разрушающих программных воздействий). Поэтому в настоящее время криптоалгоритмы должны соответствовать высоким требованиям надёжности и криптостойкости. Одним из таких алгоритмов является алгоритм Rijndael (AES).
В июне 2003 года Агентство национальной безопасности США постановило, что шифр AES является достаточно надёжным, чтобы использовать его для защиты сведений, составляющих государственную тайну. Вплоть до уровня SECRET было разрешено использовать ключи длиной 128 бит, для уровня TOP SECRET требовались ключи длиной 192 и 256 бит.
Авторизация на основе рабочей пары – логин и пароль позволяет существенно замедлить попытки несанкционированной авторизации при условии, что оба параметра неизвестны. В то время как аутентификации на основе пароля даёт больший шанс для успешного подбора ключа злоумышленником.
Рис. 7 – «Пример авторизации программы по паре логин-пароль»
Дополнительная аутентификация на основе электронного носителя исключает запуск приложения на компьютере, в котором отсутствует необходимый e-token. Таким образом, исключается успешная атака кражи системных файлов приложения или самой базы данных. Злоумышленник не сможет пройти авторизацию без нужного электронного носителя.
Токен (аппаратный токен, USB-токен, криптографический токен) — физическое устройство, используемое для упрощения аутентификации.
Токены предназначены для электронного удостоверения личности (например, клиента, получающего доступ к банковскому счёту), при этом они могут использоваться как вместо, или так и вместе с паролем. В некотором смысле токен — это электронный ключ для доступа к чему-либо.
Аппаратные токены обладают небольшими размерами, что позволяет носить их в кармане или кошельке, часто они оформлены в виде брелоков. Некоторые предназначены для хранения криптографических ключей, таких как электронная подпись или биометрические данные (например, детали дактилоскопического узора). В одни встроена защита от взлома, в другие — мини-клавиатура для ввода PIN-кода или же просто кнопка вызова процедуры генерации и дисплей для вывода сгенерированного ключа. Токены обладают разъёмом USB, функциями RFID или беспроводным интерфейсом Bluetooth для передачи сгенерированной последовательности ключей на клиентскую систему.
Рис. 8 – «Примеры существующих токенов»
В качестве такого токена могут быть использованы как существующие разработки (Rutoken, E-Token), так и самостоятельная разработка на основе любого Flash-носителя.
Разграничение прав доступа необходимо, в первую очередь, для возможности восстановления утерянного токена лицом с более высокими полномочиями (начальник предприятия).
Для этого должно обеспечиваться хранение более важного токена в физически защищённом месте (например, сейфе).
ГЛАВА 4. Практическая реализация модели программного обеспечения для отдела кадров
Для разработки программной части программы была выбрана среда Delphi 2007, это связано с простотой использования, наличием большого количества руководств по компонентам, наличием множества разнообразных дополнений и модулей для данной среды разработки.
Рис. 9 – «Окно установки программы Delphi 2007»
Delphi — императивный, структурированный, объектно-ориентированный язык программирования, диалект Object Pascal.
Изначально среда разработки была предназначена исключительно для разработки приложений Microsoft Windows, затем был реализован также для платформ Linux, однако после выпуска в 2002 году его разработка была прекращена, и, вскоре после этого, было объявлено о поддержке Microsoft.NET.
Реализация среды разработки проектом Lazarus (Free Pascal, компиляция в режиме совместимости с Delphi) позволяет использовать его для создания приложений на Delphi для таких платформ, как Linux, Mac OS X и Windows CE. То есть разработанная программа будет работать на компьютерах всего семейства Windows.
Для реализации базы данных был выбран MSAccess 2003.
Рис. 10 – «Окно работы с программой MsAccess 2003»
Microsoft Office Access или просто Microsoft Access — реляционная СУБД корпорации Microsoft. Имеет широкий спектр функций, включая связанные запросы, связь с внешними таблицами и базами данных. Благодаря встроенному языку VBA, в самом Access можно писать приложения, работающие с базами данных.
Access, при работе с базой данных, иначе взаимодействует с жёстким (или гибким) диском, нежели другие программы. В других программах, файл-документ, при открытии, полностью загружается в оперативную память, и новая редакция этого файла (изменённый файл) целиком записывается на диск только при нажатии кнопки «сохранить».
В Access новая редакция содержимого изменённой ячейки таблицы записывается на диск (сохраняется) сразу, как только курсор клавиатуры будет помещён в другую ячейку (или новая редакция изменённой записи записывается на диск сразу, как только курсор клавиатуры будет поставлен в другую запись. Таким образом, если внезапно отключат электричество, то пропадёт только изменение той записи, которую не успели покинуть.
Целостность данных в Access обеспечивается также за счет механизма транзакций.
Всё это позволяет создать программный комплекс, который с одной стороны будет достаточно простым и легко-дополнимым, с другой стороны будет обладать быстрой скоростью сохранения данных и быстрым их извлечение из базы данных.
Для авторизации сотрудников отдела кадров было решено построить многоступенчатую аутентификацию на основе электронного носителя токена и рабочей пары логин – пароль.
Кроме того, для шифрования базы данных и всех документов было решено использовать алгоритм AES-256. Так как Rijndael блочный шифр, то, как и любому блочному шифру, ему соответствуют следующие принципы:
v Рассеивание (diffusion) - т.е. изменение любого знака открытого текста или ключа влияет на большое число знаков шифротекста, что скрывает статистические свойства открытого текста;
v Перемешивание (confusion) - использование преобразований, затрудняющих получение статистических зависимостей между шифротекстом и открытым текстом.
Rijndael не подвержен многим видам криптоаналитических атак, таких как дифференциальный и линейный криптоанализ, Square-атака, метод интерполяции и др. Исследования, проведённые различными сторонами, показали высокое быстродействие Rijndael на различных платформах. Ценным свойством этого шифра является его байт-ориентированная структура, что гарантирует хорошие перспективы при его реализации в будущих процессорах и специальных схемах.
Некоторым недостатком можно считать то, что режим обратного расшифрования отличается от режима зашифрования порядком следования функций, и сами эти функции отличаются своими параметрами от применяемых в режиме зашифрования. Данный факт сказывается на эффективности аппаратной реализации шифра. Однако Rijndael имеет более цельную структуру, за один раунд в нём преобразуются все биты входного блока, в отличие от шифров Фейстеля, где за один раунд изменяется, как правило, лишь половина бит-входного блока.
По этой причине Rijndael может позволить себе меньшее число раундов преобразования, что можно рассматривать, как некоторую компенсацию за потери при реализации режима обратного шифрования. Гибкость, заложенная в архитектуре Rijndael, позволяет варьировать не только длину ключа, что используется в стандарте AES, но и размер блока преобразуемых данных, что хотя и не нашло применения в стандарте, авторами рассматривается, как вполне нормальное расширение этого шифра.
Таким образом, алгоритм Rijndael является на настоящий момент одним из наиболее надёжных и криптостойких алгоритмов, который можно использовать в нашей программе.
Была придумана схема взаимодействия основных компонентов программы. В ней чётко показано, каким образом происходит авторизация пользователей программного обеспечения, и как выглядит алгоритм защищённости конфиденциальных данных, лежащих в криптоконтейнерах.
Рис 11 – «Концепция новой модели ПО»
Рассмотрим данную схему подробнее. Всю обработку данных можно условно разделить на 3 этапа:
1) Аутентификация по Токену;
2) Аутентификация по паре логин-пароль;
3) Работа с криптоконтейнерами.
При аутентификации по токену, для снижения себестоимости продукта и в научных целях было решено попробовать создать свою собственную разработку, позволяющую создать электронный Токен из любого flash-накопителя.
Для реализации этой идеи был изучен алгоритм шифрования данных одной из недавно появившихся вредоносных программ типа «троян». Данная программа была направлена на вредоносную активность для USB-носителей. В ходе своей работы она прятала имеющиеся данные глубоко в корень flash-накопителя, попутно создавая ярлыки для запуска самой себя и, таким образом, самораспространения.
Программа была интересна за счёт нового, уникального алгоритма сохранения данных, работающего только при определённых условиях, недоступного для извлечения ни одним файловым менеджером и, как следствие, почти полной безнадёжной потери данных. Однако был найден алгоритм для воспрепятсвования утери важных данных, который показывал, каким образом троян шифрует данные. Данный алгоритм располагается в свободном доступе на множестве уникальных ресурсов, посвящённых информационной безопаности и открыт для ознакомления.
Данный алгоритм был мной позаимствован для создания токена из любого flash-накопителя, сделав необходимые уникальные условия обязательными для генерации нового ключа. В добавок к этому был доработан алгоритм скрытия данных, для отличия его от версии, находящейся в свободном доступе.
Достоинства данного метода:
1) Алгоритм закрыт от свободного доступа;
2) Необходимость в специальных знаниях для возможного нахождения ключа в ёмкости Токена;
3) Возможность создания из любого flash-накопителя полноценного токена;
4) Отсутствие привязки к операционной системе для возможности запуска на нескольких ПК;
5) Привязка токена к уникальному идентификатору flash-носителя, исключающего его подделку или прямое копирование.
Недостатки данного метода тоже имеются:
1) Возможность утери токена путём переформатирования дисковой области;
2) Незаменяемость ключа в случае утери носителя;
3) Теоретически возможное обнаружение уникального слепка в области памяти токена.
Часть кода для генерации уникального слепка и последующей аутентификации можно увидеть в приложении 1.
Следующим этапом разработки модели программного обеспечения для системы кадров является разработка системы авторизации на основе корректной пары логин-пароль.
Данный этап достаточно просто в разработке, но для его расширения был дополнительно внедрён модуль преобразования данных в MD5 контрольную сумму (хэш).
MD5 — 128-битный алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института в 1991 году. Предназначен для создания «отпечатков» или «дайджестов» сообщений произвольной длины и последующей проверки их подлинности. Является улучшенной в плане безопасности версией MD4.
MD5 позволяет получать относительно надёжный идентификатор для блока данных. Такое свойство алгоритма широко применяется в разных областях. Оно позволяет искать дублирующиеся файлы на компьютере, сравнивая MD5 файлов, а не их содержимое.
MD5 используется для хеширования паролей. Многие системы используют базу данных для хранения паролей и существует несколько способов для хранения паролей.
1) Пароли хранятся как есть. При взломе такой базы все пароли станут известны. Поэтому данный вариант неприемлем для нас.
2) Хранятся только хеши паролей (с помощью MD5, SHA). Найти пароли можно только полным перебором. Но при условии использования несложного, популярного или просто несчастливого пароля (который встречался ранее и занесён в таблицу) такая задача решается за доли секунды.
3) Хранятся хеши паролей и несколько случайных символов. К каждому паролю добавляется несколько случайных символов (их ещё называют «salt» или «соль») и результат ещё раз хешируется. Например, md5(md5(pass)+word). Найти пароль с помощью таблиц таким методом не получится.
На вход алгоритма поступает входной поток данных, хеш которого необходимо найти. Длина сообщения может быть любой (в том числе нулевой). Кратность каким-либо числам необязательна. В нашем случае на вход к данному алгоритму поступает пароль. Это сделано для того, чтобы в случае работы специалиста с базой данных напрямую не были подсмотрены или записаны пароли сотрудников отдела кадров. Отсутствие соли для алгоритма MD5 обусловлено ненадобностью, так как работа с базой данных напрямую ведётся лишь в исключительных случаях.
Использование MD5 также подразумевает возможность ошибок второго рода, при условии нахождения коллизий хэшей MD5. Коллизия хеш-функции — это получение одинакового значения функции для разных сообщений и идентичного начального буфера. Оказалось, что можно для известного сообщения построить второе, такое, что оно будет иметь такой же хеш, как и исходное. Однако, данная вероятность достаточно мала.
Ошибки первого рода полностью исключены.
Для дополнительной защиты программного обеспечения от злоумышленника было введено ограниченное количество попыток на авторизацию. После трёх неудачных попыток программа будет принудительно закрыта. Для повторной авторизации требуется дополнительный запуск исполняемого файла приложения. Это позволит затруднить автоматический перебор паролей при краже или прямом копировании системный файлов приложения.
Основные достоинства использования авторизации на основе логина и пароля:
1) Разграничение идентификаторов пользователей ПО;
2) Разграничение прав пользователей ПО;
3) Невозможность входа в ПО неавторизованных лиц.
Главными недостатками данного метода являются:
1) Возможность «частичной» атаки прямого перебора паролей (атака методом «грубой силы» - брутфорс);
2) Отсутствие шифрования при вводе пароля (анти-кейлоггер);
3) Возможность аутентификации при нахождении коллизии контрольной суммы (ошибки второго рода).
Криптозащита была введена для того, чтобы данные, хранимые внутри программного обеспечения, были недоступны после окончания работы с данным ПО. Для реализации криптозащиты был выбран алгоритм AES, отличающийся надёжностью и криптостойкостью. Также выбор был остановлен на данном алгоритме за счёт нахождения в свободном доступе огромного количества различных примеров реализации на разных языках программирования.
Данные, извлекаемые из базы данных, находятся в оперативной памяти компьютера, по окончании манипуляции с ними, они будут направлены в базу данных, если не требуется прямой их вывод на устройства вывода (например, принтер). В последнем случае данные распечатываются и сохраняются в базе данных после окончания их печати.
База данных подвергается криптованию в двух случаях:
1) «Декриптование» базы данных при открытии на основе уникального ключа, частично находящегося в токене и частично физически прописанным в исполняемом файле приложения;
2) «Криптование» базы данных после окончания работы с программным обеспечением на основе уникального ключа, частично находящегося в токене и частично физически прописанным в исполняемом файле приложения.
Таким образом, база данных практически всегда находится в закриптованном состоянии, защищающем её от нарушения конфиденциальности в случае прямого копирования системных файлов программы на физические носители.
Дополнительно, все файлы, приобщённые к личным материалам сотрудников и обрабатываемые отделом кадров, также проходят эти процедуры при:
1) Открытии на чтение или запись;
2) Сохранении в базе данных;
3) Создании в базе данных;
4) Копирования в базу данных.
Основными преимуществами данной криптозащиты являются:
1) Все данные хранятся в зашифрованном виде;
2) Обработка данных производится алгоритмом AES;
3) Данные не покидают крипто-контейнер.
Выявленные недостатки:
1) Минимальный размер ключа 16 символов;
2) Требуется дополнительное время для распаковки/запаковки данных в работе программного обеспечения.
Примеры алгоритма реализации криптозащиты находятся в приложении 2.
Заключение
В данной работе были изучены представители программного обеспечения для отдела кадров, выявлены их частные достоинства и недостатки. Также выведены общие недостатки для всех программ подобного вида.
На основании анализа была разработана концептуально новая модель программного обеспечения отдела кадров для Федеральной Службы Исполнения Наказаний Российской Федерации с учётом устранения всех выявленных недостатков в системе безопасности работы программного обеспечения. Данная модель опирается на три основных модуля в своей работе, а именно:
1) Модуль аутентификации на основе токена;
2) Модуль авторизации на основе правильной пары логин-пароль;
3) Модуль криптозащиты для всех документов, участвующих в обороте отдела кадров и отдельно базы данных.
Проведено тестирование данного программного обеспечения на компьютерах отдела кадров Федеральной Службы Исполнения Наказаний с получением рецензии на программного обеспечения от начальника учреждения.
Проведённое тестирование показало, что существующий код достаточно хорошо реализует пример хорошо защищенного приложения с необходимым функционалом.
Список использованной литературы
1. Гладких А.А. Базовые принципы информационной безопасности
вычислительных сетей: учеб пособие для студентов/ А.А. Гладких, В.Е.
Дементьев;- Ульяновск: УлГТУ, 2009.- 168 с.
2. Запечников С. В. Информационная безопасность открытых систем. В 2 т. Т. 2. Средства защиты в сетях/ C.В. Запечников, Н.Г. Милославская, А.И. Толстой, Д.В. Ушаков; - М.: Горячая Линия — Телеком, 2008. — 560 с.
3. Олифер В.Г. Компьютерные сети. Принципы, технологии, протоколы: учебник для вузов. 3-е изд./ В.Г. Олифер, Н.А. Олифер; – Спб.: Питер, 2006. – 958 с.
4. Гайдамакин, Н.А. Автоматизированные информационные системы, банки и базы данных: учебное пособие. – М.: Гелиос АРВ, 2002. – 368с.
5. Голицына, О.Л. Языки программирования: учеб. пособие для ссузов / О.Л.
Голицына, Т.Л. Партыка, И.И. Попов. – М.: Форум; Инфра– М, 2008. – 96с.
6. Дарахвелидзе, П.Г. Программирование в Delphi 7/ П.Г. Дарахвелидзе, Е.П. Марков. – СПб.: БХВ-Петербург, 2003. – 784с: ил.
7. Емельянова, Н.З. Основы построения автоматизированных информационных систем: учебное пособие для студентов/ Н.З. Емельянова, Т.А. Партыка, И.А. Попов. – М.: Форум; Инфра-М, 2005. – 416с.
8. Моисеенко, С.К. SQL: задачи и решения. – СПб.: Питер, 2006. – 256с.
9. Кузубов, В.Н. Основы автоматизированных информационных систем. Обеспечение автоматизированных информационных систем: учебное пособие для вузов. – М: Современный Гуманитарный Университет, 2001. –104с.
ПРИЛОЖЕНИЕ 1.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
SMART_GET_VERSION = $074080;
SMART_SEND_DRIVE_COMMAND = $07C084;
SMART_RCV_DRIVE_DATA = $07C088;
// Values of ds_bDriverError
DRVERR_NO_ERROR = 0;
DRVERR_IDE_ERROR = 1;
DRVERR_INVALID_FLAG = 2;
DRVERR_INVALID_COMMAND = 3;
DRVERR_INVALID_BUFFER = 4;
DRVERR_INVALID_DRIVE = 5;
DRVERR_INVALID_IOCTL = 6;
DRVERR_ERROR_NO_MEM = 7;
DRVERR_INVALID_REGISTER = 8;
DRVERR_NOT_SUPPORTED = 9;
DRVERR_NO_IDE_DEVICE = 10;
// Values of ir_bCommandReg
ATAPI_ID_CMD = $A1;
ID_CMD = $EC;
SMART_CMD = $B0;
type
TIdeRegs = packed record
bFeaturesReg,
bSectorCountReg,
bSectorNumberReg,
bCylLowReg,
bCylHighReg,
bDriveHeadReg,
bCommandReg,
bReserved: Byte;
end;
TDriverStatus = packed record
bDriverError: Byte;
bIDEError: Byte;
bReserved: array[1..2] of Byte;
dwReserved: array[1..2] of DWORD;
end;
TSendCmdInParams = packed record
dwBufferSize: DWORD;
irDriveRegs: TIdeRegs;
bDriveNumber: Byte;
bReserved: array[1..3] of Byte;
dwReserved: array[1..4] of DWORD;
bBuffer: Byte;
end;
TSendCmdOutParams = packed record
dwBufferSize: DWORD;
dsDriverStatus: TDriverStatus;
bBuffer: array[1..512] of Byte;
end;
TGetVersionInParams = packed record
bVersion,
bRevision,
bReserved,
bIDEDeviceMap: Byte;
dwCapabilities: DWORD;
dwReserved: array[1..4] of DWORD;
end;
procedure CorrectDevInfo(var _params: TSendCmdOutParams);
asm
lea edi, _params.bBuffer
add edi,14h
mov ecx,0Ah
@@SerNumLoop: mov ax,[edi]
xchg al,ah
stosw
loop @@SerNumLoop
@@ModelNumLoop: mov ax,[edi]
xchg al,ah
stosw
loop @@ModelNumLoop
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: DWORD;
tmp: string;
dev: THandle;
scip: TSendCmdInParams;
scop: TSendCmdOutParams;
gvip: TGetVersionInParams;
ret: DWORD;
begin
dev:= CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if dev <> INVALID_HANDLE_VALUE then begin
if DeviceIoControl(dev, SMART_GET_VERSION, nil, 0, @gvip, SizeOf(gvip),
ret, nil) then begin
scip.dwBufferSize:= 512;
scip.bDriveNumber:= 0;
scip.irDriveRegs.bSectorCountReg:= 1;
scip.irDriveRegs.bSectorNumberReg:= 1;
scip.irDriveRegs.bDriveHeadReg:= $A0; //???
scip.irDriveRegs.bCommandReg:= ID_CMD; //???
if not DeviceIoControl(dev, SMART_RCV_DRIVE_DATA, @scip, SizeOf(scip),
@scop, SizeOf(scop), ret, nil) then
ShowMessage(SysErrorMessage(GetLastError))
else
if scop.dsDriverStatus.bDriverError = DRVERR_NO_ERROR then begin
CorrectDevInfo(scop);
SetLength(tmp, 20);
Move(scop.bBuffer[21], tmp[1], 20);
Memo1.Lines.Add(' Serial Number: ' + tmp);
SetLength(tmp, 8);
Move(scop.bBuffer[47], tmp[1], 8);
Memo1.Lines.Add('Firmware Revision: ' + tmp);
SetLength(tmp, 40);
Move(scop.bBuffer[55], tmp[1], 40);
Memo1.Lines.Add(' Model: ' + tmp);
end
else
ShowMessageFmt('Error code: %d', [scop.dsDriverStatus.bDriverError])
end
else
ShowMessage(SysErrorMessage(GetLastError));
CloseHandle(dev);
end;
end;
ПРИЛОЖЕНИЕ 2.
Рис.1 - «Окно выбора сотрудника»
Рис.2 - «Пример работы приложения»
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, ExtCtrls, DBCtrls, Grids, DBGrids, StdCtrls;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
Memo1: TMemo;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Image1: TImage;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Button4: TButton;
SaveDialog1: TSaveDialog;
procedure ComboBox1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ComboBox2Select(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Select(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Vivod(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const Key: TAESKey128; Dest: TStream);
var
ExpandedKey: TAESExpandedKey128;
begin
ExpandAESKeyForEncryption(Key, ExpandedKey);
EncryptAESStreamECB(Source, Count, ExpandedKey, Dest);
end;
procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const Key: TAESKey192; Dest: TStream);
var
ExpandedKey: TAESExpandedKey192;
begin
ExpandAESKeyForEncryption(Key, ExpandedKey);
EncryptAESStreamECB(Source, Count, ExpandedKey, Dest);
end;
procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const Key: TAESKey256; Dest: TStream);
var
ExpandedKey: TAESExpandedKey256;
begin
ExpandAESKeyForEncryption(Key, ExpandedKey);
EncryptAESStreamECB(Source, Count, ExpandedKey, Dest);
end;
procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey128; Dest: TStream);
var
TempIn, TempOut: TAESBuffer;
Done: cardinal;
begin
if Count = 0 then
begin
Source.Position:= 0;
Count:= Source.Size;
end
else Count:= Min(Count, Source.Size - Source.Position);
if Count = 0 then exit;
while Count >= SizeOf(TAESBuffer) do
begin
Done:= Source.Read(TempIn, SizeOf(TempIn));
if Done < SizeOf(TempIn) then
raise EStreamError.Create(SReadError);
EncryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
Dec(Count, SizeOf(TAESBuffer));
end;
if Count > 0 then
begin
Done:= Source.Read(TempIn, Count);
if Done < Count then
raise EStreamError.Create(SReadError);
FillChar(TempIn[Count], SizeOf(TempIn) - Count, 0);
EncryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
end;
end;
procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey192; Dest: TStream);
var
TempIn, TempOut: TAESBuffer;
Done: cardinal;
begin
if Count = 0 then
begin
Source.Position:= 0;
Count:= Source.Size;
end
else Count:= Min(Count, Source.Size - Source.Position);
if Count = 0 then exit;
while Count >= SizeOf(TAESBuffer) do
begin
Done:= Source.Read(TempIn, SizeOf(TempIn));
if Done < SizeOf(TempIn) then
raise EStreamError.Create(SReadError);
EncryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
Dec(Count, SizeOf(TAESBuffer));
end;
if Count > 0 then
begin
Done:= Source.Read(TempIn, Count);
if Done < Count then
raise EStreamError.Create(SReadError);
FillChar(TempIn[Count], SizeOf(TempIn) - Count, 0);
EncryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
end;
end;
procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey256; Dest: TStream);
var
TempIn, TempOut: TAESBuffer;
Done: cardinal;
begin
if Count = 0 then
begin
Source.Position:= 0;
Count:= Source.Size;
end
else Count:= Min(Count, Source.Size - Source.Position);
if Count = 0 then exit;
while Count >= SizeOf(TAESBuffer) do
begin
Done:= Source.Read(TempIn, SizeOf(TempIn));
if Done < SizeOf(TempIn) then
raise EStreamError.Create(SReadError);
EncryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
Dec(Count, SizeOf(TAESBuffer));
end;
if Count > 0 then
begin
Done:= Source.Read(TempIn, Count);
if Done < Count then
raise EStreamError.Create(SReadError);
FillChar(TempIn[Count], SizeOf(TempIn) - Count, 0);
EncryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
end;
end;
// Stream decryption routines (ECB mode)
procedure DecryptAESStreamECB(Source: TStream; Count: cardinal;
const Key: TAESKey128; Dest: TStream);
var
ExpandedKey: TAESExpandedKey128;
begin
ExpandAESKeyForDecryption(Key, ExpandedKey);
DecryptAESStreamECB(Source, Count, ExpandedKey, Dest);
end;
procedure DecryptAESStreamECB(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey128; Dest: TStream);
var
TempIn, TempOut: TAESBuffer;
Done: cardinal;
begin
if Count = 0 then
begin
Source.Position:= 0;
Count:= Source.Size;
end
else Count:= Min(Count, Source.Size - Source.Position);
if Count = 0 then exit;
if (Count mod SizeOf(TAESBuffer)) > 0 then
raise EAESError.Create(SInvalidInBufSize);
while Count >= SizeOf(TAESBuffer) do
begin
Done:= Source.Read(TempIn, SizeOf(TempIn));
if Done < SizeOf(TempIn) then
raise EStreamError.Create(SReadError);
DecryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
Dec(Count, SizeOf(TAESBuffer));
end;
end;
procedure DecryptAESStreamECB(Source: TStream; Count: cardinal;
const Key: TAESKey192; Dest: TStream);
var
ExpandedKey: TAESExpandedKey192;
begin
ExpandAESKeyForDecryption(Key, ExpandedKey);
DecryptAESStreamECB(Source, Count, ExpandedKey, Dest);
end;
procedure DecryptAESStreamECB(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey192; Dest: TStream);
var
TempIn, TempOut: TAESBuffer;
Done: cardinal;
begin
if Count = 0 then
begin
Source.Position:= 0;
Count:= Source.Size;
end
else Count:= Min(Count, Source.Size - Source.Position);
if Count = 0 then exit;
if (Count mod SizeOf(TAESBuffer)) > 0 then
raise EAESError.Create(SInvalidInBufSize);
while Count >= SizeOf(TAESBuffer) do
begin
Done:= Source.Read(TempIn, SizeOf(TempIn));
if Done < SizeOf(TempIn) then
raise EStreamError.Create(SReadError);
DecryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
Dec(Count, SizeOf(TAESBuffer));
end;
end;
procedure DecryptAESStreamECB(Source: TStream; Count: cardinal;
const Key: TAESKey256; Dest: TStream);
var
ExpandedKey: TAESExpandedKey256;
begin
ExpandAESKeyForDecryption(Key, ExpandedKey);
DecryptAESStreamECB(Source, Count, ExpandedKey, Dest);
end;
procedure DecryptAESStreamECB(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey256; Dest: TStream);
var
TempIn, TempOut: TAESBuffer;
Done: cardinal;
begin
if Count = 0 then
begin
Source.Position:= 0;
Count:= Source.Size;
end
else Count:= Min(Count, Source.Size - Source.Position);
if Count = 0 then exit;
if (Count mod SizeOf(TAESBuffer)) > 0 then
raise EAESError.Create(SInvalidInBufSize);
while Count >= SizeOf(TAESBuffer) do
begin
Done:= Source.Read(TempIn, SizeOf(TempIn));
if Done < SizeOf(TempIn) then
raise EStreamError.Create(SReadError);
DecryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
Dec(Count, SizeOf(TAESBuffer));
end;
end;
// Stream encryption routines (CBC mode)
procedure EncryptAESStreamCBC(Source: TStream; Count: cardinal;
const Key: TAESKey128; const InitVector: TAESBuffer; Dest: TStream);
var
ExpandedKey: TAESExpandedKey128;
begin
ExpandAESKeyForEncryption(Key, ExpandedKey);
EncryptAESStreamCBC(Source, Count, ExpandedKey, InitVector, Dest);
end;
procedure EncryptAESStreamCBC(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey128; const InitVector: TAESBuffer;
Dest: TStream);
var
TempIn, TempOut, Vector: TAESBuffer;
Done: cardinal;
begin
if Count = 0 then
begin
Source.Position:= 0;
Count:= Source.Size;
end
else Count:= Min(Count, Source.Size - Source.Position);
if Count = 0 then exit;
Vector:= InitVector;
while Count >= SizeOf(TAESBuffer) do
begin
Done:= Source.Read(TempIn, SizeOf(TempIn));
if Done < SizeOf(TempIn) then
raise EStreamError.Create(SReadError);
PLongWord(@TempIn[0])^:= PLongWord(@TempIn[0])^ xor PLongWord(@Vector[0])^;
PLongWord(@TempIn[4])^:= PLongWord(@TempIn[4])^ xor PLongWord(@Vector[4])^;
PLongWord(@TempIn[8])^:= PLongWord(@TempIn[8])^ xor PLongWord(@Vector[8])^;
PLongWord(@TempIn[12])^:= PLongWord(@TempIn[12])^ xor PLongWord(@Vector[12])^;
EncryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
Vector:= TempOut;
Dec(Count, SizeOf(TAESBuffer));
end;
if Count > 0 then
begin
Done:= Source.Read(TempIn, Count);
if Done < Count then
raise EStreamError.Create(SReadError);
FillChar(TempIn[Count], SizeOf(TempIn) - Count, 0);
PLongWord(@TempIn[0])^:= PLongWord(@TempIn[0])^ xor PLongWord(@Vector[0])^;
PLongWord(@TempIn[4])^:= PLongWord(@TempIn[4])^ xor PLongWord(@Vector[4])^;
PLongWord(@TempIn[8])^:= PLongWord(@TempIn[8])^ xor PLongWord(@Vector[8])^;
PLongWord(@TempIn[12])^:= PLongWord(@TempIn[12])^ xor PLongWord(@Vector[12])^;
EncryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
end;
end;
procedure EncryptAESStreamCBC(Source: TStream; Count: cardinal;
const Key: TAESKey192; const InitVector: TAESBuffer; Dest: TStream);
var
ExpandedKey: TAESExpandedKey192;
begin
ExpandAESKeyForEncryption(Key, ExpandedKey);
EncryptAESStreamCBC(Source, Count, ExpandedKey, InitVector, Dest);
end;
procedure EncryptAESStreamCBC(Source: TStream; Count: cardinal;
const ExpandedKey: TAESExpandedKey192; const InitVector: TAESBuffer;
Dest: TStream);
var
TempIn, TempOut, Vector: TAESBuffer;
Done: cardinal;
begin
if Count = 0 then
begin
Source.Position:= 0;
Count:= Source.Size;
end
else Count:= Min(Count, Source.Size - Source.Position);
if Count = 0 then exit;
Vector:= InitVector;
while Count >= SizeOf(TAESBuffer) do
begin
Done:= Source.Read(TempIn, SizeOf(TempIn));
if Done < SizeOf(TempIn) then
raise EStreamError.Create(SReadError);
PLongWord(@TempIn[0])^:= PLongWord(@TempIn[0])^ xor PLongWord(@Vector[0])^;
PLongWord(@TempIn[4])^:= PLongWord(@TempIn[4])^ xor PLongWord(@Vector[4])^;
PLongWord(@TempIn[8])^:= PLongWord(@TempIn[8])^ xor PLongWord(@Vector[8])^;
PLongWord(@TempIn[12])^:= PLongWord(@TempIn[12])^ xor PLongWord(@Vector[12])^;
EncryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
Vector:= TempOut;
Dec(Count, SizeOf(TAESBuffer));
end;
if Count > 0 then
begin
Done:= Source.Read(TempIn, Count);
if Done < Count then
raise EStreamError.Create(SReadError);
FillChar(TempIn[Count], SizeOf(TempIn) - Count, 0);
PLongWord(@TempIn[0])^:= PLongWord(@TempIn[0])^ xor PLongWord(@Vector[0])^;
PLongWord(@TempIn[4])^:= PLongWord(@TempIn[4])^ xor PLongWord(@Vector[4])^;
PLongWord(@TempIn[8])^:= PLongWord(@TempIn[8])^ xor PLongWord(@Vector[8])^;
PLongWord(@TempIn[12])^:= PLongWord(@TempIn[12])^ xor PLongWord(@Vector[12])^;
EncryptAES(TempIn, ExpandedKey, TempOut);
Done:= Dest.Write(TempOut, SizeOf(TempOut));
if Done < SizeOf(TempOut) then
raise EStreamError.Create(SWriteError);
end;
end;
Дата добавления: 2015-10-24; просмотров: 110 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Организационная структура ОК | | | РАЗДЕЛ III РАЗВИТИЕ ПСИХОЛОГИИ В XVII-XIX ВЕКАХ 2 страница |