Смекни!
smekni.com

Реализация системы распространения ключей на основе алгоритма Диффи-Хеллмана длиной 256 бит (стр. 2 из 5)

Не следует упускать из виду проблему аутентификации открытых ключей. Корректность протоколов с использованием асимметричных шифров может быть обеспечена только в случае, если все открытые ключи в справочнике открытых ключей являются подлинными. Если открытый ключ какого-либо абонента нарушителю удастся подменить, то секретные сообщения, посланные данному абоненту, будут доступны нарушителю. Таким образом, двухключевые шифры обеспечивают решение проблемы распределения секретных ключей, однако проблема аутентификации сохраняется и имеет фундаментальный характер, хотя требование подтверждения подлинности (аутентификации) относится уже к открытому, а не к секретному ключу. В неявном виде аутентификация открытого ключа включает в себя аутентификацию секретного ключа, [Молдовян Н.А. и др., 2004].

1.3. Описание средств разработки.

Проект реализован с помощью среды C++Builder 6, которая позволяет разрабатывать серверы и клиенты Web-служб. C++Builder 6 обеспечивает поддержку клиентов Web-служб, использующих как SOAP encoding, так и Document Literal style. Document Literal style используется в Microsoft. Net Web Services. Предоставляя набор выскокоуровненвых компонент и визардов, включая автоматическую публикацию WSDL-описателей Web-служб в run-time и генерацию кода на основе WSDL (WSDL Importer), C++Builder 6 позволяет разработчикам легко адаптировать существующие приложения для работы в режиме Web-служб и доступа к ним как во внутрикорпоративной сети, так и через Web.

C++ Builder позволяет задействовать ранее созданный исходный код на C и С++. Можно работать с унаследованными проектами и приложениями третьих фирм на Borland C++ и Visual C++ внутри интегрированной среды разработки C++ Builder. Расширенная совместимость с исходным кодом MS Visual C++, включая поддержку исходных текстов MSDN и SDK, позволяет использовать новейшие версии библиотек MFC и ATL. За счет поддержки стандарта C++, RTTI, библиотек STL, RTL, ATL и MFC, позволяет компилировать и собирать проекты, созданные ранее на отличных от C++ Builder средствах разработки для C/C++.

Глава 2. Программная реализация открытого
распространения ключей Диффи-Хеллмана.

2.1. Математические основы алгоритмов используемых в работе

При создании программы возник вопрос: каким образом представлять большие числа? Решение было принято о том что число можно занести в массив типа unsigned char в который помещается два шестнадцатеричных числа, которые обрабатываются как 256-разрядные:

Это позволяет значительно упростить функции.

Размещение значений в массиве обратное, т.е. число “FF AB C4” в массиве будет представлено как: unsigned char a[3]={0xC4, 0xAB, 0xFF};

Все функции в программе предназначены для работы с 256-битными значениями.

Алгоритмы арифметики целых чисел и полиномов во многом похожи, поскольку представление целого числа а в системе счисления с основанием B в виде:


где 0 < ai < В, аналогично представлению полинома
.

Ниже описаны алгоритмы, используемые в программном продукте. Алгоритм представлен по следующей структуре: теоретические основы и листинг программы.

2.1.1. Сложение и вычитание

Операции сложения и вычитания для чисел и полиномов выполняются практически одинаково. Отличие заключается в том, что при сложении (вычитании) чисел возникает перенос в следующий разряд, а при операциях над полиномами перенос отсутствует.

Пусть неотрицательные целые числа а и b заданы в системе счисления с основанием В:

где 0 <ai ; bi<B. Для удобства считаем, что оба числа имеют равную длину, при необходимости старшие разряды меньшего числа заполняем нулями.

Сложение выполняется «в столбик».

Алгоритм 1. Сложение целых чисел, [Молдовян Н.А. и др., 2004].

Вход. Целые числа

,
.

Выход. Сумма

.

1. Положить

2. Для i = 0, 1,...,п- 1 выполнить следующие действия.

2.1. Вычислить

2.2. Положить

,
.

3. Положить сп= s.

4. Результат:

.

Переменная s означает перенос в старший разряд и всегда принимает значение 0
(при ai+bi+s < B) или 1 (при ai+bi+s ≥ B). На шаге 2.1 Может произойти не более одного переноса. Действительно:

ai+bi+1 < (B-1)+(B-1)+1 < 2B-1<2B.

Вычитание аналогично сложению изменение только в шаге 2.1.

.

В этом случае если t отрицательное то у следующего элемента занимается 1.

Сложность алгоритма сложения и вычитания равна О(п).

Код функции summa(сумма) :

for (i=0;i<=32;i++){

s=a[i]+b[i]+buf; //Общее значение

c[i]=s;//число заносимое в ячейку

buf=(s)>>8;//остаток

}

Код функции sub(разность) c = a-b :

for(i=0;i<=31;i++){

s=a[i]-b[i]+buf;

buf=s>>8;

c[i]=s;

}

2.1.2. Умножение «в столбик».

Операция умножения является одной из наиболее трудоемких и вместе с функцией деления определяет время работы алгоритма.

Пусть неотрицательные целые числа а и b заданы в системе счисления с основанием B.

где 0 ≤ ai < B, 0 ≤ bi < B

Самый очевидный способ умножения — умножение «в столбик».

Алгоритм 2. Умножение целых чисел «в столбик», [Молдовян Н.А. и др., 2004].

Вход. Целые числа

,
где 0 < b ≤ a.

Выход. Произведение

1. Для i = 0, 1,...,п- 1 положить ci= 0

2. Для i = 0, 1,...,п- 1 выполнить следующие действия.

2.1. Для j = 0, 1,...,п- 1:

2.1.1. Положить s= 0.

2.1.2. Вычислить t = ci+j+aibj+s , ci+j=t (mod B) ,

.

2.2. Положить ci+n =s.

3. Результат:

Во внешнем цикле этого алгоритма вычисляются частичные произведения

, а во внутреннем — произведения
, где j = 0, 1, ..., п- 1. Текущий разряд произведения равен t (mod В), а очередной перенос:
. При этом на шаге 2.1.2 выполняется неравенство:

Сложность умножения в «столбик» О(n2).

Функция умножения реализована как умножение с вычислением модуля.

Код функции mult_mod (умножение по модулю) c=a*b (mod mod):

void mult_mod(unsigned char a[33],unsigned char b[33],unsigned char c[33]){

int i,j,k,s,t;

unsigned char d[65]={0};

for (k=0;k<=31;k++) c[k]=0; //очищение переменной

for(i=0;i<=31;i++){

s=0;

for(j=0;j<=31;j++){

t=d[i+j]+a[i]*b[j]+s;

d[i+j]=t;

s=t>>8;

}

d[i+32]=s;

}

modul(d,mod,c); //вычисление модуля mod - глобальная переменная

}

2.1.3. Возведение целого числа в квадрат.

Отдельно реализована функция возведения в квадрат.

Алгоритм 3. Возведение в квадрат, [Молдовян Н.А. и др., 2004].