Указания к выполнению лабораторной работе.
ЛАБОРАТОРНАЯ РАБОТА № 1
Название работы. Реализация в среде Excel алгоритма RSA шифрования с открытым ключом.
Цель. Ознакомиться с аппаратом программирования на языке Visual Basic for Applications, примерами программ для решения простых задач. Разработать и написать в среде Excel программу выработки пар «открытый/закрытый» ключ по методу RSA. Выполнить шифрование конфиденциальных данных.
Программно-аппаратные средства.Компьютерная лаборатория, пакет Microsoft Office.
Задание на лабораторную работу
- Изучить теоретический материал по данной лабораторной работе.
- Ознакомиться с указаниями по программированию в на языке VBA в среде Excel.
- Разработать программный комплекс в среде Excel генерации параметров метода RSA, шифрования/расшифровки данных.
- Выполнить пробное шифрование/расшифровку данных, передаваемых по сети в рамках компьютерного класса. Вставить в отчет полученные данные, описать методику выполнения задания.
- Ответить на контрольные вопросы в конце задания.
Указания к выполнению лабораторной работе.
Лабораторная работа 1 состоит из четырех частей, каждая из которых выполняется в одном и том же рабочем листе Excel.
- В первой части следует составить программу на языке Visual Basic для реализации расширенного алгоритма Евклида.
- Во второй части надо выполнить генерацию параметров метода RSA. Простые числа, необходимые для RSA, надо выбрать случайным образом, генерируя число из диапазона согласно номеру варианта. Проверить выбранные числа на простоту, используя алгоритм, указанный в вариантах работ.
- В третьей части надо реализовать шифрованию/расшифровку текстов, вводимых с клавиатуры.
- В заключительной части необходимо реализовать взлом метода RSA, считая известным открытый ключ RSA. Для разложения числа на множители использовать метод Полларда.
ВАРИАНТЫ ЗАДАНИЙ
№ варианта | Алгоритм проверки простоты чисел | Диапазон выбора простых чисел (для 1-о и 2-о чисел) | Открытый ключ (N,E) и шифр сообщения для взлома |
Метод пробных делений | [50;100], [75; 125] | (N,e)=(78937, 19) M={44389, 31974, 50020, 41406, 29866} | |
Метод Ферма | [70;120], [90; 140] | (N,e)=(55357, 37) M={13389, 33602, 11685, 33602, 40522, 47755, 10459, 15507, 33602} | |
Тест Миллера-Рабина | [40;90], [80; 130] | (N,e)=(41869, 23) M={21618, 16457, 36520, 31771, 22233, 32135 } | |
Метод пробных делений | [70;120], [60; 110] | (N,e)=(111557, 113) M={49096, 63084, 8557, 3743, 4162, 63084, 8557} | |
Метод Ферма | [30;70], [70; 120] | (N,e)=(96091,113) M={61768, 80113, 95437, 80113, 53070, 75177, 82879} | |
Тест Миллера-Рабина | [60;100], [110; 150] | (N,e)=(139331, 113) M={84929, 101535, 89665, 31645, 48847, 48310, 101535, 89665} | |
Метод пробных делений | [70;120], [60; 110] | (N,e)=(85039, 113) M={30454, 11454, 54678, 37720, 28540, 13779, 22807, 63035} | |
Метод Ферма | [40;80], [70; 120] | (N,e)=(150737, 113) M={104318, 143945, 19327, 69783, 112451, 105094} | |
Тест Миллера-Рабина | [70;110], [120; 150] | (N,e)=(94697,113) M={10546, 67178, 84721, 4306, 78944, 1251, 27204} | |
Метод пробных делений | [75;110], [100; 130] | (N,e)=(156031,113) M={29152, 59889, 6814, 115388, 93780, 105567, 31230, 108149} | |
Метод Ферма | [35;70], [80; 120] | (N,e)=(157379, 113) M={113065, 45393, 45393, 77288, 102351, 90053, 4109, 122125} | |
Тест Миллера-Рабина | [75;100], [120; 160] | (N,e)=(65041, 113) M={11965, 10878, 61241, 39494, 43796, 59735, 10878} | |
Метод пробных делений | [60;90], [90; 140] | (N,e)=(95371, 113) M={73636, 91819, 93589, 82293, 75385, 63153, 27478} | |
Метод Ферма | [70;100], [1200; 150] | (N,e)=(103861, 113) M={31152, 63308, 38428, 91454, 4476, 10515, 70086, 63308, 84514, 83370} | |
Тест Миллера-Рабина | [65;100], [105; 140] | (N,e)=(169921, 113) M={39823, 108107, 55814, 75107, 158616, 145959, 18054} |
Теоретический материал
Односторонняя (однонаправленная) функция (one way function) - это функция f, осуществляющая отображение X->Y, где X и Y - произвольные множества, и удовлетворяющая следующим условиям:
- Для каждого x из области определения функции легко вычислить . Понятие «легко» обычно означает, что существует алгоритм, вычисляющий функцию f(x) за полиномиальное время от длины аргумента x.
- Задача нахождения прообраза для произвольного 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; 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, .
Если найдется число а, отвергающее Т, то Т является составным. Тест Миллера выполняется следующим образом:
- Выбираем случайное число a, 1 < a < Т, и проверим, что Т не делится на а нацело,
- Проверим далее, что или найдется 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 | |||||||||||
xi | |||||||||||
yi | |||||||||||
|xi-yi| | |||||||||||
НОД |
Из таблицы видно, что уже на 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
КОНТРОЛЬНЫЕ ВОПРОСЫ
- Что вычисляет алгоритм Евклида?
- Сколько строчек вычислений необходимо произвести в алгоритме Евклида?
- Как производится заполнение столбцов x и y в расширенном алгоритме Евклида?
- Какая алгоритмически сложная задача лежит в основе метода RSA?
- Что такое простое число? Какие методы проверки простоты числа вы знаете?
- Как генерируется параметры метода RSA?
- Какие параметры в RSA вычисляются с помощью алгоритма Евклида?
- Как производится процедура шифрования/расшифровки в методе RSA?
- Какой длины должны быть простые числа p и q в методе RSA, чтобы обеспечить необходимый уровень надежности?
- Каким образом, зная значение функции Эйлера и открытый ключ е, можно рассчитать закрытый параметр d?
- Дайте определение односторонней функции.
- Сколько итераций потребуется сделать в методе Полларда, если N ≈100 млн (108)?
Лабораторная работа №2
ТЕОРЕТИЧЕСКИЙ МАТЕРИАЛ.
Последовательности, генерируемые с помощью сдвиговых регистров, широко используются как в теории кодирования, так и в криптографии. Теория таких регистров разработана достаточно давно еще в доэлектронное время, в период военной криптографии.
Сдвиговый регистр с обратной связью состоит из двух частей: сдвигового регистра и функции обратной связи. Сдвиговый регистр представляет собой последовательность битов фиксированной длины. Число битов называется длиной сдвигового регистра. Функция обратной связи является булевой функцией из множества 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.). В следующем разделе мы рассмотрим упрощенную ыерсию алгоритма Берленкамфа.
Лабораторная работа №3.
Название работы. Разработка клиент-серверного приложения в Delphi.
Цель работы:Изучить современные средства создания клиент-серверных приложений в системе Delphi. Научиться практической работе по организации и решению задач информационной безопасности в сети.
Задание на лабораторную работу. 1. Разработать, используя среду программирования Delphi (или любую среду Visual C++) клиент-серверное приложение для двустороннего обмена информацией между компьютерами в сети. Выполнить пробную передачу и прием данных.
2. Выработать секретный ключ по протоколу Диффи-Хелмана.
3. Провести аутентификацию пользователей по «слово-вызов».
Требования к выполнению задания.Клиентское приложение должно содержать форму, на которой содержатся поля для ввода IP-адреса компьютера – сервера, поле для ввода информации, передаваемое на сервер и поле для получения информации, возвращаемой с сервера.
Приложение должен содержать кнопки Старт/Стоп для запуска и остановки сервера, поле для вывода информации, передаваемой с сервера, и поля для вывода информации, передаваемой клиентами.
Приложение также должно содержать генератор ключей для протокола Диффи-Хелмана и вычисления секретного ключа.
При сдаче необходимо установить клиентскую часть на один компьютер, а серверную часть приложения на другой компьютер, и продемонстрировать диалог обмена данными.
Программно-аппаратные средства.Компьютерная лаборатория, состоящая из компьютеров, соединенных в локальную сеть, пакет Delphi 7 (Delphi 2005).
Задание на лабораторную работу
- Изучить теоретический материал по данной лабораторной работе.
- Ознакомиться с указаниями по программированию в на языке Pascal в среде Delphi.
- Разработать программный комплекс, представляющий собой клиент-серверное приложение в среде Delphi, осуществляющее передачу данных между двумя хостами в сети.
- Выполнить пробное шифрование/расшифровку данных, передаваемых по сети в рамках компьютерного класса. Вставить в отчет полученные данные, описать методику выполнения задания.
- Ответить на контрольные вопросы в конце задания.
Теоретический материал.
Рассмотрим процедуры создания приложений для обмена сообщениями в сети по протоколам TCP/IP.
Приложение TCT-клиент в Delphi.
- Нанесите на форму элемент TidTCPClient с панели IndyClient, два элемента типа Tedit для ввода сообщений серверу и получения ответа, и кнопку TButton.
- В свойстве Host элемента TidTCPClient укажите IP-адрес сервера, а в свойстве Port задайте номер порта (тот же, что у сервера).
- Щелкните дважды по элементу Button1 и в появившемся окне введите следующий код:
Procedure TForm1.Button1click(Sender: TObject);
Begin
IdTCPClient1.Connect;
IdTCPClient1.Writeln(Edit1.Text);
Edit2.Text:= IdTCPClient1.ReadLn;
IdTCPClient1.Disconnect;
End;
- Добавьте код функции MD5, взятый из описания лабораторной работы №3.
- Запустите оба приложения и протестируйте полученную программу.
КОНТРОЛЬНЫЕ ВОПРОСЫ
- На какой вкладке Delphi находятся компоненты для создания клиент-серверного приложения?
- Какие основные свойства надо установить в компоненте Indy Server?
- Какие основные свойства надо установить в компоненте Indy Client?
- Какой протокол используют компоненты Indy Server и Indy Client для установления связи по локальной сети? Можно ли использовать приложение в сети Интернет?
ЛАБОРАТОРНАЯ РАБОТА № 4
Название работы.Решение в локальной сети задачи аутентификация пользователей.
Цель. Ознакомиться с основными алгоритмами аутентификации пользователей в сети, электронно- цифровой подписи, сертификации. Разработать комплекс программ в Delphi для пересылки и проверки идентификаторов пользователей, решения задачи распределения секретного ключа, идентификации посланий на основе электронно- цифровой подписи и сертификатов.
Программно-аппаратные средства.Компьютерная лаборатория, состоящая из компьютеров, соединенных в локальную сеть, пакет Delphi 7 (Delphi 2005).
Задание на лабораторную работу
- Изучить теоретический материал по данной лабораторной работе.
- Разработать программный комплекс в среде Delphi генерации параметров метода RSA и пересылки (публикации) открытого ключа в сети.
- Реализовать алгоритм генерации электронно- цифровой подписи с использование закрытого ключа метода RSA и функции хеширования MD5.
- Реализовать алгоритм проверки электронно- цифровой подписи с использование открытого ключа метода RSA и функции хеширования MD5.
- Выполнить пробную пересылку данных в рамках локальной сети компьютерного класса, снабженных ЭЦП. Вставить в отчет полученные данные, описать методику выполнения задания.
- Ответить на контрольные вопросы в конце задания.
Теоретический материал.
Одной из наиболее важных служб безопасности является аутентификация. Аутентификация – это подтверждение пользователем информационных услуг своего идентификатора. Аутентификация выполняется с помощью разных методов, из которых простейшим является предъявления пользователем серверу секретного слова – пароля, известного только пользователю и серверу.
Хеш-функции
Хеш-функции играют в информационной защите важную роль, создавая для электронного документа его «моментальный снимок» и тем самым защищая документ от дальнейшей модификации или подмены.
В широком смысле функцией хеширования называется функция H, удовлетворяющая следующим основным свойствам:
- Хеш-функция Н может применяться к блоку данных любой длины.
- Хеш-функция Н создает выход фиксированной длины (равно, например, 128 бит для классической функции хеширования MD5, и 160 бит для функции SHA1).
- Н (М) вычисляется относительно быстро (за полиномиальное время от длины сообщения М).
- Для любого данного значения хеш-кода h вычислительно невозможно найти M такое, что Н (M) = h.
- Для любого данного х вычислительно невозможно найти y x, что H(y) = H(x).
- Вычислительно невозможно найти произвольную пару (х, y) такую, что H(y) = H (x).
Термин вычислительно невозможно означает здесь, что в настоящее время решение этой задачи либо требует слишком большого интервала времени (например, более сотни лет), либо использования слишком больших вычислительных ресурсов, чтобы решение задачи имело смысл.
Первые три свойства требуют, чтобы хеш-функция создавала хеш-код для любого сообщения. Четвертое свойство определяет требование односторонности хеш-функции: легко создать хеш-код по данному сообщению, но невозможно восстановить сообщение по данному хеш-коду.
Схемы аутентификации.
Поскольку при передаче данных по сети никто не застрахован от возможности чтения данных на промежуточных узлах, то передача пароля по сети в открытом виде является опасным. Поэтому для надежной аутентификации и сохранения пароля от взлома используются разные схемы сетевой аутентификации. Здесь мы рассмотрим следующие три схемы:
ВАРИАНТЫ ЗАДАНИЙ
Четные варианты. Разработать приложение, осуществляющее аутентификацию пользователей на основе слова-вызова.
Нечетные варианты. Разработать приложение, осущеставляющее аутентификацию пользователей на основе электронно-цифровой подписи, генерируемой с помощью метода RSA.
КОНТРОЛЬНЫЕ ВОПРОСЫ
- Что такое аутентификация? Перечислите основные методы аутентификации.
- Что такое хеш-преобразование? Перечислите основные свойства хеш-функций.
- В чем заключается аутентификация на основе слова-вызова?
- Что такое электронно-цифровая подпись? Как она формируется?
- Как выполняется проверка послания, подписанного ЭЦП?
- Что такое сертификация X.509? Каковые преимущества имеет аутентификация на основе сертификатов по сравнению с другими видами сертификации?
- Что входит в состав сертификата ?
- Какие основные фунции выполняется Центр Сертификации X.509?
- Сколько различных ключей используется в процедуре аутентификация на основе сертификатов, и каким образом распространяются эти ключи?
- Каким образом осуществляется проверка подлинности сертификата?
Приложение 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);
varpbuf: ^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;
ЛИТЕРАТУРА:
- С.Г.Баричев, В.В.Гончаров, Р.Е.Серов. Основы современной криптографии – Москва, Горячая линия – Телеком, 2001
- А.В.Беляев. "Методы и средства защиты информации" (курс лекций). /internet/infsecure/index.shtml
- А. А. Болотов, С. Б. Гашков, А. Б. Фролов, А. А. Часовских, «Алгоритмические основы эллиптической криптографии». Учебное пособие. М.: Изд-во МЭИ. 2000 г., 100 с.
- А.Володин. «Кто заверит ЭЦП», журнал «Банковские системы», ноябрь 2000, /system/2000-11/04.html
- Т.Илонен. Введение в криптографию (Ylonen Tatu. Introduction to Cryptography), /psw/crypto/intro.html
- Ш.Т. Ишмухаметов. Технологии защиты информации в сети, Казань, 2008, 91 с. /files/e9zxcqos9
- Н.Коблиц. Теория чисел и криптография, М.:, ТВР, 2001 http://gabro.ge/biblio/0708/0081/file/Cryptography/Koblic_-_Teoriya_Chisel_i_Cryptografiya.rar
- О.Р. Лапонина. Криптографические основы безопасности, курс Интернет-университета, /department/security/networksec
- Р.Лидл, Г.Нидеррайтер. Конечные поля, в 2 т., пер.с англ., М.: Мир, 1998, 438 с.
- А.А. Молдовян, Н.А. Молдовян, Б.Я. Советов. Криптография. М., Лань, 2001
- А.А. Молдовян, Н.А. Молдовян, Введение в криптосистемы с открытым ключом, БХВ-Петербург, 2005, с. 286 /vvedenie_v_kriptosistemy_s_otkrytym_klyuchom
- А.Г.Ростовцев. Алгебраические основы криптографии, СПб, Мир и Семья, 2000.
- А.Г.Ростовцев, Е.Б.Маховенко. Теоретическая криптография. – СПб.: АНО, ПО “Профессионал”, 2005,/index.php?newsid=1265
- Г.Семенов. «Цифровая подпись. Эллиптические кривые».
http://www.morepc.ru/security/crypt/os200207010.html?print
14. В.Столлингс. Основы защиты сетей. Приложения и стандарты, М.: Вильямс, 2002, 429 с.
- Брюс Шнайер. Прикладная криптография, 2-е издание: протоколы, алгоритмы и исходные тексты на языке С, /psw/crypto/appl_rus/appl_cryp.htm
- Dr. Michael Ganley, Thales eSecurity Ltd. Метод эллиптических кривых, /rsp/eliptic_curve_cryptography.htm
- В.М.Фомичев. Дискретная математика и криптология, Диалог-МИФИ, 2003, 399 с.
- Сайт Криптографический ликбез - http://www.ssl.stu.neva.ru/psw/crypto.html
- Jovan Dj. Golic. Cryptanalysis of Alleged A5 Stream Cipher, Beograd, Yugoslavia, /a5-hack.htm
- Ю. Спектор. Использование инструментов криптографии в Delphi-приложе-ниях, /asp/viewitem.asp?catalogID=1271
ЛАБОРАТОРНАЯ РАБОТА № 1
Название работы. Реализация в среде Excel алгоритма RSA шифрования с открытым ключом.
Цель. Ознакомиться с аппаратом программирования на языке Visual Basic for Applications, примерами программ для решения простых задач. Разработать и написать в среде Excel программу выработки пар «открытый/закрытый» ключ по методу RSA. Выполнить шифрование конфиденциальных данных.
Программно-аппаратные средства.Компьютерная лаборатория, пакет Microsoft Office.
Задание на лабораторную работу
- Изучить теоретический материал по данной лабораторной работе.
- Ознакомиться с указаниями по программированию в на языке VBA в среде Excel.
- Разработать программный комплекс в среде Excel генерации параметров метода RSA, шифрования/расшифровки данных.
- Выполнить пробное шифрование/расшифровку данных, передаваемых по сети в рамках компьютерного класса. Вставить в отчет полученные данные, описать методику выполнения задания.
- Ответить на контрольные вопросы в конце задания.
Указания к выполнению лабораторной работе.