Перейти к содержанию

ECHO

Материал из Википедии — свободной энциклопедии

ECHO — хеш-функция, выдвинутая как кандидат на конкурс SHA-3, проводимый Национальным институтом стандартов и технологий (США). Алгоритм разработан в Orange Labs, его авторы:

  • Ryad Benadjila
  • Olivier Billet
  • Henri Gilbert
  • Gilles Macario-Rat
  • Thomas Peyrin
  • Matt Robshaw
  • Yannick Seurin

Краткий обзор

[править | править код]

В качестве аргументов для хеш-функции выступают сообщение и «соль» (которая далее обозначается как SALT). Длина последнего аргумента составляет 128 бит, при этом по умолчанию его значение принимается равным 0. Размер выхода ECHO может меняться от 128 до 512 бит.

Алгоритм вычисления ECHO основан на построении Меркле-Дамгаарда и, в соответствии с этим построением, представляет собой последовательное применение функции сжатия (определена ниже), зависящей от переменной цепочки Vi−1, блока сообщения Mi и, возможно, других параметров. При определении самой функции сжатия в ECHO используются операции AES.

Обозначения

[править | править код]

ECHO работает со 128-битными словами, поэтому любое сообщение M перед вычислением хеш-функции дополняется так, чтобы его длина была кратна 128. Дополненное сообщение M′ можно представить битовой строкой длины n

b0b1...bn−2bn−1

или последовательностью из s=n8 байт (‖ обозначает конкатенацию)

B0 = b0‖b1‖...‖b7
B1 = b8‖b9‖...‖b15
⋮
Bs−1 = bn−8‖bn−7‖...‖bn−1

ECHO использует операции из AES, которые работают с байтовыми массивами размером 4 на 4. Соответственно, принимается следующая упаковка строки байт в массив:

B0‖B1‖...‖B15⟶
B0 B4 B8 B12
B1 B5 B9 B13
B2 B6 B10 B14
B3 B7 B11 B15

Аналогично, входное сообщение можно представить как последовательность r=n128 128-битовых слов

w0 = B0‖B1‖...‖B15 = b0‖b1‖...‖b127
w1 = B16‖B17‖...‖B31 = b128‖b129‖...‖b255
⋮ ⋮
wr−1 = Bs−16‖Bs−15‖...‖Bs−1 = bn−128‖bn−127‖...‖bn−1

Упаковка шестнадцати 128-битных слов в массив:

w0‖w1‖...‖w15⟶
w0 w4 w8 w12
w1 w5 w9 w13
w2 w6 w10 w14
w3 w7 w11 w15

Функция сжатия

[править | править код]

В зависимости от желаемой битовой длины HSIZE результата хеширования в ECHO применяются две функции сжатия: COMPRESS512 и COMPRESS1024. Нижний индекс равен длине CSIZE переменной цепочки. На итерации i обе функции принимают 4 параметра:

  1. Текущее значение переменной цепочки Vi−1 с битовой длиной CSIZE.
  2. Текущий блок сообщения с битовой длиной MSIZE=2048−CSIZE.
  3. Полное число Ci бит сообщения, обработанных к концу данной итерации. Если текущий блок M — последний, то Ci может оказаться меньше или равно значению i∗MSIZE. В противном случае выполняется равенство Ci=i∗MSIZE. Размер счётчик Ci можно выбрать равным 64 или 128 битам.
  4. SALT.

То, какая функция сжатия используется, зависит от выбранной битовой длины значения хеш-функции. Для HSIZE от 128 до 256 бит применяется COMPRESS512:

Vi=COMPRESS512(Vi−1,Mi,Ci,SALT),

для HSIZE от 257 до 512 бит переменная цепочки вычисляется по формуле

Vi=COMPRESS1024(Vi−1,Mi,Ci,SALT)

Результатом работы обеих функций является некоторое значение с фиксированной битовой длиной. Поэтому для получения величин размера HSIZE конечный результат сокращается на необходимое число бит.

Инициализация

[править | править код]

В начале хеширования счетчик C устанавливается в 0: C0=0. Начальное значение переменной цепочки устанавливается таким образом, что каждое её слово является 128 битовым представлением числа HSIZE, то есть размера результата хеширования. В том случае, когда используется COMPRESS512 (HSIZE лежит в пределах от 128 до 256 бит) переменная цепочки V0 состоит из 4 слов:

V0=(v00,v01,v02,v03),

v0i={E0000000 00000000 00000000 00000000,HSIZE=22400010000 00000000 00000000 00000000,HSIZE=256 , 0≤i≤3

Когда применяется COMPRESS1024 (HSIZE от 257 до 512 бит),

V0=(v00,v01,v02,v03,v04,v05,v06,v07),

v0i={80010000 00000000 00000000 00000000,HSIZE=38400020000 00000000 00000000 00000000,HSIZE=512 , 0≤i≤7

Дополнение сообщения

[править | править код]

Результатом дополнения сообщения M является сообщение M′, длина которого кратна 128. Обозначим через L длину исходного сообщения. Тогда M′ получается в несколько шагов:

  1. К концу сообщения M приписать бит «1».
  2. Приписать x битов «0», где x=MSIZE−((L+144) modMSIZE)−1
  3. Приписать 16-битное представление числа HSIZE
  4. Наконец, приписать 128-битное представление числа L

Дополненное сообщение M′ записывается в виде

M′=M⏞L‖1‖0.....0⏞x‖HSIZE⏞16‖L⏞128

Дополненное сообщение M′ делится на t блоков M1...Mt, каждый длиной MSIZE=1536 бит. Эти блоки друг за другом подаются на вход функции COMPRESS512, при этом в итоге вычисляется t+1 значений переменной цепочки:

Vi=COMPRESS512(Vi−1,Mi,Ci,SALT) , 0≤i≤t

Каждый блок Mi можно представить в виде двенадцати 128-битовых слов:

Mi=mi0‖mi1‖mi2‖mi3‖mi4‖mi5‖mi6‖mi7‖mi8‖mi9‖mi10‖mi11

Переменная цепочки Vi−1 аналогичным образом записывается в виде последовательности из 4 слов:

Vi−1=vi−10‖vi−11‖vi−12‖vi−13

Дальнейшие операции проводятся над матрицей состояния S из 4 строк и 4 столбцов:

S =
w0 w4 w8 w12
w1 w5 w9 w13
w2 w6 w10 w14
w3 w7 w11 w15

В начале i-ой итерации вычисления значения COMPRESS512 Vi и Mi упаковываются в матрицу S следующим образом:

S =
vi−10 mi0 mi4 mi8
vi−11 mi1 mi5 mi9
vi−12 mi2 mi6 mi10
vi−13 mi3 mi7 mi11

Вычисление COMPRESS512 происходит в 8 раундов, называемых в ECHO BIG.ROUND. Каждый такой раунд состоит из последовательного применения 3 функций:

BIG.SUBWORDS(S, SALT, κ)

BIG.SHIFTROWS(S)

BIG.MIXCOLUMNS(S)

BIG.SUBWORDS(S, SALT, κ)

[править | править код]

BIG.SUBWORDS(S, SALT, κ) — это 2 AES раунда. Обозначим действие одного раунда AES с ключом k на 128-битное слово w как

w′=AES(w,k)

Здесь AES состоит из операций SubBytes, ShiftRows, MixColumns и AddRoundKey. Ключи k для вычисления w′ создаются из параметров SALT и κ. Последний представляет собой внутренний счетчик, который инициализируется значением Ci и увеличивается во время вычисления COMPRESS512. Важно заметить, что, если в последнем блоке Mt биты исходного сообщения отсутствуют (что могло случится, например, при длине сообщения L, кратной MSIZE), то Ct полагается равным 0.

Значения ключей для двух раундов AES получаются следующим образом:

k1=κ‖0..0⏞64, k2=SALT,

если счетчик Ci выбран 64-битным, и

k1=κ , k2=SALT

для 128-битного счетчика.

Операцию BIG.SUBWORDS(S, SALT, κ) можно описать равенствами

w0′′=AES(AES(w0,k1),k2), увеличить κ на 1 по модулю 264 (2128)

w1′′=AES(AES(w1,k1),k2), увеличить κ на 1 по модулю 264 (2128)

...

w15′′=AES(AES(w15,k1),k2), увеличить κ на 1 по модулю 264 (2128)

Счетчик κ увеличивается на протяжении всех восьми раундов (которые выше названы BIG.ROUND), то есть, например, в начале второго раунда κ=Ci+16.

Операция BIG.SHIFTROWS(S) проводит циклический сдвиг влево строк матрицы состояния S:

wi′+4j′=wi+4((i+j)mod4), 0≤i,j≤3.

Более наглядно:

w0 w4 w8 w12
w1 w5 w9 w13
w2 w6 w10 w14
w3 w7 w11 w15
⟶  
w0 w4 w8 w12
w5 w9 w13 w1
w10 w14 w2 w6
w15 w3 w7 w11

BIG.MIXCOLUMNS(S) состоит из последовательного применения операции MixColumns, определенной в AES. Рассмотрим столбцы матрицы S, состоящие из 128-битных слов wi,...,wi+3, где i∈{0,4,8,12}. Элементы столбцов можно представить в виде байтовых строк:

wi = (B16i,B16i+1,...,B16i+15)
wi+1 = (B16i+16,B16i+17,...,B16i+31)
wi+2 = (B16i+32,B16i+33,...,B16i+47)
wi+3 = (B16i+48,B16i+49,...,B16i+63)

Тогда BIG.MIXCOLUMNS(S) вычисляется как

(B16′i+j′B16′i+16+j′B16′i+32+j′B16′i+48+j′)=(02030101010203010101020303010102)⋅(B16i+jB16i+16+jB16i+32+jB16i+48+j), i∈{0,4,8,12}, 0≤j≤15

Последняя формула представляет собой операцию MixColumns, в которой сложение и умножение определены в поле GF(28) по модулю многочлена x8+x4+x3+x+1.

Окончание вычисления COMPRESS512

[править | править код]

Функцию COMPRESS512 можно описать, используя определенные выше операции:

for i := 1 to 8 do

begin
BIG.SUBWORDS(S, SALT, κ)
BIG.SHIFTROWS(S)
BIG.MIXCOLUMNS(S)
end
BIG.FINAL

Операция BIG.FINAL вычисляет значение переменной цепочки Vi, используя полученную в результате применения 8 раундов матрицу состояния S, блок сообщения Mi и предыдущее значение переменной цепочки Vi−1:

vi0 = vi−10⊕mi0⊕mi4⊕mi8⊕w0⊕w4⊕w8⊕w12
vi1 = vi−11⊕mi1⊕mi5⊕mi8⊕w1⊕w5⊕w9⊕w13
vi2 = vi−12⊕mi2⊕mi6⊕mi9⊕w2⊕w6⊕w10⊕w14
vi3 = vi−13⊕mi3⊕mi7⊕mi10⊕w3⊕w7⊕w11⊕w15

Здесь за w0,...,w15 обозначены элементы матрицы S, ⊕ — операция исключающего ИЛИ.

Конечное значение хеш-функции

[править | править код]

Конечное значение переменной цепочки — это строка из 512 бит:

vt0‖vt1‖vt2‖vt3

Результатом хеширования с битовой длиной HSIZE, принимающей значения от 128 до 256, являются HSIZE крайних левых бит переменной цепочки. Например, для значения хеш-функции h с длиной HSIZE=256:

h=vt0‖vt1.

Для значений HSIZE, больших 256 (но не превышающих 512) бит применяется функция сжатия COMPRESS1024. Операции в COMPRESS1024 совпадают с операциями в COMPRESS512, за исключением нескольких отличий:

1.  Дополненное сообщение M′ разбивается на t блоков M1...Mt, каждый из которых имеет длину 1024 бит.
2.  Переменная цепочки состоит из восьми 128-битовых слов Vi=vi0...vi7 и инициализируется так, как описано выше.
3.  В начале сжатия переменная цепочки и блок сообщения упаковываются в матрицу 4 на 4 следующим образом:
vi−10 vi−14 mi0 mi4
vi−11 vi−15 mi1 mi5
vi−12 vi−16 mi2 mi6
vi−13 vi−17 mi3 mi7
4.  Вычисление состоит из десяти итераций BIG.ROUND (а не из восьми, как в COMPRESS512).
5.  Операция BIG.FINAL для COMPRESS1024 переопределяется следующим образом:
vi0 = vi−10⊕mi0⊕w0⊕w8 vi4 = vi−14⊕mi4⊕w4⊕w12
vi1 = vi−11⊕mi1⊕w1⊕w9 vi5 = vi−15⊕mi5⊕w5⊕w13
vi2 = vi−12⊕mi2⊕w2⊕w10 vi6 = vi−16⊕mi6⊕w6⊕w14
vi3 = vi−13⊕mi3⊕w3⊕w11 vi7 = vi−17⊕mi7⊕w7⊕w15

Конечное значение хеш-функции

[править | править код]

Длина переменной цепочки для COMPRESS1024 — 1024 бит, поэтому её конечное значение:

Vt=vt0‖vt1‖vt2‖vt3‖vt4‖vt5‖vt6‖vt7

Как и в COMPRESS512, результатом хеширования h являются HSIZE крайних левых бит Vt. Например, для HSIZE=384

h=vt0‖vt1‖vt2‖vt3

  • HAIFA (англ.). — HAsh Iterative FrAmework. Архивировано из оригинала 10 апреля 2012 года.