Не следует упускать из виду проблему аутентификации открытых ключей. Корректность протоколов с использованием асимметричных шифров может быть обеспечена только в случае, если все открытые ключи в справочнике открытых ключей являются подлинными. Если открытый ключ какого-либо абонента нарушителю удастся подменить, то секретные сообщения, посланные данному абоненту, будут доступны нарушителю. Таким образом, двухключевые шифры обеспечивают решение проблемы распределения секретных ключей, однако проблема аутентификации сохраняется и имеет фундаментальный характер, хотя требование подтверждения подлинности (аутентификации) относится уже к открытому, а не к секретному ключу. В неявном виде аутентификация открытого ключа включает в себя аутентификацию секретного ключа, [Молдовян Н.А. и др., 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.1. Математические основы алгоритмов используемых в работе
При создании программы возник вопрос: каким образом представлять большие числа? Решение было принято о том что число можно занести в массив типа unsigned char в который помещается два шестнадцатеричных числа, которые обрабатываются как 256-разрядные:
Это позволяет значительно упростить функции.
Размещение значений в массиве обратное, т.е. число “FF AB C4” в массиве будет представлено как: unsigned char a[3]={0xC4, 0xAB, 0xFF};
Все функции в программе предназначены для работы с 256-битными значениями.
Алгоритмы арифметики целых чисел и полиномов во многом похожи, поскольку представление целого числа а в системе счисления с основанием B в виде:
Ниже описаны алгоритмы, используемые в программном продукте. Алгоритм представлен по следующей структуре: теоретические основы и листинг программы.
Операции сложения и вычитания для чисел и полиномов выполняются практически одинаково. Отличие заключается в том, что при сложении (вычитании) чисел возникает перенос в следующий разряд, а при операциях над полиномами перенос отсутствует.
Пусть неотрицательные целые числа а и 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;
}
Операция умножения является одной из наиболее трудоемких и вместе с функцией деления определяет время работы алгоритма.
Пусть неотрицательные целые числа а и 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].