Шаг 5: выход

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

Рассмотрим более детально логику в каждом их 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 – номер цикла.

Ft – элементарная логическая функция.

CLSs – циклический левый сдвиг 32-битного аргумента на s битов.

Wt – 32-битное слово, полученное из текущего входного 512-битного блока.

Kt – дополнительная константа.

+ - сложение по модулю 2^32.

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

Алгоритм главного цикла:

For t:=0 to 79 do begin

TEMP = (A<<<5) + Ft(B,C,D) + E + Wt + Kt

E = D

D = C

C = B<<<30

B = A

A = TEMP

end;

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

На самом деле используются только три различных функции.

Для 0 ≤ t ≤19 фунуцией является условие: if B then C else D. Для 20≤ t ≤39 и 60≤ t ≤79 функция создает бит четности. Для 40≤ t ≤59 функция является истинной, если два или три аргумента истинны.

32-битные слова Wt получаются из очередного 512-битного блока сообщения следующим образом.

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

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

Таблица 1. Элементарные функции в хэш-функции SHA

Номер цикла Ft(B,C,D)
(0 ≤ t ≤19) (B&C)V(not B&D)
(20≤ t ≤39) B xor C xor D
(40≤ t ≤59) (B&C)V(B&D)V(C&D)
(60≤ t ≤79) B xor C xor D

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

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

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

SHA0 = IV

SHAq+1 = ∑32 (SHAq,ABCDEq)

SHA = SHAL+1

Где

IV – начальное значение буфера ABCDE.

ABCDEq – результат обработки q-го блока сообщения.

L – число блоков в сообщении, включая поля добавления и длины.

∑32 – сумма по модулю 2^32, выполняемая отдельно для каждого слова буфера.

SHA – значение дайджеста сообщения.

Сведения об успешных криптографических вскрытиях SHA отсутствуют. Так как эта однонаправленная хэш-функция выдает 160-хэш значение, она устойчивее к вскрытию грубой силой (включая вскрытие методом дня рождения), чем 128-битовые хэш-функции.

Пример:

текст: abc

хэш-код: A9993E364706816ABA3E25717850C26C9CD0D89D

http://www.itl.nist.gov/fipspubs/fip180-1.htm

SHA2

В 2001 году NIST принял в качестве стандарта три хэш-функции с существенно большей длиной хэш-кода. Часто эти хэш-функции называют SHA-2 или SHA-256, SHA-384 и SHA-512 (соответственно, в названии указывается длина создаваемого ими хэш-кода). Эти алгоритмы отличаются не только длиной создаваемого хэш-кода, но и длиной обрабатываемого блока, длиной слова и используемыми внутренними функциями. Сравним характеристики этих хэш-функций.

Алгоритм Длина сообщения (в битах) Длина блока (в битах) Длина слова (в битах) Длина дайджеста сообщения (в битах) Безопасность (в битах)
SHA-1 <264        
SHA-256 <264        
SHA-384 <2128        
SHA-512 <2128        

Под безопасностью здесь понимается стойкость к атакам типа "парадокса дня рождения".

В данных алгоритмах размер блока сообщения равен m бит. Для SHA-256 m = 512, для SHA-384 и SHA-512 m = 1024. Каждый алгоритм оперирует с w-битными словами. Для SHA-256 w = 32, для SHA-384 и SHA-512 w = 64. В алгоритмах используются обычные булевские операции словами, а также сложение по модулю 2w, правый сдвиг на n бит SHRn (x), где х - w-битное слово, и циклические (ротационные) правый и левый сдвиги на n бит ROTRn (x) и ROTLn (x), где х - w-битное слово.

SHA-256 использует шесть логических функций, при этом каждая из них выполняется с 32-битными словами, обозначенными как x, y и z. Результатом каждой функции тоже является 32-битное слово.

Ch (x, y, z) = (x ∧ y) Å (x ∧ z)

Maj (x, y, z) = (x ∧ y) Å (x ∧ z) Å (y ∧ z)

0{256} (x) = ROTR2 (x) Å ROTR13 (x) Å ROTR22 (x)

1{256} (x) = ROTR6 (x) Å ROTR11 (x) Å ROTR25 (x)

σ0{256} (x) = ROTR7 (x) Å ROTR18 (x) Å SHR3 (x)

σ1{256} (x) = ROTR17 (x) Å ROTR19 (x) Å SHR10 (x)

SHA-384 и SHA-512 также используют шесть логических функций, каждая из которых выполняется над 64-битными словами, обозначенными как x, y и z. Результатом каждой функции является 64-битное слово.

Ch (x, y, z) = (x ∧ y) Å (x ∧ z)

Maj (x, y, z) = (x ∧ y) Å (x ∧ z) Å (y ∧ z)

0{512} (x) = ROTR28 (x) Å ROTR34 (x) Å ROTR39 (x)

1{512} (x) = ROTR14 (x) Å ROTR18 (x) Å ROTR41 (x)

σ0{512} (x) = ROTR1 (x) Å ROTR8 (x) Å SHR7 (x)

σ1{512} (x) = ROTR19 (x) Å ROTR61 (x) Å SHR6 (x)

Предварительная подготовка сообщения, т.е. добавление определенных битов до целого числа блоков и последующее разбиение на блоки выполняется аналогично тому, как это делалось в SHA-1 (конечно, с учетом длины блока каждой хэш-функции). После этого каждое сообщение можно представить в виде последовательности N блоков M(1), M(2), …, M(N).

Рассмотрим SHA-256. В этом случае инициализируются восемь 32-битных переменных, которые послужат промежуточным значением хэш-кода:

a, b, c, d, e, f, g, h

Основой алгоритма является модуль, состоящий из 64 циклических обработок каждого блока M(i):

T1 = h + ∑1{256} (e) + Ch (e, f, g) + Kt{256} + Wt

T2 = ∑0{256} (a) + Maj (a, b, c)

h = g

g = f

f = e

e = d + T1

d = c

c = b

b = a

a = T1 + T2

где Ki{256} - шестьдесят четыре 32-битных константы, каждая из которых является первыми 32-мя битами дробной части кубических корней первых 64 простых чисел.

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

Wt = Mt(i) 0 ≤ t ≤ 15

Wt = σ1{256} (Wt-2) + Wt-7 + σ0{256} (Wt-15) + Wt-16

16 ≤ t ≤ 63

i-ое промежуточное значение хэш-кода H(t) вычисляется следующим образом:

H0(i) = a + H0(i-1)

H1(i) = b + H1(i-1)

H2(i) = c + H2(i-1)

H3(i) = d + H3(i-1)

H4(i) = e + H4(i-1)

H5(i) = f + H5(i-1)

H6(i) = g + H6(i-1)

H7(i) = h + H7(i-1)

Теперь рассмотрим SHA-512. В данном случае инициализируются восемь 64-битных переменных, которые будут являться промежуточным значением хэш-кода:

a, b, c, d, e, f, g, h

Основой алгоритма является модуль, состоящий из 80 циклических обработок каждого блока M(i):

T1 = h + ∑1{512} (e) + Ch (e, f, g) + Kt{512} + Wt

T2 = ∑0{512} (a) + Maj (a, b, c)

h = g

g = f

f = e

e = d + T1

d = c

c = b

b = a

a = T1 + T2

где Ki{512} - восемьдесят 64-битных констант, каждая из которых является первыми 64-мя битами дробной части кубических корней первых восьмидесяти простых чисел.

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

Wt = Mt(i) 0 ≤ t ≤ 15

Wt = σ1{512} (Wt-2) + Wt-7 + σ0{512} (Wt-15) + Wt-16

16 ≤ t ≤ 79

i-ое промежуточное значение хэш-кода H(t) вычисляется следующим образом:

H0(i) = a + H0(i-1)

H1(i) = b + H1(i-1)

H2(i) = c + H2(i-1)

H3(i) = d + H3(i-1)

H4(i) = e + H4(i-1)

H5(i) = f + H5(i-1)

H6(i) = g + H6(i-1)

H7(i) = h + H7(i-1)

Рассмотрим SHA-384. Отличия этого алгоритма от SHA-512:

Другой начальный хэш-код H(0).

384-битный дайджест получается из левых 384 битов окончательного хэш-кода H(N):

H0(N) || H1(N) || H2(N) || H3(N) || H4(N) || H5(N).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: