Методические указания и варианты заданий к выполнению лабораторных работ по дисциплине «Информационная безопасность в сетях»
СОДЕРЖАНИЕ: Название работы. Реализация в среде Excel алгоритма rsa шифрования с открытым ключомМИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
КАЗАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
и варианты заданий
К ВЫПОЛНЕНИЮ ЛАБОРАТОРНЫХ РАБОТ
ПО ДИСЦИПЛИНЕ
«Информационная безопасность в сетях»
Составители:
д.ф.м.н, доцент.каф.САИТ
Ишмухаметов Ш.Т.
Казань, 2008
ЛАБОРАТОРНАЯ РАБОТА № 1
Название работы. Реализация в среде Excel алгоритма RSA шифрования с открытым ключом.
Цель. Ознакомиться с аппаратом программирования на языке Visual Basic for Applications, примерами программ для решения простых задач. Разработать и написать в среде Excel программу выработки пар «открытый/закрытый» ключ по методу RSA. Выполнить шифрование конфиденциальных данных.
Программно-аппаратные средства. Компьютерная лаборатория, пакет Microsoft Office.
Задание на лабораторную работу
1. Изучить теоретический материал по данной лабораторной работе.
2. Ознакомиться с указаниями по программированию в на языке VBA в среде Excel.
3. Разработать программный комплекс в среде Excel генерации параметров метода RSA, шифрования/расшифровки данных.
4. Выполнить пробное шифрование/расшифровку данных, передаваемых по сети в рамках компьютерного класса. Вставить в отчет полученные данные, описать методику выполнения задания.
5. Ответить на контрольные вопросы в конце задания.
Указания к выполнению лабораторной работе.
Лабораторная работа 1 состоит из четырех частей, каждая из которых выполняется в одном и том же рабочем листе Excel.
В первой части следует составить программу на языке Visual Basic для реализации расширенного алгоритма Евклида.
Во второй части надо выполнить генерацию параметров метода RSA. Простые числа, необходимые для RSA, надо выбрать случайным образом, генерируя число из диапазона согласно номеру варианта. Проверить выбранные числа на простоту, используя алгоритм, указанный в вариантах работ.
В третьей части надо реализовать шифрованию/расшифровку текстов, вводимых с клавиатуры.
В заключительной части необходимо реализовать взлом метода RSA, считая известным открытый ключ RSA. Для разложения числа на множители использовать метод Полларда.
ВАРИАНТЫ ЗАДАНИЙ
№ варианта |
Алгоритм проверкипростоты чисел |
Диапазон выбора простых чисел (для 1-о и 2-о чисел) |
Открытый ключ (N,E) и шифр сообщения для взлома |
1 |
Метод пробных делений |
[50;100], [75; 125] |
(N,e)=(78937, 19)M={44389, 31974, 50020, 41406, 29866} |
2 |
Метод Ферма |
[70;120], [90; 140] |
(N,e)=(55357, 37) M={13389, 33602, 11685, 33602, 40522, 47755, 10459, 15507, 33602} |
3 |
Тест Миллера-Рабина |
[40;90], [80; 130] |
(N,e)=(41869, 23)M={21618, 16457, 36520, 31771, 22233, 32135 } |
4 |
Метод пробных делений |
[70;120], [60; 110] |
(N,e)=(111557, 113)M={49096, 63084, 8557, 3743, 4162, 63084, 8557} |
5 |
Метод Ферма |
[30;70], [70; 120] |
(N,e)=(96091,113)M={61768, 80113, 95437, 80113, 53070, 75177, 82879} |
6 |
Тест Миллера-Рабина |
[60;100], [110; 150] |
(N,e)=(139331, 113)M={84929, 101535, 89665, 31645, 48847, 48310, 101535, 89665} |
7 |
Метод пробных делений |
[70;120], [60; 110] |
(N,e)=(85039, 113)M={30454, 11454, 54678, 37720, 28540, 13779, 22807, 63035} |
8 |
Метод Ферма |
[40;80], [70; 120] |
(N,e)=(150737, 113)M={104318, 143945, 19327, 69783, 112451, 105094} |
9 |
Тест Миллера-Рабина |
[70;110], [120; 150] |
(N,e)=(94697,113)M={10546, 67178, 84721, 4306, 78944, 1251, 27204} |
10 |
Метод пробных делений |
[75;110], [100; 130] |
(N,e)=(156031,113)M={29152, 59889, 6814, 115388, 93780, 105567, 31230, 108149} |
11 |
Метод Ферма |
[35;70], [80; 120] |
(N,e)=(157379, 113)M={113065, 45393, 45393, 77288, 102351, 90053, 4109, 122125} |
12 |
Тест Миллера-Рабина |
[75;100], [120; 160] |
(N,e)=(65041, 113)M={11965, 10878, 61241, 39494, 43796, 59735, 10878} |
13 |
Метод пробных делений |
[60;90], [90; 140] |
(N,e)=(95371, 113)M={73636, 91819, 93589, 82293, 75385, 63153, 27478} |
14 |
Метод Ферма |
[70;100], [1200; 150] |
(N,e)=(103861, 113)M={31152, 63308, 38428, 91454, 4476, 10515, 70086, 63308, 84514, 83370} |
15 |
Тест Миллера-Рабина |
[65;100], [105; 140] |
(N,e)=(169921, 113)M={39823, 108107, 55814, 75107, 158616, 145959, 18054} |
Теоретический материал
Односторонняя (однонаправленная) функция (one way function) - это функция f , осуществляющая отображение X -Y , где X и Y - произвольные множества, и удовлетворяющая следующим условиям:
1. Для каждого x из области определения функции легко вычислить . Понятие «легко» обычно означает, что существует алгоритм, вычисляющий функцию f(x) за полиномиальное время от длины аргумента x.
2. Задача нахождения прообраза для произвольного y, принадлежащего области значений функции, является вычислительно сложной задачей. Последнее означает, что не существует алгоритма, вычисляющего существенно быстрее, чем алгоритм полного перебора.
Задача разложения натурального числа N на простые множители (факторизация N) явлется задачей вычисления односторонней функции: зная сомножители p и q, нетрудно вычислить их произведение N=p • q, но обратная задача нахождения делителей p и q по известному N является сложной задачей, решение которой требует значительных вычислительных ресурсов.
На вычислительной сложности решения этой задачи построен один из самых известных асимметричных методов криптографии – метод RSA. В 1977 году, когда создатели этого метода Ривест, Шамир и Адлеман объявили о новом методе криптографии, основанном на задаче факторизации, наиболее длинные числа, разложимые на множители, имели длину 40 десятичных цифр, что соответствует, примерно, 132-битовому двоичному числу (число 40 надо домножить на ). Создатели RSA предложили широкой публике расшифровать некую фразу английского языка. Для этого предварительно требовалось факторизовать 129-значное десятичное число N (длины 428 в битовом представлении), про которое было известно, что оно представимо в виде произведения двух простых сомножителей p и q, которые имели длину 65 и 64 десятичных знака.
С тех пор был достигнут значительный прогресс в этой области. Число, предложенное создателями RSA, было разложено в 1994 году с помощью нового мощного метода факторизации – метода квадратичного решета (Quadratic Sieve Factoring), разработанного Карлом Померанцем и реализованного Аткинсом, Граффом, Ленстрой и Лейлендом. В работе участвовало около 600 добровольцев, задействовано в сети около 1700 компьютеров, которые работали в течение 7 месяцев.
Параллельно с этим методом Джоном Поллардом, известным специалистом по криптографии и теории алгоритмов, был разработан еще более быстрый метод, получивший название метода решета числового поля (Generalizad Number Field Sieve - GNFS), который является наиболее быстрым методом и на сегодняшний день. Текущий рекорд, установленный немецкими исследователями, на июнь 2008 года, составляет 1000-бит. Это делает небезопасными ключи RSA длины 1024, которые являются на сегодняшний день, самыми распространенными.
Генерация пар «открытый/закрытый ключ» метода RSA.
1. Выбираются два простых числа p и q. Для нашего примера числа p и q должны находится в интервале от 100 до 200. В этом случае их произведение N=p • q будет иметь длину 10 – 12 бит. В реальных задача длина N выбирается равной 512, 768 или 1024 бита (иногда 2048 для самых ответственных задач).
2. Вычисляем их произведение N=p • q.
3. Вычисляем функцию Эйлера . Значение равно числу натуральных чисел, меньших N, взаимно простых с (т.е. числу всех k N таких, что наибольший общий делитель НОД(N; k)=1).
4. Выбираем параметр e, входящий в открытый ключ RSA, равным произвольному числу, меньшему N, но взаимно простому с . При реальном шифровании длина e выбирается приблизительно равной L/3, где L – длина N. Можно взять e равным произвольному простому числу, меньшему N и отличному от p и q, проверив при этом условие того, что не делится на е ().
5. Находим параметр d, являющийся секретным параметром метода RSA, из условия . Для вычисления d необходимо воспользоваться расширенным алгоритмом Евклида , который описан ниже. Расширенный алгоритм Евклида по входным натуральным числам A и B находит их наибольший общий делитель C=НОД(А,В), а также числа x и y такие, что выполнено равенство . Для нахождения параметра d подставим в расширенный алгоритм Евклида входные числа и е. Их наибольший общий делитель C=НОД(,е) равен 1. Если это не так, то параметр е выбран неверно. Выполнив вычисления по алгоритму Евклиду мы найдем числа x и y такие, что . Применив операцию к обеим частям последнего равенства, получим . Значит, можно взять значение параметра d равным коэффициенту y из метода Евклида. Однако, коэффициент y может принимать как положительные, так и отрицательные значения, а параметр d обязательно должен положительным, поэтому в случае если y 0, следует взять
Генерация параметров RSA завершена. Пара (N, e) объявляется открытым ключом, а параметры и d закрытыми параметрами (d – закрытый ключ).
Шифрование/расшифровка сообщений по методу RSA .
Текст, который следует зашифровать, разбивается на отдельные символы (или на блоки по k бит в реальных задачах, где , L – длина N в битовом представлении). Для шифрования числа с , служащего кодом символа, выполняется операция возведения в степень по формуле
(*)
где числа N, e взяты из открытого ключа RSA.
Обратная расшифровка выполняется возведение шифра r в степень d, где d – секретный параметр RSA.
(**)
Гарантией того, что при повторном возведении в степень, будет получено исходное число, служит теорема Эйлера, которая утверждает, что для любого выполняется формула . Проверим операцию (**):
Расширенный алгоритм Евклида.
Алгоритм Евклида используются для нахождения по заданным целым числам A и B их наибольшего общего делителя С=НОД(А; B). Расширенный алгоритм Евклида используется также для нахождения целых чисел x, y таких, что выполняется условие . Используется во многих криптографических конструкциях, в том числе в методе RSA.
Основным равенством, используемым для вычисления НОД чисел А и В, является условие
НОД(А, В) = НОД( В, A mod B) (3)
где A mod B – остаток от целочисленного деления А на В. Применяя последовательно формулу (3), мы будем уменьшать числа А и В в этом алгоритме, пока A mod B не станет равным 0, тогда последнее значение аргумента В даст искомый НОД (А, В). Полное описание расширенного алгоритма мы объясним на примере. Пусть числа А и В равны 172 и 38 соответственно. Откроем рабочий лист Excel и разметим в первых строчках заголовки столбцов, а под заголовками А и В поместим числа 172 и 38, как указано на рисунке.
Рис.1. Примерный вид рабочего листа Excel для реализации расширенного алгоритма Евклида.
В столбце Amod B напишем формулу вычисления остатка от целочисленного деления А на В: =ОСТАТ(A3;B3), а в столбце A div B впишем формулу =ЦЕЛОЕ(A3/B3), обозначающую операцию нахождения целой части от деления A на В.
В следующей строке в столбах А и В поместим значения 38 и 20, взятые из двух ячеек, находящихся выше и правее (применение формулы (3)). Значения ячеек под заголовками Amod B и A div B надо вычислить как в предыдущей строке. В Excel для этого достаточно просто скопировать и вставить вышележащие клетки на строку ниже.
Повторяем эти операция несколько раз, пока не получим в столбце Amod B значение 0. Значение В в этой строке будет равно НОД(А,В) (в нашем примере он равен 2).
Далее заполняем столбцы x и y в обратном порядке снизу вверх. Поместим в столбцы x и y в последней полученной строке значения 0 и 1. Далее в каждой следующей (вышележащей) строке i поместим значения xi и yi , вычисленные по формулам:
где обозначает значение из столбца A div B, взятое из той же строки, где вычисляются значения x и y. Используя эти формулы, заполним столбцы x и y. В верхней строке получим значения x и y, которые нам нужны.
Алгоритм возведения в степень по модулю натурального числа.
Для выполнения шифрования по методу RSA приходится выполнять возведение в большую степень различных чисел, а результат приводить по модулю числа N, являющегося параметром метода и имеющего длину 512 и более бит. Уже для небольших a и e вычислить значение
(1)
выполняя сначала возведение в степень, а потом вычисляя остаток от деления на N, становится невозможным. Между тем, если применить алгоритм, описанный в этом разделе, можно вычислять выражения (1), для достаточно больших чисел a, e, N, оставаясь в рамках обычных операций с целыми числами, заложенных в компьютере.
Алгоритм быстрого возведения в степень основывается на идее замены прямого вычисления возведения в степень последовательными операциями умножения на a и возведения в квадрат. Для этого представим степень e число в двоичном исчислении
(2)
где любое ti для принадлежит , . Зная вектор разрядов , можно вычислить число e , применяя последовательные вычисления:
, (3)
Например, если e = 13, то в двоичном представлении e = 11012 , и 13 можно представить как результат вычисления , .
Последнее число и есть e .
Используя формулы (3), можно процедуру возведения в степень по модулю натурального числа N, записать в виде последовательности итераций:
где . Множитель в зависимости от принимает либо значение a, если , либо 1, если . Результат вычислений можно свести в таблицу
... |
||||
... |
Пример. Вычислить .
Решение. Переведем степень e=13 в двоичный вид. Для этого заполним следующую таблицу:
e div 2 |
13 |
6 |
3 |
1 |
e mod 2 |
1 |
0 |
1 |
1 |
Таблица 1. Перевод десятичного числа e к двоичному представлению.
Искомое двоичное разложение числа e будет во второй строке таблицы , записанное в обратном порядке справа налево.
Далее, составим таблицу вычисления с, заполняя следующую таблицу:
е |
1 |
1 |
0 |
1 |
с |
5 |
11 |
7 |
10 |
Таблица 2. Возведение а=5 в степень e=13 по модулю 19.
В первой строке запишем цифры двоичное разложения числа 13. В первую ячейку второй строки поместим основание а =5. Далее каждое следующее значение с будем вычислять по формуле:
Например,
Приведем код на Паскале вычисления функции возведения в степень:
Function Rise(A,B,N:Integer):Integer;
var
B2:array[1..20] of byte;
i,C,L:integer;
Begin
C:=B; i := 1;
While C 0 do
Begin
B2[i]:= C Mod 2;
C:= C div 2;
i:= i + 1;
End;
L:= i - 1;
i:= 1;
D:= A;
While i L do
Begin
D:= (D * D) Mod N;
If B2[L-i]= 1 Then D:=(D * A) Mod N;
i := i + 1;
End;
Rise := D;
End;
Генерация простых чисел
Для определения параметров RSA необходимо генерировать простые числа заданной длины. Известно, что на интервале [1; N ] число простых чисел равно примерно . Например, для N , равного 1 млн, число простых чисел в интервале от 1 до 106 , равно примерно 50 тысяч. Для генерации простых чисел можно выбрать произвольное нечетное число T и проверить его на простоту с помощью одного из тестов, описанных ниже. Если T окажется составным, то надо заменить его на T+2 и проверить снова затем проверить T+4 и т.д. В среднем, через шагов простое число будет найдено. Для генерации числа из заданного интервала [A; B] в Visual Basic можно использовать следующий алгоритм:
Function Generator(A as Integer, B as integer) As Integer
Randomize
t = Rnd() * (B - A) + A
Generator = t
End Function
1. Перебор делителей числа Т. Если число Т – составное, то найдется число k, меньшее , которое делит Т. Поэтому простейшим тестом на простоту является проверка делителей числа Т от 2 до . Приведем программу на Visual Basic:
Function Check_prime(T As Integer) As Boolean
Dim k as integer
Dim k As Integer
Dim i As Integer
Dim b As Boolean
b = True
k = Int(Sqr(T))
For i = 2 To k
If T Mod i = 0 Then
b = False
Exit For
End If
Next i
Test_prime = b
End function
2. Тест Ферма . Согласно теореме Ферма, если число Т – простое, то для любого . На обращении этой теоремы основан следующий вероятностный тест:
Если для произвольных различных k чисел a , меньших T, выполняется условие , то с вероятностью, не меньшей, чем , число a является простым.
К сожалению, полностью обратить теорему Ферма нельзя, т.к. существуют так называемые числа Кармайкла, для которых условие Ферма выполнено для всех a , меньших T, но числа являются составными. Однако, поскольку числа Кармайкла встречаются чрезвычайно редко, то в наших условиях можно ими пренебречь.
3. Тест Миллера Рабина. Пусть Т – произвольное число. Представим Т–1 в виде N–1=2s t, где t – нечетно. Будем говорить, что число a отвергает число Т, если выполнено одно из двух условий:
а) Т делится на a ,
б) и для всех целых k, .
Если найдется число а , отвергающее Т, то Т является составным. Тест Миллера выполняется следующим образом:
1. Выбираем случайное число a , 1 a Т, и проверим, что Т не делится на а нацело,
2. Проверим далее, что или найдется k, , такое, что
Если какое-то из условий 1 и 2 не будет выполнено, то число Т – составное, иначе, ответ не известен. Повторим процедуру с новым а .
После k циклов вероятность того, что Т – составное, меньше 4- k , т.е. убывает очень быстро.
Разложение чисел на множители методом -эвристики Полларда.
Этот метод факторизации натурального числа N был разработан известным криптографом Джоном Поллардом и является самым быстрым среди простых методов факторизации. Его идея состоит в том, что порождается случайная последовательность чисел {xi } (например, взяв x0 =2, и продолжить вычисление по формуле ). Далее, вычисляются всевозможные разности . Для каждой такой пары (xi , xj ) находятся с помощью алгоритма Евклида наибольший общий делитель НОД(N, |xi - xj |)). Если будет найдена пара (xi , xj ) со свойством НОД(N, |xi - xj |))1, то этот НОД и даст искомый делитель числа N.
Обоснование метода Полларда. Пусть p –делитель N. Среди членов последовательности {xi } рано или поздно попадутся числа xi и xj такие, что = (это равенство записывается более кратко ). Это условие означает, что для некоторого целого числа k. Т.к. p – делитель N, то для выбранной пары (xi , xj ) НОД(N; |xi - xj |)= p.
Оценка сходимости метода Полларда. Т.к. меньший делитель числа N меньше , то элементы последовательности меньше . По парадоксу близнецов (см. [1]) среди первых членов последовательности с вероятностью, большем чем 0,5, попадутся два одинаковых члена, т.е. найдутся i, j, удовлетворяющие условию . Поэтому, с вероятностью, большей 0,5, мы найдем искомый делитель N, просмотрев не более , членов последовательности.
При практическом применении метода Полларда для сокращения объема вычисления рассматривают не все разности |xi - xj |, а только те, для которых номер j является степенью 2, т.е. принимает значения 2, 4, 8, ...
Рассмотрим пример. Пусть N=1387. Зададим рекуррентную последовательность чисел {xi } следующим соотношением: =2, . Значения строки xj определим равными ближайшему слева xi , у которого i является степенью 2 (такие xi выделены красным). В следующей строке поместим их разность, а в последней строке – НОД(N; |xi - xj |), вычисленный с помощью алгоритма Евклида.
N |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
x i |
2 |
3 |
8 |
63 |
1194 |
1186 |
177 |
814 |
996 |
310 |
396 |
yi |
1 |
2 |
3 |
3 |
63 |
63 |
63 |
63 |
814 |
814 |
814 |
|xi -yi| |
1 |
1 |
5 |
60 |
11131 |
1123 |
114 |
751 |
182 |
504 |
418 |
НОД |
1 |
1 |
1 |
1 |
1 |
1 |
19 |
1 |
1 |
1 |
19 |
Из таблицы видно, что уже на 7-м шаге был найден делитель N, равный 19.
{Вычисление наибольшего общего делителя}
Function NOD(A as integer, B as integer) as integer
if (A mod B)=0 then
NOD=B
Else
NOD=NOD(B, A mod B)
End if
End
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Что вычисляет алгоритм Евклида?
2. Сколько строчек вычислений необходимо произвести в алгоритме Евклида?
3. Как производится заполнение столбцов x и y в расширенном алгоритме Евклида?
4. Какая алгоритмически сложная задача лежит в основе метода RSA?
5. Что такое простое число? Какие методы проверки простоты числа вы знаете?
6. Как генерируется параметры метода RSA?
7. Какие параметры в RSA вычисляются с помощью алгоритма Евклида?
8. Как производится процедура шифрования/расшифровки в методе RSA?
9. Какой длины должны быть простые числа p и q в методе RSA, чтобы обеспечить необходимый уровень надежности?
10. Каким образом, зная значение функции Эйлера и открытый ключ е, можно рассчитать закрытый параметр d?
11. Дайте определение односторонней функции.
12. Сколько итераций потребуется сделать в методе Полларда, если N 100 млн (108 )?
Лабораторная работа № 2
Шифрование текстовых файлов на основе линейных
сдвиговых регистров с обратной связью.
Цель работы: Изучить принципы работы линейного сдвигового регистра с обратной связью (ЛРОС) и организацию шифрования на их основе
Задание на лабораторную работу :
1. Изучить теоретический материал по принципам построения и работы ОРОС,
2. Разработать программу на языке VBA в Excel, моделирующую работу ЛРОС,
3. Выполнить шифрование/ расшифровку произвольного файла с использованием этой программы. Для шифрования выбрать неприводимый многочлен степени не ниже 16. Шифрование выполнять побитно над словами длины 2 байта.
4. Ответить на контрольные вопросы в конце задания.
Теоретический материал.
Последовательности, генерируемые с помощью сдвиговых регистров, широко используются как в теории кодирования, так и в криптографии. Теория таких регистров разработана достаточно давно еще в доэлектронное время, в период военной криптографии.
Сдвиговый регистр с обратной связью состоит из двух частей: сдвигового регистра и функции обратной связи. Сдвиговый регистр представляет собой последовательность битов фиксированной длины. Число битов называется длиной сдвигового регистра. Функция обратной связи является булевой функцией из множества L-мерных векторов с координатами из множества {0, 1} в множество {0, 1}, L – длина сдвигового регистра. В начальный момент работы сдвиговый регистр заполняется некоторым начальным значением. На каждом последующем шаге вычисляется значение , где xi – значение ячейки с номером si , содержимое регистра сдвигается вправо, а в освободившееся место помещается значение y.
Выходом регистра обычно бывает младший разряд s0 . Иногда в качестве выхода берут все слово, помещающееся в регистре. Последовательность таких слов является периодичной. Периодом сдвигового регистра называется длины последовательности регистровых слов до начала ее повторения. Очевидно, что количество различных слов для регистра длины L равно , поэтому период любой последовательности регистровых слов не может превышать .
Простейшим видом сдвигового регистра с обратной связью является линейный сдвиговый регистр с обратной связью (linear feedback shift register LFSR). Функция обратной связи является в этом случае просто суммой по модулю 2 нескольких фиксированных разрядов .
Пример. Рассмотрим линейный сдвиговый регистр R длины L=4 и функцией обратной связи (отвод от первого и четвертого вывода).
Пусть исходное значение регистра равно 1,1,1,1, тогда этот регистр будет порождать следующую последовательность
В этом примере период последовательности значений регистра равен . Это максимально возможное значение, т.к. слово, состоящее из одних нулей не может быть никогда достигнуто из ненулевой конфигурации (докажите это!).
Последовательность максимальной длины называется M-последовательностью. Не всякий регистр LFSR может обладать такой последовательностью. Проблема определения по заданному регистру LFSR, будет ли он обладать M-последовательностью, является нетривиальной. Для ее решения сопоставим произвольному регистру LFSR длины L следующий многочлен (*), где коэффициент принимает значение 1 или 0 в зависимости от того, присутствует ли соответствующее слагаемое в функции обратной связи. Например, регистру LFSR в рассмотренном выше примере соответствует многочлен .
Теорема. Произвольный LFSR регистр обладает M-последовательностью тогда и только тогда, когда соответствующий многочлен является неприводимым (неразложимым) над полем F2 ={0, 1}.
Пример приводимого многочлена можно взять из всем известной формулы сокращенного умножения . Поскольку, все значения берутся по модулю 2, то в вычисляя значения многочленов надо помнить, что а .
В общем случае, нет простого способа генерировать многочлены заданной степени по модулю 2, однако можно легко проверить, является ли заданный многочлен приводимым или нет над заданным конечным полем. Для этого используется алгоритм Берлекампа (Berlekamp) (см. Лидл, Нидеррайтер[7], т.1, гл.3.). В следующем разделе мы рассмотрим упрощенную ыерсию алгоритма Берленкамфа.
Неприводимые многочлены в конечном поле K.
В этом разделе мы научимся определять для заданного многочлена с коэффициентами из конечного поля P={0, 1, 2, ... q - 1}, является ли этот многочлен неприводимым в поле P. Неприводимые многочлены используются для построения линейных сдвиговых регистров с обратной связью (см. раздел 3.1.6). Наш алгоритм основывается на следующей теореме.
Теорема. Пусть F – конечное поле, состоящее из q элементов. Тогда для любого натурального многочлен является произведением всех неприводимых над полем F многочленов степени k.
Из этой теоремы сразу следует, что для произвольного многочлена является произведением всех линейных сомножителей , является произведением всех квадратичных сомножителей и т.д. Поэтому, если =1 для , то является неприводимым многочленом. Наибольший общий делитель двух многочленов находят с помощью алгоритма Евклида, используя соотношение , где - остаток от деления на .
Упомянутый тест на неприводимость можно заменить более быстрым альтернативным тестом: многочлен над полем F= является неприводимым тогда и только тогда, когда , и для всех простых делителей k степени n.
Пример. Показать неразложимость многочлена над полем F2 ={0,1}.
В данном случае, n=3, q=2. Для вычисления поделим столбиком на и найдем остаток: . Остаток равен x. Простым делителям числа n=3 являются только k=1, поэтому остается только проверить, что . Для этого делим первый многочлен на второй и находим остаток . Теперь по алгоритму Евклида .
Упражнение 1. Являются ли неприводимыми над полем F2 ={0,1} трехчлены , , , , ?
Упражнение 2. Найдите все неприводимые многочлены третьей степени над полем F2 .
Упражнение 3. Определите периоды линейных сдвиговых регистров с обратной связью, построенных на основе неприводимых трехчленов, найденных в предыдущих упражнениях.
Упражнение 4. Какой степени должен быть многочлен, чтобы длины порождаемой им им последовательности бит хватило для кодирования сообщения длины 1 гб?
Упражнение 5. Написать программу на каком-нибудь языке программирования, проверяющую является ли заданный многочлен неприводимым над конечным полем F.
Лабораторная работа № 3 .
Название работы. Разработка клиент-серверного приложения в Delphi .
Цель работы: Изучить современные средства создания клиент-серверных приложений в системе Delphi. Научиться практической работе по организации и решению задач информационной безопасности в сети.
Задание на лабораторную работу . 1. Разработать, используя среду программирования Delphi клиент-серверное приложение для двустороннего обмена информацией между компьютерами в сети. Выполнить пробную передачу и прием данных.
2. Выработать секретный ключ по протоколу Диффи-Хелмана.
3. Провести аутентификацию пользователей по «слово-вызов».
Требования к выполнению задания. Клиентское приложение должно содержать форму, на которой содержатся поля для ввода IP-адреса компьютера – сервера, поле для ввода информации, передаваемое на сервер и поле для получения информации, возвращаемой с сервера.
Приложение должен содержать кнопки Старт/Стоп для запуска и остановки сервера, поле для вывода информации, передаваемой с сервера, и поля для вывода информации, передаваемой клиентами.
Приложение также должно содержать генератор ключей для протокола Диффи-Хелмана и вычисления секретного ключа.
При сдаче необходимо установить клиентскую часть на один компьютер, а серверную часть приложения на другой компьютер, и продемонстрировать диалог обмена данными.
Программно-аппаратные средства. Компьютерная лаборатория, состоящая из компьютеров, соединенных в локальную сеть, пакет Delphi 7 (Delphi 2005).
Задание на лабораторную работу
1. Изучить теоретический материал по данной лабораторной работе.
2. Ознакомиться с указаниями по программированию в на языке Pascal в среде Delphi.
3. Разработать программный комплекс, представляющий собой клиент-серверное приложение в среде Delphi, осуществляющее передачу данных между двумя хостами в сети.
4. Выполнить пробное шифрование/расшифровку данных, передаваемых по сети в рамках компьютерного класса. Вставить в отчет полученные данные, описать методику выполнения задания.
5. Ответить на контрольные вопросы в конце задания.
Теоретический материал.
Рассмотрим процедуры создания приложений для обмена сообщениями в сети по протоколам TCP/IP.
Разработка ТСР-сервера в Delphi.
1. Нанесем на форму Delphi компоненту TidServer с вкладки IndyServer.
2. В его свойстве Bindings укажем IP-адрес данного компьютера и номер порта, на котором сервер будет ожидать вызова от клиента (номер порта – произвольное число от 1 до 65767, но желательно использовать номера выше 1024, т.к. порты с меньшими номерами зарезервированы для стандартных служб),
3. В свойстве MaxConnections укажите 5 (максимальное число соединений к серверу), в свойство Default Port запишите значение порта по умолчанию, а в свойство Active запишите true.
4. Добавьте на форму элемент типа TMemo для вывода в него сообщений, полученных от клиента,
5. При вызове клиента вырабатывается событие OnExecute элемента IdServer1. Для его обработка откройте вкладку Events Инспектора объектов и щелкните дважды в поле процедуры OnExecute.
6. В открывшей процедуре введите следующий код:
Procedure TForm1.IdTCTServer1Execute(Athread:TidPeerConnection);
Begin
with Athread.Connection do
begin
Memo1.Lines.Add(CurrentReadBuffer);
Writeln(‘Сообщение получено’);
Disconnect;
end;
End;
Приложение TCT -клиент в Delphi .
1. Нанесите на форму элемент TidTCPClient с панели IndyClient, два элемента типа Tedit для ввода сообщений серверу и получения ответа, и кнопку TButton.
2. В свойстве Host элемента TidTCPClient укажите IP-адрес сервера, а в свойстве Port задайте номер порта (тот же, что у сервера).
3. Щелкните дважды по элементу Button1 и в появившемся окне введите следующий код:
Procedure TForm1.Button1click(Sender: TObject);
Begin
IdTCPClient1.Connect;
IdTCPClient1.Writeln(Edit1.Text);
Edit2.Text:= IdTCPClient1.ReadLn;
IdTCPClient1.Disconnect;
End;
4. Добавьте код функции MD5, взятый из описания лабораторной работы №3.
5. Запустите оба приложения и протестируйте полученную программу.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. На какой вкладке Delphi находятся компоненты для создания клиент-серверного приложения?
2. Какие основные свойства надо установить в компоненте Indy Server?
3. Какие основные свойства надо установить в компоненте Indy Client?
4. Какой протокол используют компоненты Indy Server и Indy Client для установления связи по локальной сети? Можно ли использовать приложение в сети Интернет?
ЛАБОРАТОРНАЯ РАБОТА № 4
Название работы. Решение в локальной сети задачи аутентификация пользователей.
Цель. Ознакомиться с основными алгоритмами аутентификации пользователей в сети, электронно- цифровой подписи, сертификации. Разработать комплекс программ в Delphi для пересылки и проверки идентификаторов пользователей, решения задачи распределения секретного ключа, идентификации посланий на основе электронно- цифровой подписи и сертификатов.
Программно-аппаратные средства. Компьютерная лаборатория, состоящая из компьютеров, соединенных в локальную сеть, пакет Delphi 7 (Delphi 2005).
Задание на лабораторную работу
1. Изучить теоретический материал по данной лабораторной работе.
2. Разработать программный комплекс в среде Delphi генерации параметров метода RSA и пересылки (публикации) открытого ключа в сети.
3. Реализовать алгоритм генерации электронно- цифровой подписи с использование закрытого ключа метода RSA и функции хеширования MD5.
4. Реализовать алгоритм проверки электронно- цифровой подписи с использование открытого ключа метода RSA и функции хеширования MD5.
5. Выполнить пробную пересылку данных в рамках локальной сети компьютерного класса, снабженных ЭЦП. Вставить в отчет полученные данные, описать методику выполнения задания.
6. Ответить на контрольные вопросы в конце задания.
Теоретический материал.
Одной из наиболее важных служб безопасности является аутентификация . Аутентификация – это подтверждение пользователем информационных услуг своего идентификатора. Аутентификация выполняется с помощью разных методов, из которых простейшим является предъявления пользователем серверу секретного слова – пароля, известного только пользователю и серверу.
Хеш-функции
Хеш-функции играют в информационной защите важную роль, создавая для электронного документа его «моментальный снимок» и тем самым защищая документ от дальнейшей модификации или подмены.
В широком смысле функцией хеширования называется функция H, удовлетворяющая следующим основным свойствам:
1. Хеш-функция Н может применяться к блоку данных любой длины.
2. Хеш-функция Н создает выход фиксированной длины (равно, например, 128 бит для классической функции хеширования MD5, и 160 бит для функции SHA1).
3. Н (М) вычисляется относительно быстро (за полиномиальное время от длины сообщения М).
4. Для любого данного значения хеш-кода h вычислительно невозможно найти M такое, что Н (M) = h.
5. Для любого данного х вычислительно невозможно найти y x, что H(y) = H(x).
6. Вычислительно невозможно найти произвольную пару (х, y) такую, что H(y) = H (x).
Термин вычислительно невозможно означает здесь, что в настоящее время решение этой задачи либо требует слишком большого интервала времени (например, более сотни лет), либо использования слишком больших вычислительных ресурсов, чтобы решение задачи имело смысл.
Первые три свойства требуют, чтобы хеш-функция создавала хеш-код для любого сообщения. Четвертое свойство определяет требование односторонности хеш-функции : легко создать хеш-код по данному сообщению, но невозможно восстановить сообщение по данному хеш-коду .
Схемы аутентификации.
Поскольку при передаче данных по сети никто не застрахован от возможности чтения данных на промежуточных узлах, то передача пароля по сети в открытом виде является опасным. Поэтому для надежной аутентификации и сохранения пароля от взлома используются разные схемы сетевой аутентификации. Здесь мы рассмотрим следующие три схемы:
Схема аутентификации на основе слова-вызова и хеш-свертки.
В этой схеме пользователь зарегистрировавшись на сервере, получает секретный ключ P, который сохраняется также на сервере. При выходе на связь пользователь посылает сначала свой идентификатор. Получив индентификатор, сервер проверяет наличии такого пользователя по своей базе данных и затем возвращает пользователю случайное большое число N (обычно длины 16 байт), называемое словом–вызовом. Пользователь, получив это число, формирует пару N, P, ТS, где P обозначает пароль пользователя, ТS – текущий момент времени (Time Stamp), подвергает ее хеш-преобразованию и отправляет полученное значение h=h(N,P) серверу. Сервер, получив свертку h, извлекает из базы данных пароль пользователя, выполняет то же преобразование h(N,P) и сравнивает два полученных значения h. Если они совпали, то процедура аутентификация считается успешной.
Схема аутентификации на основе электронно-цифровой подписи (ЭЦП).
В этой схеме пользователь зарегистрировавшись на сервере, получает пару открытый/секретный ключ P. Открытый ключ сохраняется также на сервере. При выходе на связь пользователь формирует набор Id, M, Тs, где Id обозначает идентификатор пользователя, M – сообщение пользователя, Тs – метка времени (Time Stamp), подвергает его хеш-преобразованию h=h( Id, M, Тs) и шифрует закрытым ключом EncKз (h). Полученный код называется электронно-цифровой подписью и служит для подтверждения неизменности сообщения и проверки авторства послания. Электронно-цифровая подпись EncKo (h( Id, M, Тs)) прикладывается с исходному сообщению Id, M, Тs и отправляется на сервер.
Сервер, получив пакет, расшифровывает ЭЦП, извлекая свертку h( Id, M, Тs), параллельно вычисляет такую же свертку h= h( Id, M, Тs), используя те же исходные данные и хеш функцию, и сравнивает два полученных значения h. Если они совпали, то процедура аутентификация считается успешной. Временная метка Ts выполняет роль сеансового ключа для предотвращения атак воспроизведения.
Использование хеш-функции в этом методе не является обязательным и служит лишь для уменьшения объема вычислений для шифрования и сокращения сетевого трафика.
Электронно-цифровая подпись может быть сформирована на основе различных методов двухключевой криптографии, например, RSA, Эль-Гамаля, эллиптических кривых.
Схема аутентификации на основе сертификата.
Данная схема предполагает наличие третьей стороны, называемой УЦ – удостоверяющим центром или ЦС – центром сертификации, которая выдает удостоверения (сертификаты) всем участникам сетевого домена, входящего в зону действия данного ЦС. При регистрации нового пользователя или сервера в домене ЦС выдает новому участнику сертификат, состоящий из открытой части, содержащий такие данные как:
1. Идентификатор владельца сертификата,
2. Адрес владельца сертификата,
3. Открытый ключ владельца сертификата,
4. Категория владельца сертификата (например, пользователь с ограниченными полномочиями или администратор проекта).
5. Наименование ЦС и его адрес,
6. Алгоритмы, используемые для генерации ключей и формирования ЭЦП, и их версии,
и закрытой части, содержащий ту же информацию, закрепленной электронно-цифровой подписью ЦС (т.е. подвергнутого хеш- преобразованию и последующему шифрованию с помощью закрытого ключа ЦС).
Обе части выдаются соискателю в электронном виде в виде одного файла. Закрытая часть служит для того, чтобы нельзя было подделать сертификат.
Кроме того, соискатель получает отдельно закрытый ключ, соответствующий открытому ключу, находящемуся в сертификате, который соискатель обязуется хранить в секрете.
Кроме того, открытая часть сертификата может выдана в виде бумажного документа, подтвержденного печатью ЦС.
При обмене сообщения каждый участник сопровождает свое послание меткой времени, электронно-цифровой подписью, сформированной на основе своего закрытого ключа, и сертификатом, выданным ему ЦС. Сертификат здесь служит для удостоверения ЭЦП отправителя: получатель подписывает своим закрытым ключом послания, а получатель расшифровывает ЭЦП, используя открытый ключ отправителя, извлеченный из сертификата. Подлинность сертификата подтверждается электронно-цифровой подписью ЦС, которая может быть проверена с помощью расшифровки закрытой части сертификата с использованием открытого ключа ЦС, который является общедоступным.
Программирование хеш-функций в Delphi
Система Delphi обращается к встроенным средствам операционной системы Windows для программирования различных функций хеширования, методов шифрования с использованием классической и двухключевой криптографии. Большинство этих средств содержится в библиотеках advapi32.dll и crypt32.dll, которые должны быть подключены к проекту Delphi. Для этого в проект приложения надо добавить модуль Wcrypt2.pas, который можно скачать по адресу
http://www.delphikingdom.com/zip/headerCryptoAPI.rar. Как воспользоваться этим модулем в проекте Delphi можно прочитать в статье Ю.Спектора
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1271.
Если нет необходимости использовать все возможности этих библиотек, то можно воспользоваться готовой программой для хеш-функции MD5 (см. прил.в конце).
Указания к выполнению лабораторной работе.
Лабораторная работа 4 состоит из двух частей, каждая из которых выполняется в одной форме Delphi.
В первой части следует разработать клиент-серверное приложение для удаленной аутентификации пользователей на компьютере-сервере согласно номеру своего варианта. Для этого используйте разработку, выполненную в лабораторной работе 2.
Во второй части надо выполнить написать приложение, представляющее работу Центра Сертификации X.509 по выдаче сертификатов X.509 другим пользователям сети по их запросам.
ВАРИАНТЫ ЗАДАНИЙ
Четные варианты. Разработать приложение, осуществляющее аутентификацию пользователей на основе слова-вызова.
Нечетные варианты. Разработать приложение, осущеставляющее аутентификацию пользователей на основе электронно-цифровой подписи, генерируемой с помощью метода RSA.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Что такое аутентификация? Перечислите основные методы аутентификации.
2. Что такое хеш-преобразование? Перечислите основные свойства хеш-функций.
3. В чем заключается аутентификация на основе слова-вызова?
4. Что такое электронно-цифровая подпись? Как она формируется?
5. Как выполняется проверка послания, подписанного ЭЦП?
6. Что такое сертификация X.509? Каковые преимущества имеет аутентификация на основе сертификатов по сравнению с другими видами сертификации?
7. Что входит в состав сертификата ?
8. Какие основные фунции выполняется Центр Сертификации X.509?
9. Сколько различных ключей используется в процедуре аутентификация на основе сертификатов, и каким образом распространяются эти ключи?
10. Каким образом осуществляется проверка подлинности сертификата?
Приложение 1. Текст хеш-функции MD5.
Function md5(s:string):string;
var a:array[0..15] of byte;
i:integer; lenhi, lenlo: longword;
index: dword;
hashbuffer: array[0..63] of byte;
currenthash: array[0..3] of dword;
procedure burn;
begin
lenhi:= 0; lenlo:= 0; index:= 0;
fillchar(hashbuffer,sizeof(hashbuffer),0);
fillchar(currenthash,sizeof(currenthash),0);
end;
procedure init;
begin
burn; currenthash[0]:= $67452301;
currenthash[1]:= $efcdab89;
currenthash[2]:= $98badcfe;
currenthash[3]:= $10325476;
end;
function lrot32(a, b: longword): longword;
begin
result:= (a shl b) or (a shr (32-b));
end;
procedure compress;
var data: array[0..15] of dword;
a, b, c, d: dword;
Begin
move(hashbuffer,data,sizeof(data));
a:= currenthash[0]; b:= currenthash[1];
c:= currenthash[2]; d:= currenthash[3];
a:= b + lrot32(a + (d xor (b and (c xor d))) + data[ 0] + $d76aa478,7);
d:= a + lrot32(d + (c xor (a and (b xor c))) + data[ 1] + $e8c7b756,12);
c:= d + lrot32(c + (b xor (d and (a xor b))) + data[ 2] + $242070db,17);
b:= c + lrot32(b + (a xor (c and (d xor a))) + data[ 3] + $c1bdceee,22);
a:= b + lrot32(a + (d xor (b and (c xor d))) + data[ 4] + $f57c0faf,7);
d:= a + lrot32(d + (c xor (a and (b xor c))) + data[ 5] + $4787c62a,12);
c:= d + lrot32(c + (b xor (d and (a xor b))) + data[ 6] + $a8304613,17);
b:= c + lrot32(b + (a xor (c and (d xor a))) + data[ 7] + $fd469501,22);
a:= b + lrot32(a + (d xor (b and (c xor d))) + data[ 8] + $698098d8,7);
d:= a + lrot32(d + (c xor (a and (b xor c))) + data[ 9] + $8b44f7af,12);
c:= d + lrot32(c + (b xor (d and (a xor b))) + data[10] + $ffff5bb1,17);
b:= c + lrot32(b + (a xor (c and (d xor a))) + data[11] + $895cd7be,22);
a:= b + lrot32(a + (d xor (b and (c xor d))) + data[12] + $6b901122,7);
d:= a + lrot32(d + (c xor (a and (b xor c))) + data[13] + $fd987193,12);
c:= d + lrot32(c + (b xor (d and (a xor b))) + data[14] + $a679438e,17);
b:= c + lrot32(b + (a xor (c and (d xor a))) + data[15] + $49b40821,22);
a:= b + lrot32(a + (c xor (d and (b xor c))) + data[ 1] + $f61e2562,5);
d:= a + lrot32(d + (b xor (c and (a xor b))) + data[ 6] + $c040b340,9);
c:= d + lrot32(c + (a xor (b and (d xor a))) + data[11] + $265e5a51,14);
b:= c + lrot32(b + (d xor (a and (c xor d))) + data[ 0] + $e9b6c7aa,20);
a:= b + lrot32(a + (c xor (d and (b xor c))) + data[ 5] + $d62f105d,5);
d:= a + lrot32(d + (b xor (c and (a xor b))) + data[10] + $02441453,9);
c:= d + lrot32(c + (a xor (b and (d xor a))) + data[15] + $d8a1e681,14);
b:= c + lrot32(b + (d xor (a and (c xor d))) + data[ 4] + $e7d3fbc8,20);
a:= b + lrot32(a + (c xor (d and (b xor c))) + data[ 9] + $21e1cde6,5);
d:= a + lrot32(d + (b xor (c and (a xor b))) + data[14] + $c33707d6,9);
c:= d + lrot32(c + (a xor (b and (d xor a))) + data[ 3] + $f4d50d87,14);
b:= c + lrot32(b + (d xor (a and (c xor d))) + data[ 8] + $455a14ed,20);
a:= b + lrot32(a + (c xor (d and (b xor c))) + data[13] + $a9e3e905,5);
d:= a + lrot32(d + (b xor (c and (a xor b))) + data[ 2] + $fcefa3f8,9);
c:= d + lrot32(c + (a xor (b and (d xor a))) + data[ 7] + $676f02d9,14);
b:= c + lrot32(b + (d xor (a and (c xor d))) + data[12] + $8d2a4c8a,20);
a:= b + lrot32(a + (b xor c xor d) + data[ 5] + $fffa3942,4);
d:= a + lrot32(d + (a xor b xor c) + data[ 8] + $8771f681,11);
c:= d + lrot32(c + (d xor a xor b) + data[11] + $6d9d6122,16);
b:= c + lrot32(b + (c xor d xor a) + data[14] + $fde5380c,23);
a:= b + lrot32(a + (b xor c xor d) + data[ 1] + $a4beea44,4);
d:= a + lrot32(d + (a xor b xor c) + data[ 4] + $4bdecfa9,11);
c:= d + lrot32(c + (d xor a xor b) + data[ 7] + $f6bb4b60,16);
b:= c + lrot32(b + (c xor d xor a) + data[10] + $bebfbc70,23);
a:= b + lrot32(a + (b xor c xor d) + data[13] + $289b7ec6,4);
d:= a + lrot32(d + (a xor b xor c) + data[ 0] + $eaa127fa,11);
c:= d + lrot32(c + (d xor a xor b) + data[ 3] + $d4ef3085,16);
b:= c + lrot32(b + (c xor d xor a) + data[ 6] + $04881d05,23);
a:= b + lrot32(a + (b xor c xor d) + data[ 9] + $d9d4d039,4);
d:= a + lrot32(d + (a xor b xor c) + data[12] + $e6db99e5,11);
c:= d + lrot32(c + (d xor a xor b) + data[15] + $1fa27cf8,16);
b:= c + lrot32(b + (c xor d xor a) + data[ 2] + $c4ac5665,23);
a:= b + lrot32(a + (c xor (b or (not d))) + data[ 0] + $f4292244,6);
d:= a + lrot32(d + (b xor (a or (not c))) + data[ 7] + $432aff97,10);
c:= d + lrot32(c + (a xor (d or (not b))) + data[14] + $ab9423a7,15);
b:= c + lrot32(b + (d xor (c or (not a))) + data[ 5] + $fc93a039,21);
a:= b + lrot32(a + (c xor (b or (not d))) + data[12] + $655b59c3,6);
d:= a + lrot32(d + (b xor (a or (not c))) + data[ 3] + $8f0ccc92,10);
c:= d + lrot32(c + (a xor (d or (not b))) + data[10] + $ffeff47d,15);
b:= c + lrot32(b + (d xor (c or (not a))) + data[ 1] + $85845dd1,21);
a:= b + lrot32(a + (c xor (b or (not d))) + data[ 8] + $6fa87e4f,6);
d:= a + lrot32(d + (b xor (a or (not c))) + data[15] + $fe2ce6e0,10);
c:= d + lrot32(c + (a xor (d or (not b))) + data[ 6] + $a3014314,15);
b:= c + lrot32(b + (d xor (c or (not a))) + data[13] + $4e0811a1,21);
a:= b + lrot32(a + (c xor (b or (not d))) + data[ 4] + $f7537e82,6);
d:= a + lrot32(d + (b xor (a or (not c))) + data[11] + $bd3af235,10);
c:= d + lrot32(c + (a xor (d or (not b))) + data[ 2] + $2ad7d2bb,15);
b:= c + lrot32(b + (d xor (c or (not a))) + data[ 9] + $eb86d391,21);
inc(currenthash[0],a); inc(currenthash[1],b);
inc(currenthash[2],c); inc(currenthash[3],d);
index:= 0; fillchar(hashbuffer,sizeof(hashbuffer),0);
end;
procedure update(const buffer; size: longword);
var pbuf: ^byte;
Begin
inc(lenhi,size shr 29); inc(lenlo,size*8);
if lenlo (size*8) then inc(lenhi);
pbuf:= @buffer;
while size 0 do
begin
if (sizeof(hashbuffer)-index)= dword(size) then
begin
move(pbuf^,hashbuffer[index],sizeof(hashbuffer)-index);
dec(size,sizeof(hashbuffer)-index);
inc(pbuf,sizeof(hashbuffer)-index);
compress;
end
else
begin
move(pbuf^,hashbuffer[index],size);
inc(index,size); size:= 0;
end; end; end;
procedure final(var digest);
Begin
hashbuffer[index]:= $80;
if index= 56 then compress;
pdword(@hashbuffer[56])^:= lenlo;
pdword(@hashbuffer[60])^:= lenhi; compress;
move(currenthash,digest,sizeof(currenthash)); burn;
End;
Begin
init; update(s[1],length(s));
final(a); result:=;
for i:=0 to 15 do
result:=result+inttohex(a[i],0);
burn;
End;
ЛИТЕРАТУРА:
1. С.Г.Баричев, В.В.Гончаров, Р.Е.Серов. Основы современной криптографии – Москва, Горячая линия – Телеком, 2001
2. А.В.Беляев. Методы и средства защиты информации (курс лекций). http://www.citforum.ru/internet/infsecure/index.shtml
3. А. А. Болотов, С. Б. Гашков, А. Б. Фролов, А. А. Часовских, «Алгоритмические основы эллиптической криптографии». Учебное пособие. М.: Изд-во МЭИ. 2000 г., 100 с.
4. А.Володин. «Кто заверит ЭЦП», журнал «Банковские системы», ноябрь 2000, http://www.bizcom.ru/system/2000-11/04.html
5. Т.Илонен. Введение в криптографию (Ylonen Tatu. Introduction to Cryptography), http://www.ssl.stu.neva.ru/psw/crypto/intro.html
6. Ш.Т. Ишмухаметов. Технологии защиты информации в сети, Казань, 2008, 91 с. http://depositfiles.com/files/e9zxcqos9
7. Н.Коблиц. Теория чисел и криптография, М.:, ТВР, 2001 http://gabro.ge/biblio/0708/0081/file/Cryptography/Koblic_-_Teoriya_Chisel_i_Cryptografiya.rar
8. О.Р. Лапонина. Криптографические основы безопасности, курс Интернет-университета, http://www.intuit.ru/department/security/networksec
9. Р.Лидл, Г.Нидеррайтер. Конечные поля, в 2 т., пер.с англ., М.: Мир, 1998, 438 с.
10. А.А. Молдовян, Н.А. Молдовян, Б.Я. Советов. Криптография. М., Лань, 2001
11. А.А. Молдовян, Н.А. Молдовян, Введение в криптосистемы с открытым ключом, БХВ-Петербург, 2005, с. 286 http://cyberdoc.nnm.ru/vvedenie_v_kriptosistemy_s_otkrytym_klyuchom
12. А.Г.Ростовцев. Алгебраические основы криптографии, СПб, Мир и Семья, 2000.
13. А.Г.Ростовцев, Е.Б.Маховенко. Теоретическая криптография . – СПб.: АНО, ПО “Профессионал”, 2005, http://bookpedia.ru/index.php?newsid=1265
14. Г.Семенов. «Цифровая подпись. Эллиптические кривые».
http://www.morepc.ru/security/crypt/os200207010.html?print
14. В.Столлингс. Основы защиты сетей. Приложения и стандарты, М.: Вильямс, 2002, 429 с.
15. Брюс Шнайер. Прикладная криптография, 2-е издание: протоколы, алгоритмы и исходные тексты на языке С, http://www.ssl.stu.neva.ru/psw/crypto/appl_rus/appl_cryp.htm
16. Dr. Michael Ganley, Thales eSecurity Ltd. Метод эллиптических кривых, http://www.racal.ru/rsp/eliptic_curve_cryptography.htm
17. В.М.Фомичев. Дискретная математика и криптология, Диалог-МИФИ, 2003, 399 с.
18. Сайт Криптографический ликбез - http://www.ssl.stu.neva.ru/psw/crypto.html
19. Jovan Dj. Golic. Cryptanalysis of Alleged A5 Stream Cipher, Beograd, Yugoslavia, http://jya.com/a5-hack.htm
20. Ю. Спектор. Использование инструментов криптографии в Delphi-приложе-ниях, http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1271