МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» Институт Кафедра Кибернетики Оптимизации систем управления ОБМЕН КЛЮЧАМИ ПО ДИФФИ-ХЕЛЛМАНУ Отчёт по лабораторной работе №4 по дисциплине " Информационная безопасность и защита информации в сетях ЭВМ" Вариант 3 Выполнил: студент гр. 8ВМ23 Проверил: ассистент ____________ (подпись) ____________ (дата) М.А. Грицина ____________ Ф.А. Тузовский (подпись) ____________ (дата) Томск – 2012 Задание Составьте программное обеспечение, реализующее алгоритм обмена ключами. Ключи должны автоматически формироваться в файлы. Должна быть обеспечена наглядность выполнения алгоритма. Для созданного программного обеспечения проведите тестирование не менее чем на 10 различных наборах данных. Теория Зарождение двухключевой криптографии и основные криптосистемы с открытым ключом связаны с использованием функции возведения в большую дискретную степень по модулю большого простого числа f(x) = α x(mod p), где х — целое число. 1< x <р—1, р — k-битовое простое число, α первообразный корень по модулю р. Используя данную функцию, учеными Диффи и Хеллманом была показана возможность построения практически стойких секретных систем, которые не требуют передачи секретного ключа. Системой Диффи-Хеллмана называется следующий способ использования дискретного возведения в степень для обмена секретными ключами между пользователями сети с применением только открытых сообщений. Выбирается большое простое число р и соответствующий ему первообразный корень а < р. Для обеспечения стойкости рассматриваемой системы открытого шифрования на число р накладывается следующее условие: разложение числа р-1 на множители должно содержать, по крайней мере, один большой простой множитель; размер числа р должен быть не менее 512 бит. Механизм распределения секретных ключей по открытому каналу состоит в следующем. Каждый абонент выбирает случайный секретный ключ x и вырабатывает открытый ключ у, соответствующий выбранному секретному ключу, в соответствии с формулой y = α x (mod p). Два абонента А и В могут установить секретную связь без передачи секретного ключа следующим образом. Абонент А берет из справочника открытый ключ уB абонента В и, используя свой секретный ключ хА, вычисляет общий секретный ключ: Z AB ( yB ) X A ( X B ) X A X B X A (mod p) Аналогично поступает абонент В: Z BA ( y A ) X B ( X A ) X B X B X A (mod p) Таким образом, оба абонента сформировали одинаковый секретный ключ ZAB без использования какого-либо заранее оговоренного общего секрета. Владея только им известным секретом и используя его в качестве мастер-ключа, данная пара абонентов может зашифровывать направляемые друг другу сообщения. Указанные выше вычисления легко осуществимы для достаточно больших значений р, а, у и х (например, имеющих в двоичном представлении длину 4096 бит и более). Атакующему известны значения yB X (mod p) и y A X (mod p) , но для того чтобы вычислить ZAB, ОН должен решить задачу дискретного логарифмирования и определить либо хA, либо хB. Легко найти большие значения р (более 1024 бит), для которых задача дискретного логарифмирования является трудно решаемой. Если будут найдены вычислительно эффективные методы решения задачи дискретного логарифмирования, то метод Диффи-Хеллмана окажется несостоятельным — в связи с этим говорят, что данный метод открытого распределения ключей основан на сложности дискретного логарифмирования. В настоящее время в общем случае задача дискретного логарифмирования практически неразрешима, что дает возможность широкого практического применения метода Диффи-Хеллмана и многочисленных систем ЭЦП, основанных на сложности вычисления дискретных логарифмов. B A Ход работы Алгоритм реализован в виде клиент-серверного приложения (рис. 1 и 2). Сервер-приложение генерирует p и g, а также открытый и закрытый ключи X и Y. Клиент генерирует закрытый ключ и после получения от сервера чисел p и g вычисляет открытый ключ, который передает на сервер. Затем сервер и клиент вычисляют совместный ключ, используя свой закрытый ключ и открытый ключ партнера. Передача информации осуществляется при помощи сокетов. Рис.1. Внешний вид клиент-приложения Рис.2. Внешний вид сервер-приложения Листинг класса DiffiHellman using System; using System.Collections; using System.IO; namespace lab4 { internal class DiffiHellman { protected Int32 P; protected Int32 G; protected Int32 X; protected Int32 Y; protected Int32 Z; protected Int32 Ypartner; public Int32 SetP { set { if (value > 0) P = value; } } public Int32 SetG { set { if (value > 0) G = value; } } public Int32 SetX { set { if (value > 0) X = value; } } public Int32 SetYpartner { set { if (value > 0) Ypartner = value; } } public int generateX() { var rnd = new Random(); X = rnd.Next(); return X; } public int generateY() { Y = (int) powmod(G, X, P); return Y; } public int Prime32() { var rnd = new Random(); P = rnd.Next(10000000, 1000000000)*2 + 1; bool isprime = true; while (isprime) { var ub = (Int32) Math.Sqrt(P); int i; for (i = 3; i <= ub; i += 2) { if ((P%i) == 0) { isprime = false; break; } } if (!isprime) { P += 2; isprime = true; } else { isprime = false; } } return P; } public Int64 Prime64() { var rnd = new Random(); var buffer = new byte[sizeof (Int64)]; rnd.NextBytes(buffer); long y = BitConverter.ToInt64(buffer, 0); y = Math.Abs(y); if (y%2 == 0) y += 1; var isprime = true; while (isprime) { var ub = (Int64) Math.Sqrt(y); Int64 i; for (i = 3; i <= ub; i += 2) { if ((y%i) == 0) { isprime = false; break; } } if (!isprime) { y += 2; isprime = true; } else { isprime = false; } } return y; } public int PrimitiveRoot() { var fact = new ArrayList(); int phi = P - 1, n = phi; for (int i = 2; i*i <= n; ++i) if (n%i == 0) { fact.Add(i); while (n%i == 0) n /= i; } if (n > 1) fact.Add(n); for (G = 2; G <= P; ++G) { bool ok = true; for (int i = 0; i < fact.Count && ok; ++i) { ok &= powmod(G, phi/(int) fact[i], P) != 1; } if (ok) return G; } return -1; } public Int32 CommonKey() { Z = (int) powmod(Ypartner, X, P); return Z; } public Int64 powmod(int a1, int b, int p) { Int64 res = 1; Int64 a = a1; while (b > 0) if (b%2 == 1) { res = (res*a)%p; --b; } else { a = (a*a)%p; b >>= 1; } return res%p; } public void WriteToFile(string filename) { string text = ""; text += "Секретный ключ абонента: " + X + "\r\n"; text += "Окрытый ключ абонента: " + Y + "\r\n"; text += "Совместный ключ абонента: " + Z; File.WriteAllText(filename, text); } } } Выводы: распределения в ходе ключей программирования С#. проделанной работы Диффи-Хеллмана Полученный и был изучен реализован программный продукт алгоритм на языке отвечает требованиям, предъявляемым к системе открытого распространения ключей Диффи-Хеллмана.