Проектування засобів захисту інформації в комп’ютерних мережах

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
ЗІ
Кафедра:
Не вказано

Інформація про роботу

Рік:
2015
Тип роботи:
Лабораторна робота
Предмет:
Інші

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА” Лабораторна робота №1 Проектування засобів захисту інформації в комп’ютерних мережах «Обчислення хеш-функції за алгоритмом SHA-1» Львів – 2015 Мета роботи: реалізувати програму обчислення значення сигнатури вхідного повідомлення за алгоритмом SHA-1. Теоретичні відомості Хеш-функція SHA-1 - безпечний хеш-алгоритм (Secure Hash Algorithm) був розроблений національним інститутом стандартів і технології (NIST) і опублікований в якості федерального інформаційного стандарту (FIPS PUB 180) в 1993 році. SHA-1, як і MD5, заснований на алгоритмі MD4. Логіка виконання SHA-1 Алгоритм отримує на вході повідомлення максимальної довжини 2 64 біт і створює в якості виходу дайджест повідомлення довжиною 160 біт. Алгоритм складається з наступних кроків:  Крок 1: додавання бракуючих бітів Повідомлення додається таким чином, щоб його довжина була кратна 448 по модулю 512 (довжина 448 mod 512). Додавання здійснюється завжди, навіть якщо повідомлення вже має потрібну довжину. Таким чином, число додаваних бітів знаходиться в діапазоні від 1 до 512. Додавання складається з одиниці, за якою слід необхідну кількість нулів. Крок 2: додавання довжини До повідомлення додається блок з 64 бітів. Цей блок трактується як беззнаковое 64-бітне ціле і містить довжину вихідного повідомлення до додавання. Результатом перших двох кроків є повідомлення, довжина якого кратна 512 бітам. Розширене повідомлення може бути представлене як послідовність 512-бітних блоків Y0, Y1,. . . , YL-1, так що загальна довжина розширеного повідомлення є L * 512 біт. Таким чином, результат кратний шістнадцяти 32-бітними словам. Крок 3: ініціалізація SHA-1 буфера Використовується 160-бітний буфер для зберігання проміжних та остаточних результатів хеш-функції. Буфер може бути представлений як п'ять 32-бітних регістрів A, B, C, D і E. Ці регістри ініціалізується наступними шістнадцятковому числами: A = 67452301 B = EFCDAB89 C = 98BADCFE D = 10325476 E = C3D2E1F0 Крок 4: обробка повідомлення в 512-бітних блоках Основою алгоритму є модуль, що складається з 80 циклічних обробок, позначений як HSHA. Всі 80 циклічних обробок мають однакову структуру.  Кожен цикл отримує на вході поточний 512-бітний обробляємий блок Yq і 160-bit значення буфера ABCDE, і змінює вміст цього буфера. У кожному циклі використовується додаткова константа Кt, яка приймає тільки чотири різних значення: 0 ≤ t ≤ 19 K t = 5A827999 (ціла частина числа [230 × 21/2]) 20 ≤ t ≤ 39 K t = 6ED9EBA1 (ціла частина числа [230 × 31/2]) 40 ≤ t ≤ 59 K t = 8F1BBCDC (ціла частина числа [230 × 51/2]) 60 ≤ t ≤ 79 K t = CA62C1D6 (ціла частина числа [230 × 101/2]) Для отримання SHA q +1 вихід 80-го циклу складається зі значенням SHAq. Додавання за модулем 232 виконується незалежно для кожного з п'яти слів в буфері з кожним з відповідних слів у SHAq. Крок 5: вихід Після обробки всіх 512-бітних блоків виходом L-ої стадії є 160-бітний дайджест повідомлення. Розглянемо більш детально логіку в кожному з 80 циклів обробки одного 512-бітного блоку. Кожен цикл можна представити у вигляді: A, B, C, D, E (CLS5 (A) + f t (B, C, D) + E + W t + K t), A, CLS30 (B), C, D де A, B, C, D, E - п'ять слів з буфера. t - номер циклу, 0 t 79. f t - елементарна логічна функція. CLS s - циклічний лівий зсув 32-бітного аргументу на s бітів. W t - 32-бітне слово, отримане з поточного вхідного 512-бітного блоку. K t - додаткова константа. + - Додавання за модулем 2 32.  Кожна елементарна функція одержує на вході три 32-бітних слова і створює на виході одне 32-бітне слово. Елементарна функція виконує набір побітних логічних операцій, тобто n-ий біт виходу є функцією від n-их бітів трьох входів. Функції такі: Номер циклу ft (B, C, D)  Насправді використовуються тільки три різні функції. Для 0 ≤ t ≤ 19 функція є умовною: if B then C else D. Для 20 ≤ t ≤ 39 і 60 ≤ t ≤ 79 функція створює біт парності. Для 40 ≤ t ≤ 59 функція є істинною, якщо два або три аргументу правдиві. 32-бітні слова Wt виходять з чергового 512-бітного блоку повідомлення наступним чином.  Перші 16 значень Wt беруться безпосередньо з 16 слів поточного блоку. Решта значення визначаються наступним чином:  У перших 16 циклах вхід складається з 32-бітного слова даного блоку. Для решти 64 циклів вхід складається з XOR декількох слів з блоку повідомлення. Алгоритм SHA-1 можна підсумувати наступним чином: SHA 0 = IV SHA q +1 = Σ32 (SHAq, ABCDEq) SHA = SHA L-1 де IV - початкове значення буфера ABCDE. ABCDE q - результат обробки q-того блоку повідомлення. L - число блоків у повідомленні, включаючи поля додавання і довжини. Σ32 - сума за модулем 2 32, здійснюється окремо для кожного слова буфера. SHA - значення дайджеста повідомлення. Виконання роботи Для реалізації заданого алгоритму було обрано мову програмування C# і середовище Visual Studio 2008 Express Edition. Текст програми для реалізації наведено нижче. Вміст файлу Program.cs: using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace SHA_1 { class SHA1 { public uint[] resHash = new uint[5]; private uint A = 0x67452301; private uint B = 0xEFCDAB89; private uint C = 0x98BADCFE; private uint D = 0x10325476; private uint E = 0xC3D2E1F0; private uint GetK(int t) { if ((t >= 0) && (t <= 19)) return 0x5A827999; else if ((t >= 20) && (t <= 39)) return 0x6ED9EBA1; else if ((t >= 40) && (t <= 59)) return 0x8F1BBCDC; else if ((t >= 60) && (t <= 79)) return 0xCA62C1D6; else return 0; } //simple function for implementation SHA1 algoritm private uint funkT(int t, uint B, uint C, uint D) { if ((t >= 0) && (t <= 19)) return ((B & C) | (~B & D)); else if ((t >= 20) && (t <= 39)) return (B ^ C ^ D); else if ((t >= 40) && (t <= 59)) return ((B & C) | (B & D) | (C & D)); else if ((t >= 60) && (t <= 79)) return (B ^ C ^ D); else return 0; } //this is massive, were will be stored line //after it established limits //uint[] allBlocks = new uint[256]; byte[] byteBlock = new byte[1024]; //get input line, add 0x80 and filling length of line //and zero until current length of line will be aliquot 64 //return size of create massive from byte's block private int SetCurrentSizeOfLine(string line) { int i; byte n = (byte)line.Length; for (i = 0; i < line.Length; i++) { byteBlock[i] = Convert.ToByte(line[i]); } byteBlock[i] = 0x80; while (((i+8) % 64) != 0) { byteBlock[++i] = 0x00; //++i; } byteBlock[i++] = 0x00; byteBlock[i++] = 0x00; byteBlock[i++] = 0x00; byteBlock[i++] = 0x00; byteBlock[i++] = 0x00; byteBlock[i++] = 0x00; byteBlock[i++] = 0x00; byteBlock[i] = ++n; return i; } public void GetHash(string line) { int i, t, j, k, p = 0; uint[] W = new uint[80]; uint tA = A; uint tB = B; uint tC = C; uint tD = D; uint tE = E; uint temp = 0; for (i = 0; i < SetCurrentSizeOfLine(line); i += 16) { for (t = 0; t < 64; t+=4) { temp |= byteBlock[t]; for (j = t+1; j < t + 4; j++ ) { temp <<= 8; temp |= byteBlock[j]; } W[p++] = temp; temp = 0; } for (t = 16; t < 80; t++) W[t] = (W[t - 16] ^ W[t - 14] ^ W[t - 8] ^ W[t - 3]); for (k = 0; k < 80; k++) { A = ((A << 5) + funkT(k, B, C, D) + W[k] + GetK(k) + E); B = A; C = B << 30; D = C; E = D; tA = tA + A; tB = tB + B; tC = tC + C; tD = tD + D; tE = tE + E; } } resHash[0] = tA + A; resHash[1] = tB + B; resHash[2] = tC + C; resHash[3] = tD + D; resHash[4] = tE + E; } public override string ToString() { return (Convert.ToString(resHash[0], 16) + " - " + Convert.ToString(resHash[1], 16) + " - " + Convert.ToString(resHash[2], 16) + " - " + Convert.ToString(resHash[3], 16) + " - " + Convert.ToString(resHash[4], 16)); } } static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } } Результат роботи програми:  Висновок: На лабораторній роботі я реалізував програму для обчислення значення сигнатури вхідного повідомлення за алгоритмом SHA-1.
Антиботан аватар за замовчуванням

03.12.2015 14:12-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!