ECHO

Материал из testwiki
Перейти к навигации Перейти к поиску

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 основан на построении Меркле-Дамгаарда и, в соответствии с этим построением, представляет собой последовательное применение функции сжатия (определена ниже), зависящей от переменной цепочки Vi1, блока сообщения Mi и, возможно, других параметров. При определении самой функции сжатия в ECHO используются операции AES.

Обозначения

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

b0b1...bn2bn1

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

B0 = b0b1...b7
B1 = b8b9...b15
Bs1 = bn8bn7...bn1

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

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

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

w0 = B0B1...B15 = b0b1...b127
w1 = B16B17...B31 = b128b129...b255
wr1 = Bs16Bs15...Bs1 = bn128bn127...bn1

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

w0w1...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. Текущее значение переменной цепочки Vi1 с битовой длиной CSIZE.
  2. Текущий блок сообщения с битовой длиной MSIZE=2048CSIZE.
  3. Полное число Ci бит сообщения, обработанных к концу данной итерации. Если текущий блок M — последний, то Ci может оказаться меньше или равно значению i*MSIZE. В противном случае выполняется равенство Ci=i*MSIZE. Размер счётчик Ci можно выбрать равным 64 или 128 битам.
  4. SALT.

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

Vi=COMPRESS512(Vi1,Mi,Ci,SALT),

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

Vi=COMPRESS1024(Vi1,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 , 0i3

Когда применяется 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 , 0i7

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

Результатом дополнения сообщения 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=ML10.....0xHSIZE16L128

COMPRESS512

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

Vi=COMPRESS512(Vi1,Mi,Ci,SALT) , 0it

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

Mi=mi0mi1mi2mi3mi4mi5mi6mi7mi8mi9mi10mi11

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

Vi1=vi10vi11vi12vi13

Дальнейшие операции проводятся над матрицей состояния 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 =
vi10 mi0 mi4 mi8
vi11 mi1 mi5 mi9
vi12 mi2 mi6 mi10
vi13 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..064k2=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)

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

wi+4j=wi+4((i+j)mod4), 0i,j3.

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

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)

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) вычисляется как

(B16i+jB16i+16+jB16i+32+jB16i+48+j)=(02030101010203010101020303010102)(B16i+jB16i+16+jB16i+32+jB16i+48+j), i{0,4,8,12}, 0j15

Последняя формула представляет собой операцию 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 и предыдущее значение переменной цепочки Vi1:

vi0 = vi10mi0mi4mi8w0w4w8w12
vi1 = vi11mi1mi5mi8w1w5w9w13
vi2 = vi12mi2mi6mi9w2w6w10w14
vi3 = vi13mi3mi7mi10w3w7w11w15

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

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

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

vt0vt1vt2vt3

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

h=vt0vt1.

COMPRESS1024

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

1.  Дополненное сообщение M разбивается на t блоков M1...Mt, каждый из которых имеет длину 1024 бит.
2.  Переменная цепочки состоит из восьми 128-битовых слов Vi=vi0...vi7 и инициализируется так, как описано выше.
3.  В начале сжатия переменная цепочки и блок сообщения упаковываются в матрицу 4 на 4 следующим образом:
vi10 vi14 mi0 mi4
vi11 vi15 mi1 mi5
vi12 vi16 mi2 mi6
vi13 vi17 mi3 mi7
4.  Вычисление состоит из десяти итераций BIG.ROUND (а не из восьми, как в COMPRESS512).
5.  Операция BIG.FINAL для COMPRESS1024 переопределяется следующим образом:
vi0 = vi10mi0w0w8 vi4 = vi14mi4w4w12
vi1 = vi11mi1w1w9 vi5 = vi15mi5w5w13
vi2 = vi12mi2w2w10 vi6 = vi16mi6w6w14
vi3 = vi13mi3w3w11 vi7 = vi17mi7w7w15

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

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

Vt=vt0vt1vt2vt3vt4vt5vt6vt7

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

h=vt0vt1vt2vt3

Источники

Ссылки

Шаблон:Хеш-алгоритмы Шаблон:Rq