Саратовский Державний Університет ім. Н. Г. Чернишевського p>
Курсова робота b> p>
«Хеш-функції в криптосистемах» b> p>
Виконав: студент 112гр. КніІТ p>
Іванченко Е. С. p>
р. Саратов 2001 p>
Зміст b> p>
Введення
3 p>
Метод хешування
3 p>
Колізії і реверс
3 p>
Односторонні хэши
4 p>
Список літератури і сайтів
остання p>
Введення b> p>
У наш час велику роль в інформатиці грають мережеві технології, що базуються на поєднанні
величезної кількості машин в єдину мережу. Одним з яскравих прикладів такої мережі є Internet. Вона заснована на розрахованих на багато користувачів операційних системах, що дозволяють керувати даними, що зберігаються на віддалених
машинах (серверах) відразу декільком людям. Іноді потрібно зробити доступною для всіх лише частину документів. Наприклад, часто потрібно приховати
програмний код cgi-скрипта від сторонніх очей, але дуже небажано забороняти його виконання. Для цього операційній системі необхідно
"Пояснити", хто є власником. У більшості операційних систем ідентифікація проводиться за логіном і паролем. Але так як з файлом, в якому
міститься цей пароль, працюють не один, а кілька користувачів, то зберігання його у відкритому вигляді становить загрозу збереження документів. Для
цього треба було шифрування даних. p>
Метод хешування b> p>
Одним з найбільш поширених методів криптування є хешування. Метод хешування
дозволяє зберігати елементи з безлічі A b> у лінійному масиві X b>. Математично це можна записати так: p>
h: A ® (0, x-1) b> p>
т. тобто Функція h b> відображає кожен елемент безлічі A b> в індекс безлічі X b>. p>
Наприклад: нехай дані два безлічі A ( 'a', 'b', 'c', ...) b> і X (0, 1, 2, ...) b> , тоді функція h: A ® X b> ставить у відповідність кожному
елементу з безлічі A b> елемент з безлічі B b>. Таким чином h ( 'a') = 0 b>,
h ( 'c') = 2 b> і т. д. p>
Колізії і реверс b> p>
Однак, можливе існування такого інтервалу на області визначення функції, в межах
якого вона стає ін'ектівной (тобто якщо h ( 'a') = 0, b> то існує така функція, g: X ® A b>, для якої g (0) = 'a' b>).
Це означає, що тільки для одного елемента з безлічі A b> існує індекс x1. b> Функція буде ін'ектівна і в тому випадку, якщо жоден елемент з A b> не
відображається на інтервал (x1, x2) b> за умови, що останній не дорівнює нулю. У будь-якому іншому випадку на кожен індекс безлічі X b> відображається
більше одного елемента з A b>. Це так звана колізія хеш-функції. P>
p>
Реверс хеш-функції полягає в пошуку всіх відображаються на даний індекс елементів. Для будь-якого кінцевого безлічі
це здійсненне завдання, яке має найбільш просте рішення на ін'ектівних інтервалах хеш-множини. p>
Односторонні хэши b> p>
У криптування використовуються особливі хеш-функції, що називаються односторонніми. Функція
|: X ® Y b> називається односторонньою, якщо | (x) b> може бути легко обчислена для будь-якого елемента з безлічі X, b> тоді для всіх елементів з
безлічі Y b> обчислення такого аргументу x, b> для якого | (x) = y b>, не розв'язна поліноміальною. Системи, побудовані на односторонніх функціях
злому, як правило, не піддаються. p>
Основні аспекти написання b> p>
При написанням алгоритму kript b> особлива увага приділялася таким аспектам: p>
вимоги користувача до алгоритму; p>
можливі варіанти витоку зашифрованого пароля; p>
найбільш дієві методи розшифровки. p>
1. Вимоги користувача b> p>
Основні вимоги до алгоритму з точки зору користувача є: p>
надійність; p>
швидкість роботи; p>
системні вимоги (необхідні ресурси). p>
2. Варіанти витоку пароль b> p>
Однією з головною причиною витоку пароля при використанні цього алгоритму є його
зберігання у відкритому вигляді самим власником, тому більша частина атак в наш час розрахована на довіру користувача (наприклад, по телефону дзвонить уявний
адміністратор мережі і просить пароль для проведення профілактичних робіт). У цьому випадку захист зводиться до ідентифікації не тільки користувача, але й машини, з
якої здійснюється запит. p>
Другою причиною служить його розшифровка. p>
3. Методи розшифровки b> p>
Цей метод пов'язаний з використанням більшістю користувачів занадто простих паролів
(завдовжки менше 8 символів, або, пароль, що несе на сбе якусь смислове навантаження (по батькові прабабусі по маминій
лінії)). У цьому випадку атаки зводяться до перебору можливих паролів, а захист - до їх ускладнення. P>
Для розшифровки пароля другу методом, потрібно знати його довжину і алгоритм шіфованія. У випадку, коли довжина пароля складе менше восьми символів, можна
скористатися наступним алгоритмом: p>
1. Перевернути зашифрований пароль. P>
2. Так як розмір блоку не може бути більше 5 байт і менше 1 байта, то розіб'ємо його на 8 блоків і запишемо у список (список перших блоків,
список другого, і т. д.). Отримаємо восьміподспісковий список списків, кожен подспісок якого представляє собою всі можливі блоки зашифрованих символів. P>
3. Пробігаємо в циклі по підсписки, звіряючи кожен елемент з усіма символами з ASCII наступним чином: p>
If j * generate (x, n, j) = then write (ord (j)), де j десятковий код символу, x - ключ, n --
послідовний номер символу в паролі (у діапазоні [1, 8]). Якщо виконати цю умову, то виведемо на екран знайдений символ. p>
Після виконання алгоритму на виході отримаємо або пароль, або таку послідовність, з якої його можна отримати. p>
Опис b> p>
В основі алгортма лежить функція від трьох аргументів generate = trunc (k * (abs (sin (ln (a) * x) +
sin (cos (b) * x )))) b>: p>
1. ключа ( x b >); p>
2. десяткового код символу ( a b >); p>
3. номера символу під введеної рядку ( b b >). p>
Вона використовується для перетворення десяткового коду символу до числа, яке лежить в інтервалі від 0 b>
до 2 * k b>, де k b> - будь-яке число цілого типу. Чим більше число k - тим менше ймовірність колізій в подальшому.
p>
Після обробки символу він додається до списку списків процедурою add_in_list (x:
integer; s: string; var gr: llist) b> в такий спосіб - l ^. inf: = ord (s [k]) * generate (x, ord (s [k]), k) ,
де l ^. inf b>-елемент списку списків, x b> - ключ (для функції generate b>), s b> - рядок , розбивається на блоки по 8 символів.
Кожен подспісок має довжину не більше 8 елементів розміром до 5 байт. P>
p>
Третім кроком є складання відповідних елементів процедурою summ_all (gr: llist; var
a: array_type) b> з кожного підсписки l b> у 8 елментний масив a b>, тобто перший елемент з першого елемента складається з
першим елементом другого, третього і т.д. підсписки і записується в a [1] b>. p>
Так - само чинимо і з іншими елементами підсписки. p>
Наступним щагом записуємо в файл ключ і по черзі всі елементи масиву a b> , b> оброблені функцією FromIntToString (), яка переводить
чисельний тип в символьний і перевертає. p>
p>
Для звірки пароля його потрібно зашифрувати заново за відомим ключа та звірити з зашифрованих екземпляром. p>
Ось початковий текст програми: p>
kriptmod.pas b> p>
unit kriptmod; p>
interface p>
type Plist = ^ list; p>
list = record p>
inf: word; p>
num: 1 .. 8; p>
next: Plist; p>
end; p>
Llist = ^ List_of_list; p>
List_of_list = record p>
nb: Plist; p>
inf: 1 .. 32; p>
next: Llist; p>
end; p>
array_type = array [1 .. 8] of longint; p>
function generate (x: integer; a, b: byte): integer; p>
procedure add_in_llist (x: integer; s: string; var gr: llist); p>
procedure print_llist (gr: llist); p>
procedure summ_all (gr: llist; var a: array_type); p>
function FromIntToString (L: longint): string; p>
implementation p>
(- Ця функція переводить з цілочисельного типу в символьний ------------------------------------ ----------} p>
function FromIntToString; p>
var s: string; p>
l1: longint; p>
begin p>
l1: = l; s :=''; p>
while (l1 div 10> 0) do p>
begin p>
case l1 mod 10 of p>
0: s: = s + '0 '; p>
1: s: = s + '1 '; p>
2: s: = s + '2 '; p>
3: s: = s + '3 '; p>
4: s: = s + '4 '; p>
5: s: = s + '5 '; p>
6: s: = s + '6 '; p>
7: s: = s + '7 '; p>
8: s: = s + '8 '; p>
9: s: = s + '9 '; p>
end; p>
l1: = l1 div 10; p>
end; p>
case l1 mod 10 of p>
0: s: = s + '0 '; p>
1: s: = s + '1 '; p>
2: s: = s + '2 '; p>
3: s: = s + '3 '; p>
4: s: = s + '4 '; p>
5: s: = s + '5 '; p>
6: s: = s + '6 '; p>
7: s: = s + '7 '; p>
8: s: = s + '8 '; p>
9: s: = s + '9 '; p>
end; p>
FromIntToString: = s; p>
end; p>
(- Функція генерації (основна )--------------------------------------- -------} p>
function generate; p>
begin p>
generate: = trunc (abs (122.5 * (sin (ln (a) * x) + sin (cos (b) * x )))); p>
end; p>
(- Процедура долучення до списку списків --------------------------------------- -------} p>
procedure add_in_llist; p>
var g: llist; p>
l: plist; p>
k, i, j: byte; p>
begin p>
k: = 1; i: = 1; p>
while (k