Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Однонаправленные хэш.doc
Скачиваний:
6
Добавлен:
08.09.2019
Размер:
133.63 Кб
Скачать

1.1.4Алгоритм безопасного хэширования (Secure Hash Algorithm, sha)

NIST, вместе с NSA, для Стандарта цифровой подписи (Digital Signature Standard) разработал Алгоритм безопасного хэширования (Secure Hash Algorithm, SHA). (Сам стандарт называется Стандарт безопасного хэширования ( Secure Hash Standard, SHS), a SHA - это алгоритм, используемый в стандарте.) В соответствии с Federal Register:

Описание SHA

Во - первых, сообщение дополняется, чтобы его длина была кратной 512 битам. Используется то же дополне­ние, что и в MD5: сначала добавляется 1, а затем нули так, чтобы длина полученного сообщения была на 64 бита меньше числа, кратного 512, а затем добавляется 64-битовое представление длины оригинального сообщения.

Инициализируются пять 32-битовых переменных (в MD5 используется четыре переменных, но рассматриваемый алгоритм должен выдавать 160-битовое хэш-значение ):

А = 0×67452301

В = 0×efcdab89

С = 0×98badcfe

D = 0×10325476

E = 0×c3d2e1f0

Затем начинается главный цикл алгоритма. Он обрабатывает сообщение 512-битовыми блоками и продол­жается, пока не исчерпаются все блоки сообщения.

Сначала пять переменных копируются в другие переменные : А в а, В в b, С в с, D в d и Е в е.

Главный цикл состоит из четырех этапов по 20 операций в каждом (в MD5 четыре этапа по 16 операций в каждом). Каждая операция представляет собой нелинейную функцию над тремя из а ,b, с, d и е, а затем выполняет сдвиг и сложение аналогично MD5. В SHA используется следующий набор нелинейных функций :

ft (X, Y, Z) = Y)  ((X)  Z) , для t=0 до 19

ft (X, Y, Z) = Х Y Z , для t=20 до 39

ft (X, Y, Z) = Y) Z)  (Y Z) , для t=40 до 59

ft (X, Y, Z) = Х Y Z , для t=60 до 79

в алгоритме используются следующие четыре константы:

Кt = 0×5а827999, для t=0 до 19

Кt = 0×6ed9eba1 , для t=20 до 39

Кt = 0×sf1bbcdc, для t=40 до 59

Кt = 0×ca62cld6, для t=60 до 79

(Если интересно, как получены эти числа, то: 0×5а827999 = 21/2/4, 0×6ed9ebal = 31/2/4, 0×sflbbcdc = 51/2/4, 0×ca62cld6 = 101/2/4.)

Блок сообщения превращается из 16 32-битовых слов (М0 по М15) в 80 32-битовых слов (Wo no W79) с помощью следующего алгоритма :

Wt = Mt, для t = 0 по 15

Wt = (Wt-3Wt-8. Wt-14 Wt-16) <<< 1, для t = 16 no 79

Если t - это номер операции (от 1 до 80), Wt, представляет собой t-ый подблок расширенного сообщения, а <<< s - это циклический сдвиг влево на s битов, то главный цикл выглядит следующим образом:

FOR t = 0 to 79

TEMP = (а <<< 5) +ft (b, c, d) + e + Wt + Kt

e = d

d=c

b = a

c = b<<<30

a = TEMP

Сдвиг переменных выполняет ту же функцию, которую в MD5 выполняет использование в различных местах различных переменных.

Рисунок 22 — Одна операция SHA.

После всего этого а, b, с, d и е добавляются к А, В, С, D и Е, соответственно, и алгоритм продолжается для следующего блока данных. Окончательным результатом служит объединение А, В, C, D и Е.

1.1.5Хэш-функция гост

Эта хэш-функция появилась в России и определена в стандарте ГОСТ Р 34.11.94. В ней используется блочный алгоритм ГОСТ, хотя теоретически может использоваться любой блочный алгоритм с 64-битовым блоком и 256-битовым ключом. Функция выдает 256-битовое хэш-значение.

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

Описать работу алгоритма можно следующим образом: Hi = f(Mi, Hi-1), где Mi – входная последовательность, не подвергшаяся обработке, Hi-1 – значение хэш – кода предыдущей итерации, (оба операнда - 256-битовые величины).

Процедура вычисления функции f состоит из последовательности шагов:

Шаг 1:

  • Инициализируются переменные L (текущее значение длины обработанной части входной последовательности) и I (значение контрольной суммы);

  • Если длина входной необработанной последовательности больше 256 (|M|>256), алгоритм переходит к шагу 3, в противном случае производятся следующие действия:

Шаг 2.

  • L = (L + |M|) mod 256;

  • I = (I + (0256-|M| || M) mod 256, где 0256-|M| — последовательность битовых нулей длиной 256-|M|, || - конкатенация битовых строк. Таким образом, на этом этапе вычисляется текущее значение контрольной суммы.

  • H =  ((0256-|M| || M), H) — вычисляется значение функции хэширования  от аргументов, представляющих собой хэшируемый блок и начальный вектор хэширования (Н);

  • H =  (I, H) — результат данного вычисления и является окончательным результатм хэш – функции;

  • конец работы алгоритма.

Из входной последовательности выбирается очередной блок длиной 256 бит (M = M0 || M1) и производятся следующие действия:

Шаг 3:

  • H =  (M0, H);

  • L = (L + |M|) mod 256;

  • I = (I + M0) mod 256;

  • M = M0;

  • Переход к шагу 2.

Вычисление функции  состоит из следующих этапов:

  1. При помощи линейного смешивания Mi, Hi-1 и некоторых констант генерируется четыре ключа шифрования ГОСТ;

  2. осуществляется зашифрование четырех подблоков (составляющих начальный вектор хэширования Н) по 64 бита каждый в соответствии с алгоритмом ГОСТ 28147 – 89 в режиме простой замены;

  3. перемешивающая функция применяется к результату зашифрования.

Генерация секретных ключей.

При генерации секретных ключей используются данные Н и М (входная последовательность, представленная в двоичном виде) и инициализируются следующие константы:

С2 = С4 = 0256 и С3 = 180811602411608(0818)21808×(0818)4(1808)4, где ak – двоичная последовательность из k бинарных знаков а – {0, 1}. После чего выполняется алгоритм:

I = 1; U = H; V = M;

W = U  V;

K1 = P(W);

For i=2 to 4

U = A(U)  Ci

V = A(A(V))

W = U  V

Ki = P(W)

Функции P представляет собой перестановку s(i+1+4(k-1)) = 8i+k, i = 03, k = 18 над подблоками длиной 8 бит исходной двоичной последовательности длиной 256 бит. Таким образом, последовательность x32 || … || x1 преобразуется в последовательность xs(32) || … || xs(1). Функцией А(Х) обозначают следующее преобразование последовательности, разделенной на 4 подблока по 64 бита каждый: A(X) = (x1  x2) || x4 || x3 || x2.

Шифрующее преобразование.

Начальный вектор Н разбивается на 4 подблока hi длиной 64 бита, и каждый подблок зашифровывается на своем ключе Ki, то есть si = Eki(hi) (i=1,2,3,4). В результате получается последовательность S = s1 || s2 || s3 || s4.

Перемешивающая функция.

Сначала исходная последовательность разбивается на шестнадцать 16-битных подблоков ni i=116 и при помощи регистра сдвига с обратной связью преобразуется в последовательность следующего вида:

n1  n2  n3  n4  n13  n16 || n16 || … || n2.

Если обозначить данную функцию через , то исходная функция хэширования -  (M, H) = 61 ((H   (M  12(S))), где степень функции  обозначает, сколько раз она применяется к битовой последовательности.