Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы данных и знаний. Управление базами и защита информации учебное п

.pdf
Скачиваний:
3
Добавлен:
15.11.2022
Размер:
1.29 Mб
Скачать

Используется 160-битный буфер для хранения промежуточных и окончательных результатов хэш-функции. Буфер может быть представлен как пять 32-битных регистров A, B, C, D и E. Эти регистры инициализируются следующими шестнадцатеричными числами:

A = 67452301;B = EFCDAB89;C = 98BADCFE;D = 10325476; E = C3D2E1F0

Шаг 4: обработка сообщения в 512-битных (16-словных) блоках. Основой алгоритма является модуль, состоящий из 80 циклических обработок.

Все 80 циклических обработок имеют одинаковую структу-

ру (рис. 7.4).

Рис. 7.4. Обработка очередного 512-битного блока A

171

Каждый цикл получает на входе текущий 512-битный обрабатываемый блок Yq и 160-битное значение буфера ABCDE

иизменяет содержимое этого буфера.

Вкаждом цикле используется дополнительная константа Кt, которая принимает только четыре различных значения:

0 t 19 Kt = 5A827999

(целая часть числа [230 × 21/2]) 20 t 39 Kt = 6ED9EBA1

(целая часть числа [230 × 31/2])

40 t 59 Kt = 8F1BBCDC

(целая часть числа [230 × 51/2]) 60 t 79 Kt = CA62C1D6

(целая часть числа [230 × 101/2])

Для получения SHAq+1 выход 80-го цикла складывается со значением SHAq. Сложение по модулю 232 выполняется независимо для каждого из пяти слов в буфере с каждым из соответствующих слов в SHAq.

Шаг 5: выход

После обработки всех 512-битных блоков выходом L-й стадии является 160-битный дайджест сообщения (рис. 7.5).

Рассмотрим более детально логику в каждом из 80 циклов обработки одного 512-битного блока. Каждый цикл можно представить в виде

A, B, C, D, E (CLS5 (A) + ft (B, C, D) + E + Wt + Kt), A, CLS30 (B), C, D,

где A, B, C, D, E – пять слов из буфера; t – номер цикла, 0 t 79; ft – элементарная логическая функция; CLSs – циклический левый сдвиг 32-битного аргумента на s битов; Wt – 32-битное слово, полученное из текущего входного 512-битного блока; Kt – дополнительная константа; + – сложение по модулю 232.

172

Рис. 7.5. Логика выполнения отдельного цикла

Каждая элементарная функция получает на входе три 32битных слова и создает на выходе одно 32-битное слово. Элементарная функция выполняет набор побитных логических операций, т.е. n-й бит выхода является функцией от n-х битов трех входов. Функции следующие:

Номер цикла

ft (B, C, D) (0 t 19)

(B ^C)^_ (¬ B^ D) (20 t 39)

B xorCxor D (40 t 59)

(B ^C)^_ (B^ D)^_ (C^ D) (60 t 79)

B xorCxor D ^_–логическое сложение;

173

^–логическое умножение; _B – логическое отрицание.

На самом деле используются только три различные функции. Для 0 t 19 функция является условной: if B then C else D. Для 20 t 39 и 60 t 79 функция создает бит четности. Для 40 t 59 функция является истинной, если два или три аргумента истинны. 32-битные слова Wt получаются из очередного 512-битного блока сообщения следующим образом (рис. 7.6).

Рис. 7.6. Получение входных значений каждого цикла из очередного блока

Первые 16 значений Wt берутся непосредственно из 16 слов текущего блока. Оставшиеся значения определяются следующим образом:

Wt = Wt-16 Wt-14 Wt-8 Wt-3

В первых 16 циклах вход состоит из 32-битного слова данного блока. Для оставшихся 64 циклов вход состоит из XOR нескольких слов из блока сообщения.

Алгоритм SHA-1 можно суммировать следующим образом: SHA0 = IV

SHAq+1 = Σ32 (SHAq , ABCDEq ) SHA = SHAL-1

где IV – начальное значение буфера ABCDE; ABCDEq – результат обработки q-го блока сообщения; L – число блоков в сообщении, включая поля добавления и длины; Σ32 – сумма по модулю

174

232, выполняемая отдельно для каждого слова буфера; SHA – значение дайджеста сообщения.

//Программная реализация Хэш-функции SHA-1 begin

Form1.Memo1.Lines.Add('используются 2 накопителя F и H'); Form1.Memo1.Lines.Add('1 состоит из 5 32 бит слов A B C D E'); Form1.Memo1.Lines.Add('2 состоит из 5 32 бит слов HO H1 H2 H3 H4');

Form1.Memo1.Lines.Add('Начальное значение H0-H4 ='); Form1.Memo1.Lines.Add('H0:=$67452301'); Form1.Memo1.Lines.Add('H1:=$EFCDAB89'); Form1.Memo1.Lines.Add('H2:=$98BADCFE'); Form1.Memo1.Lines.Add('H3:=$10325476'); Form1.Memo1.Lines.Add('4:=$C3D2E1F0'); Form1.Memo1.Lines.Add('Значение ключей ='); Form1.Memo1.Lines.Add('K1=$5A827999 для j=0-19'); Form1.Memo1.Lines.Add('K2=$6ED9EBA1 для j=20-39'); Form1.Memo1.Lines.Add('K3=$8F1BBCDC для j=40-59'); Form1.Memo1.Lines.Add('K4=$CA62C1D6 для j=60-79'); H0:=HC0;//$67452301;

H1:=HC1;//$EFCDAB89;

H2:=HC2;//$98BADCFE;

H3:=HC3;//$10325476;

H4:=HC4;//$C3D2E1F0; Hout:='';

Form1.Memo1.Lines.Add('Регистр H---->F A:=H0;B:=H1;C:=H2;D:=H3;E:=H4');; A:=H0;B:=H1;C:=H2;D:=H3;E:=H4; Form1.Memo1.Lines.Add('Создается массив из 80 слов 0-79'); Form1.Memo1.Lines.Add('первые 0–15 равны 16 словам хеши-

рованной строки');

For j:= 0 to 15 do W[j]:=Mc32[j]; Form1.Memo1.Lines.Add('остальные 64 слова заполняются по формуле');

175

Form1.Memo1.Lines.Add('Wj<--Sj(Wj-3+Wj-8+Wj-14+Wj-16'); Form1.Memo1.Lines.Add('Знак + означает сложениепо модулю2'); Form1.Memo1.Lines.Add('Sj означает циклический сдвиг влево на о ,bn');

Form1.Memo1.Lines.Add('ключи 16–79 рассчитаны ниже'); For j:=16 to 79 do begin

A1:= W[j-3]; B1:= W[j-8];c1:=W[j-14]; D1:= W[j-16];

Mh:=((A1 Xor B1 Xor C1 Xor D1)); BIT:= (Mh Shl 1) or (Mh Shr 31); W[j]:=BIT;

Form1.Memo1.Lines.Add('слово= '+Inttostr(j)+' '+inttostr(bit)); end;

Form1.Memo1.Lines.Add('Производится цикловое 0–79 расчет значений регистра H');

for t:=0 to 79 do begin

if (t>=0) AND (t<=19) then TEMP:=(ROL(A,5)xor ((B AND C) OR ((NOT B) AND D))

xor E xor K1 xor W[t]) and $FFFFFFFF ;

if (t>=20) AND (t<=39) then TEMP:=(ROL(A,5)xor(B XOR C XOR D)

xor E xor K2 xor W[t]) and $FFFFFFFF;

if (t>=40) AND (t<=59) then TEMP:=(ROL(A,5) xor((B AND C) OR (B AND D) OR (C AND D))

xor E xor K3 xor W[t]) and $FFFFFFFF;

if (t>=60) AND (t<=79) then TEMP:=(ROL(A,5) xor (B XOR C XOR D)

xor E xor K4 xor W[t]) and $FFFFFFFF; E:=D; D:=C; C:=ROL(B,30); B:=A; A:=TEMP;

Form1.Memo1.Lines.Add('E= '+inttostr(E)+' D= '+inttostr(D)+' C= '+inttostr(C)

+ 'B= '+inttostr(B)+' A= '+inttostr(A)); end;

Form1.memo1.Lines.Add('окончательное значение переменных

H0-H4');

176

H0:= (H0 xor A)and $FFFFFFFF ; H1:= (H1 xor B)and $FFFFFFFF; H2:= (H2 xor C)and $FFFFFFFF ; H3:= (H3 xor D)and $FFFFFFFF; H4:= (H4 xor E)and $FFFFFFFF ; FOrm1.memo1.lines.Add(inttostr(h0)); FOrm1.memo1.lines.Add(inttostr(h1)); FOrm1.memo1.lines.Add(inttostr(h2)); FOrm1.memo1.lines.Add(inttostr(h3)); FOrm1.memo1.lines.Add(inttostr(h4)); FOrm1.memo1.lines.Add('');

FOrm1.memo1.lines.Add('Битовое представление H0-H4'); Hesh(1,h0,s0);

FOrm1.memo1.lines.Add(s0);

Hesh(2,h1,s1);

FOrm1.memo1.lines.Add(s1);

Hesh(3,h2,s2);

FOrm1.memo1.lines.Add(s2);

Hesh(4,h3,s3);

FOrm1.memo1.lines.Add(s3);

Hesh(5,h4,s4);

FOrm1.memo1.lines.Add(s4); FOrm1.memo1.lines.Add('Строковая хеш-функция'); PrHesh;

FOrm1.memo1.lines.Add(Sxesh); FOrm1.memo1.lines.Add('представление 160-битной строки в число');

PrHesh1(mh);

FOrm1.memo1.lines.Add(inttostr(mh));

end;

7.4. Электронная подпись

Алгоритм электронной подписи основан в конечном итоге на алгоритме RSA. В настоящее время криптосистема RSA встраивается во многие коммерческие продукты, число которых

177

постоянно увеличивается. Вкратце суть работы этого алгоритма можно описать так:

1.Выбираются большие простые числа X и Y, и вычисляется их произведение: Q = X·Y; число Q называется модулем.

2.Выбирается число D > 1, которое должно быть взаимно простым с значением выражения (X–1)·(Y–1), т.е. не должно иметь с ним общих делителей, кроме единицы.

3.Вычисляется число A таким образом, что (D·A–1) делит-

ся на (X–1)·(Y–1).

Пара чисел (Q, D) будет открытым (public) ключом, а пара (Q, A) – секретным (private) ключом. Исходный текст шифруется при помощи открытого ключа, для его скодирования нужен секретный ключ. Кодирование сообщения M выполняется по формуле C = M^D (mod Q), где С – шифрованный текст. Обрат-

ная операция: M = C^A (mod Q).

Для того чтобы вскрыть шифр RSA, необходимо разложить число Q (которое можно взять из открытого ключа) на простые множители. И здесь начинаются проблемы, ведь с точки зрения математики сложно предсказать, является ли многозначное число простым. Есть теоремы, которые могут быстро установить, что число составное, но если условия теоремы не выполняются, то это еще не гарантирует, что число простое. Далее, нет теорем, которые помогают хотя бы оценить количество простых сомножителей числа и порядок их величины. Обе задачи на компьютере решаются только перебором всех значений, что в случае большого многозначного числа за разумное время выполнить невозможно.

В конце любого письма мы привыкли ставить подпись с тем, чтобы уведомить получателя о том, кто является отправителем данного документа. Кроме того, подпись ответственного лица придает документу юридическую силу. По мере внедрения электронных средств доставки документов (факс и электронная

178

почта) проблема их достоверности обрела крайнюю актуальность. Ведь копирование любой последовательности битов или пикселей не представляет никакой трудности. Современные телекоммуникационные каналы уязвимы для перехвата и искажения пересылаемых документов.

Рассмотрим сначала то, от каких действий злоумышленника должна защищать система идентификации.

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

Модификация документа. Получатель модифицирует полученный документ и утверждает, что именно такую версию документа он и получил.

Подделка. Субъект фабрикует сообщение и утверждает, что оно ему прислано.

Перехват. Злоумышленник С перехватывает сообщение, посланное А к В с целью модификации.

Маскировка. Посылка сообщения от чужого имени. Повтор. Злоумышленник С посылает повторно сообщение

от А к Б, перехваченное им ранее.

Решение практически всех этих проблем может быть реализовано с помощью электронной подписи, базирующейся на алгоритме RSA. Рассмотрим принципы, на которых базируется электронная подпись.

Пусть имеются секретные коды d, p и q, а также открытые e и n=pq. Пусть также А передает сообщение DATA адресату Б. Электронная подпись отправителя А базируется на его секретном ключе и открытом ключе получателя Б. Сначала отправитель с помощью хэш-функции (SHS – Secure Hash Standard) генерирует дайджест своего сообщения длиной 160 бит (5 слов). Затем с помощью своего секретного ключа он формирует элек-

179

тронную подпись. При этом А не может отказаться от того, что именно он послал сообщение, т.к. только он знает свой секретный ключ. Электронную подпись нельзя использовать повторно и подписанный документ нельзя модифицировать, т.к. любые модификации неизбежно изменят его дайджест, а следовательно, и электронную подпись. Получатель с помощью открытого ключа дешифрует код электронной подписи, а затем с использованием дайджеста проверяет ее корректность.

Национальный институт стандартов США принял стандарт

DSS (Digital Signature Standard), в основу которого легли алго-

ритмы Эль-Гамаля и RSA.

Стандарт цифровой подписи DSS. Национальный институт стандартов и технологии США (NIST) разработал федеральный стандарт цифровой подписи DSS. Для создания цифровой подписи используется алгоритм DSA (Digital Signature Algorithm). В качестве хэш-алгоритма стандарт предусматривает использование алгоритма SHA-1 (Secure Hash Algorithm). DSS первоначально был предложен в 1991 г. и пересмотрен в 1993 г. в ответ на публикации, касающиеся безопасности его схемы.

Подход DSS. DSS использует алгоритм, который разрабатывался для использования только в качестве цифровой подписи. В отличие от RSA его нельзя использовать для шифрования или обмена ключами. Тем не менее это технология открытого ключа. Рассмотрим отличия подхода, используемого в DSS для создания цифровых подписей, от применения таких алгоритмов,

как RSA.

В подходе RSA подписываемое сообщение подается на вход сильной хэш-функции, которая создает хэш-код фиксированной длины. Для создания подписи этот хэш-код шифруется с использованием закрытого ключа отправителя. Затем сооб-

180