Методичні вказівки до виконання лабораторних робіт Київ 2014 Зміст Лабораторна робота 1 Розробка програми розмежування повноважень користувачів на основі парольної автентифікації 3
Скачать 1.3 Mb.
|
Лабораторная работа №3 Використання функцій криптографічного інтерфейсу Windows для захисту інформаціїЗміст завдання1. У програму, розроблену при виконанні лабораторних робіт №1 і №2, додати засоби захисту від несанкціонованого доступу до файлу з обліковими даними зареєстрованих користувачів: файл з обліковими записами повинен бути зашифрований за допомогою функцій CryptoAPI з використанням сеансового ключа, генерованого на основі введеної адміністратором пральний фрази; при запуску програми файл з обліковими записами повинен розшифровуватися в тимчасовий файл, який після завершення роботи програми повинен бути знову зашифрований для обліку можливих змін в облікових записах користувачів («старий» вміст файлу облікових записів при цьому стирається). 2. Варіанти використання алгоритмів шифрування і хешування при виклику функцій CryptoAPI вибираються відповідно до виданого викладачем завданням. Використовувані алгоритми шифрування і хешування
Рекомендовані для розробки програми засоби мови Сі ++ 1. Файл облікових записів зареєстрованих користувачів для операцій шифрування (розшифрування). Об'єкт класу fstream, відкритий в довічним режимі (визначений у файлі fstream.h). 2. Робота з файлом облікових записів (методи класу fstream): / * Відкриття існуючого файлу під ім'ям FileName для читання в довічним режимі * / void open (const char * FileName, ios :: in | ios :: binary); // Створення нового файлу з ім'ям FileName void open (const char * FileName, ios :: out | ios :: binary); // Читання даних з файлу в буфер buf довжини n, кратній довжині блоку шифру I stream & read (char * buf, int n); / * Отримання кількості байт, фактично прочитаних під час останньої операції читання з файлу * / int gcount (); // Запис в файл даних з буфера buf довжини n, кратній довжині блоку шифру ostream& write(const char *buf, int n); // Закриття файлу void close (); // Перевірка досягнення кінця файлу bool eof (); // Видалення файлу з ім'ям filename int remove (const char * filename); 3. шифрування (розшифрування) файлу обліковіх запісів (константа, тіпі даних і прототипів функцій візначені в заголовному файлі wincrypt.h): HCRYPTPROV, HCRYPTKEY, HCRYPTHASH - тіпі даних для дескріпторів криптопровайдера (CSP), кріптографічного ключа, хеш-об'єкта ALG_ID - тип даних для кодів кріптографічніх алгорітмів / * ініціалізація криптопровайдера: в * phProv записується його дескриптор, pszContainer = NULL, pszProvider = NULL, dwProvType = PROV_RSA_FULL, dwFlags = 0 або (якщо при першому запуску програми CryptAcquireContext повертає FALSE) реєстрація нового користувача в криптопровайдерів dwFlags = CRYPT_NEW_KEYSET * / BOOL CryptAcquireContext (HCRYPTPROV * phProv, LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags); / * Створення пустого хеш-об'єкта (hProv - дескриптор ініціалізованих криптопровайдера, Algid - код алгоритму хешування, hKey = 0, dwFlags = 0, в * phHash записується дескриптор хеш-об'єкта) * / BOOL CryptCreateHash (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH * phHash); / * Хеширование парольної фрази pbData довжини dwDataLen (hHash - дескриптор хеш-об'єкта, dwFlags = 0) * / BOOL CryptHashData (HCRYPTHASH hHash, CONST BYTE * pbData, DWORD dwDataLen, DWORD dwFlags); // Руйнування хеш-об'єкта з дескриптором hHash BOOL CryptDestroyHash (HCRYPTHASH hHash); / * Створення ключа шифрування з хеш-об'єкта з парольною фразою hBaseData (hProv - дескриптор криптопровайдера, Algid - код алгоритму шифрування, dwFlags = CRYPT_EXPORTABLE з можливим об'єднанням через | з ознакою додавання до ключа випадкового значення CRYPT_CREATE_SALT, в * phKey записується дескриптор ключа) * / BOOL CryptDeriveKey (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY * phKey); // Руйнування ключа шифрування з дескриптором hKey BOOL CryptDestroyKey (HCRYPTKEY hKey); // Звільнення криптопровайдера з дескриптором hProv (dwFlags = 0) BOOL CryptReleaseContext (HCRYPTPROV hProv, DWORD dwFlags); / * Шифрування на ключі з дескриптором hKey порції даних з буфера pbData довжини dwBufLen (dwDataLen - довжина порції даних, після виконання функції в цю змінну записується фактична довжина зашифрованих даних; hHash = 0, dwFlags = 0, Final - ознака останньої порції даних) * / BOOL CryptEncrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE * pbData, DWORD * pdwDataLen, DWORD dwBufLen); / * Розшифровка на ключі з дескриптором hKey порції даних з буфера pbData (dwDataLen - довжина порції даних, після виконання функції в цю змінну записується фактична довжина розшифрованих даних; hHash = 0, dwFlags = 0, Final - ознака останньої порції даних) * / BOOL CryptDecrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE * pbData, DWORD * pdwDataLen); / * Установка режиму шифрування для ключа hKey (dwParam = KP_MODE, pbData вказує на змінну типу unsigned long, в якій записаний код встановлюваного режиму, dwFlags = 0) , KP_MODE - режим шифрування * / BOOL CryptSetKeyParam (HCRYPTKEY hKey, DWORD dwParam, BYTE * pbData, DWORD dwFlags); . |