Лабораторная работа №4 Использование функций криптографического интерфейса Windows для защиты информации - umotnas.ru o_O
Главная
Поиск по ключевым словам:
страница 1
Похожие работы
Название работы Кол-во страниц Размер
Лабораторная работа по дисциплине «Защита информации»: Современные... 1 94kb.
Лекция 27. Система обеспечения безопасности в Windows xp professional 2 414kb.
Лабораторная работа №9-10 Механизмы резервного копирования данных... 1 180.92kb.
«Основы криптографической защиты информации» 1 175.58kb.
Контрольная работа по дисциплине «Операционные системы» Дата сдачи... 1 243.71kb.
Лабораторная работа Использование стандартных компонентов в C++ Builder 1 85.8kb.
Лабораторная работа Строим фермы SharePoint 2013 в Windows Azure 1 178.2kb.
Лабораторная работа 5 изучение тестов на простоту и ознакомление... 1 50.92kb.
Правовое регулирование защиты информации 1 64.2kb.
Лабораторная работа №6 по курсу "Информационная безопасность" Лабораторная... 1 57.72kb.
Курсовая работа по дисциплине: «Методы и средства защиты информации» 1 123.92kb.
Зао «Курорт Усть-Качка» Санаторно-курортное лечение для детей 11-21... 1 23.79kb.
Викторина для любознательных: «Занимательная биология» 1 9.92kb.

Лабораторная работа №4 Использование функций криптографического интерфейса Windows - страница №1/1

Лабораторная работа №4

Использование функций криптографического интерфейса Windows для защиты информации

Содержание задания

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

  2. Файл с учетными данными должен быть зашифрован при помощи функций криптографического интерфейса операционной системы Windows (CryptoAPI) с использованием сеансового ключа, генерируемого на основе вводимой администратором (пользователем) парольной фразы.

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

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

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

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

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

  8. Для доступа к функциям CryptoAPI из программ на Паскале следует использовать интерфейсный модуль wincrypt.pas с указанного преподавателем сетевого диска.

Индивидуальные варианты заданий (типы и параметры алгоритмов шифрования и хеширования)




Тип симметричного шифрования

Используемый режим шифрования



Добавление к ключу случайного значения

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

1

2

3

4

5

1

Блочный

Электронная кодовая книга

Да

MD2

2

Потоковый

-

Да

MD2

3

Блочный

Сцепление блоков шифра

Да

MD2

4

Потоковый

-

Да

MD5

5

Блочный

Обратная связь по шифротексту

Да

MD2

6

Потоковый

-

Да

SHA

7

Блочный

Электронная кодовая книга

Да

MD4

8

Потоковый

-

Нет

MD2

9

Блочный

Сцепление блоков шифра

Да

MD4

1

2

3

4

5

10

Потоковый

-

Нет

MD5

11

Блочный

Обратная связь по шифротексту

Да

MD4

12

Потоковый

-

Нет

SHA

13

Блочный

Электронная кодовая книга

Да

MD5

14

Блочный

Сцепление блоков шифра

Да

MD5

15

Блочный

Обратная связь по шифротексту

Да

MD5

16

Блочный

Электронная кодовая книга

Да

SHA

17

Блочный

Сцепление блоков шифра

Да

SHA

18

Блочный

Обратная связь по шифротексту

Да

SHA

19

Блочный

Электронная кодовая книга

Нет

MD2

20

Блочный

Сцепление блоков шифра

Нет

MD2

21

Блочный

Обратная связь по шифротексту

Нет

MD2

22

Блочный

Электронная кодовая книга

Нет

MD4

23

Блочный

Сцепление блоков шифра

Нет

MD4

24

Блочный

Обратная связь по шифротексту

Нет

MD4

25

Блочный

Электронная кодовая книга

Нет

MD5

26

Блочный

Сцепление блоков шифра

Нет

MD5

27

Блочный

Обратная связь по шифротексту

Нет

MD5

28

Блочный

Электронная кодовая книга

Нет

SHA

29

Блочный

Сцепление блоков шифра

Нет

SHA

30

Блочный

Обратная связь по шифротексту

Нет

SHA

31

Потоковый

-

Да

MD4

32

Потоковый

-

Нет

MD4

33

DES

Электронная кодовая книга

Нет

SHA

34

DES

Сцепление блоков шифра

Нет

MD5

35

DES

Обратная связь по шифротексту

Нет

MD4

Возможный вид дополнительной диалоговой формы программы

Окно запроса парольной фразы для расшифровки файла с учетными данными

Может быть создано на основе шаблона Password Dialog, выбираемого с помощью команды File | New | Dialogs системы программирования Borland C++ Builder. Для повышения безопасности эта форма должна быть исключена из списка автоматически создаваемых форм проекта (команда Project | Options | Forms) и создаваться (уничтожаться) в программе явным образом. В указаниях по выполнению лабораторных работ эта форма имеет имя Form6.



Рекомендуемые для разработки программы средства языка Си++

  1. Класс fstream для операций шифрования (расшифрования) файла учетных записей пользователей:

fstream имя_файловой_переменной;

  1. Работа с файлом:

void open(const char *FileName, ios::in | ios::binary); /* открытие существующего файла под именем FileName для чтения */

void open(const char *FileName,ios::out|ios::binary); /* создание нового файла с именем FileName */

istream& read(char *buf, int n); // чтение данных в буфер buf длины n

int gcount(); /* количество байт, фактически прочитанных во время последней операции */

ostream& write(const char *buf,int n); // запись данных из буфера buf длины n

void close(); // закрытие файла

bool eof(); // проверка достижения конца файла

int remove(const char *filename); // удаление файла с именем filename



  1. Шифрование (расшифрование) файла:

HCRYPTPROV, HCRYPTKEY, HCRYPTHASH – типы данных для дескрипторов криптопровайдера, криптографического ключа, хеш-объекта

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

BOOL CryptAcquireContext(HCRYPTPROV *phProv, LPCSTR pszContainer,

LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags); /* инициализация криптопровайдера (в *phProv записывается его дескриптор, pszContainer=NULL, pszProvider=NULL, dwProvType= PROV_RSA_FULL, dwFlags=0) или (когда при первом запуске программы CryptAcquireContext возвращает FALSE) регистрация нового пользователя в криптопровайдере (dwFlags= CRYPT_NEWKEYSET) */

BOOL CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey,

DWORD dwFlags, HCRYPTHASH *phHash); /* создание пустого хеш-объекта (Algid – код алгоритма хеширования, hKey=0, dwFlags=0, в *phHash записывается дескриптор хеш-объекта) */

BOOL CryptHashData(HCRYPTHASH hHash, CONST BYTE *pbData, DWORD dwDataLen, DWORD dwFlags); /* хеширование парольной фразы (или любых других данных) pbData длины dwDataLen (dwFlags=0) */

BOOL CryptDestroyHash(HCRYPTHASH hHash); // разрушение хеш-объекта

BOOL CryptDeriveKey(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey); /* создание ключа шифрования из хеш-объекта с парольной фразой hBaseData (Algid – код алгоритма шифрования, dwFlags=CRYPT_EXPORTABLE с возможным объединением через or с признаком добавления к ключу случайного значения CRYPT_CREATE_SALT, в *phKey записывается дескриптор ключа) */

BOOL CryptDestroyKey(HCRYPTKEY hKey); // разрушение ключа шифрования

BOOL CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags); /* освобождение криптопровайдера */

BOOL CryptEncrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final,

DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen); /* шифрование порции данных из буфера pbData длины dwBufLen, которая для блочных шифров должна быть кратной 8 (dwDataLen – длина порции данных, после выполнения функции в эту переменную записывается фактическая длина зашифрованных данных; hHash=0, dwFlags=0, Final – признак последней порции данных) */

BOOL CryptDecrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final,

DWORD dwFlags,BYTE *pbData,DWORD *pdwDataLen); /* расшифрование порции данных из буфера pbData (dwDataLen – длина порции данных, после выполнения функции в эту переменную записывается фактическая длина расшифрованных данных; hHash=0, dwFlags=0, Final – признак последней порции данных) */

BOOL CryptSetKeyParam(HCRYPTKEY hKey,DWORD dwParam,BYTE *pbData,

DWORD dwFlags); /* установка режима шифрования для ключа hKey (dwParam= KP_MODE, pbData указывает на переменную типа unsigned long, в которой записан код устанавливаемого режима, dwFlags=0) */

Рекомендуемые для разработки программы средства языка Object Pascal


  1. Нетипизированный файл для операций шифрования (расшифрования) файла учетных записей:

Var Имя_файловой_переменной:File;

Для повышения безопасности расшифрованный файл учетных записей может временно сохраняться в объекте класса TMemoryStream



  1. Работа с нетипизированным файлом:

procedure AssignFile(var F: File; FileName: string); { «связывание» файловой переменной F с файлом под именем FileName }

procedure Reset(var F : File; RecSize: Word ); { открытие существующего файла F с длиной записи RecSize (рекомендуется 1) }

procedure Rewrite(var F: File ; RecSize: Word); { создание нового файла F с длиной записи RecSize (рекомендуется 1) }

procedure BlockRead(var F: File; var Buf; Count: Integer; var AmtTransferred: Integer); { чтение Count записей из файла F в переменную Buf (в переменную AmtTransferred помещается фактическое количество прочитанных записей) }

procedure BlockWrite(var f: File; var Buf; Count: Integer ); { запись Count записей из переменной Buf в файл F }

function DeleteFile(const FileName: string): Boolean; { удаление файла с именем FileName }

procedure CloseFile(var F: File); // закрытие файла

function Eof(var F: File): Boolean; // проверка достижения конца файла



  1. Работа с файлом в оперативной памяти (свойства и методы класса TMemoryStream):

Position:Integer // смещение текущей позиции в байтах

Size:Integer // размер в байтах

function Read(Buffer:Pointer; Count:Integer):Integer; { чтение Count байт в буфер Buffer (результат – фактическое количество прочитанных байт) }

function Write(const Buffer: Pointer; Count: Integer):Integer; { запись Count байт из буфера Buffer }

function Seek(Offset:Integer; Origin: Word):Integer; { смещение текущей позиции на Offset байт относительно Origin: начала потока soFromBeginning, текущей позиции soFromCurrent, конца потока soFromEnd }


  1. Шифрование (расшифрование) файла:

THandle – тип данных для дескрипторов криптопровайдера, криптографического ключа, хеш-объекта

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

function CryptAcquireContext(var hProv: THandle; pszContainer, pszProvider: PChar;

dwProvType, dwFlags: Longint): Longbool; { инициализация криптопровайдера (в hProv записывается его дескриптор, pszContainer=Nil, pszProvider=Nil, dwProvType= PROV_RSA_FULL, dwFlags=0) или (когда при первом запуске программы CryptAcquireContext возвращает false) регистрация нового пользователя в криптопровайдере (dwFlags= CRYPT_NEWKEYSET) }

function CryptCreateHash(hProv: THandle; Algid: ALG_ID; hKey: THandle; dwFlags: Longint; var hHash: THandle): Longbool; { создание пустого хеш-объекта (Algid – код алгоритма хеширования, hKey=0, dwFlags=0, в hHash записывается дескриптор хеш-объекта) }

function CryptHashData(hHash: THandle; pbData: Pointer; dwDataLen, dwFlags: Longint): Longbool; { хеширование парольной фразы (или произвольных данных) pbData длины dwDataLen (dwFlags=0) }

function CryptDestroyHash(hHash: THandle): Longbool; // разрушение хеш-объекта

function CryptDeriveKey(hProv: THandle; Algid: ALG_ID; hBaseData: THandle; dwFlags: Longint; var hKey: THandle): Longbool; { создание ключа шифрования из хеш-объекта с парольной фразой hBaseData (Algid – код алгоритма шифрования, dwFlags= CRYPT_EXPORTABLE с возможным объединением через or с признаком добавления к ключу случайного значения CRYPT_CREATE_SALT, в hKey записывается дескриптор ключа) }

function CryptDestroyKey(hKey: THandle): Longbool; { разрушение ключа шифрования }

function CryptReleaseContext(hProv: THandle; dwFlags: Longint):Longbool; { освобождение криптопровайдера }

function CryptEncrypt(hKey, hHash: THandle; Final: Longbool; dwFlags: Longint; pbData: Pointer; var dwDataLen: Longint; dwBufLen: Longint):Longbool; { шифрование порции данных из буфера pbData длины dwBufLen, которая для блочных шифров должна быть кратной 8 (dwDataLen – длина порции данных, после выполнения функции в эту переменную записывается фактическая длина зашифрованных данных; hHash=0, dwFlags=0, Final – признак последней порции данных) }

function CryptDecrypt(hKey, hHash: THandle; Final: Longbool; dwFlags: Longint;



pbData: Pointer; var dwDataLen: Longint):Longbool; { расшифрование порции данных из буфера pbData (dwDataLen – длина порции данных, после выполнения функции в эту переменную записывается фактическая длина расшифрованных данных; hHash=0, dwFlags=0, Final – признак последней порции данных) }

function CryptSetKeyParam(hKey: THandle; dwParam: Longint; pbData: Pointer; dwFlags: Longint): Longbool; { установка режима шифрования для ключа hKey (dwParam= KP_MODE, pbData указывает на переменную типа Longint, в которой записан код устанавливаемого режима, dwFlags=0) }