Лабораторная работа №4x

реклама
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ
ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Институт
Кафедра
Кибернетики
Оптимизации систем управления
ОБМЕН КЛЮЧАМИ ПО ДИФФИ-ХЕЛЛМАНУ
Отчёт по лабораторной работе №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);
}
}
}
Выводы:
распределения
в
ходе
ключей
программирования
С#.
проделанной
работы
Диффи-Хеллмана
Полученный
и
был
изучен
реализован
программный
продукт
алгоритм
на
языке
отвечает
требованиям, предъявляемым к системе открытого распространения ключей
Диффи-Хеллмана.
Скачать