ECHO — Википедия

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

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

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

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

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

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

Обозначения

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

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

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

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

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

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

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

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

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

  1. Текущее значение переменной цепочки с битовой длиной .
  2. Текущий блок сообщения с битовой длиной .
  3. Полное число бит сообщения, обработанных к концу данной итерации. Если текущий блок  — последний, то может оказаться меньше или равно значению . В противном случае выполняется равенство . Размер счётчик можно выбрать равным 64 или 128 битам.
  4. .

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

,

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

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

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

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

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

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

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

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

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

  1. К концу сообщения приписать бит «1».
  2. Приписать битов «0», где
  3. Приписать 16-битное представление числа
  4. Наконец, приписать 128-битное представление числа

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

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

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

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

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

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

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

BIG.SUBWORDS(S, SALT, κ)

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

 — это 2 AES раунда. Обозначим действие одного раунда AES с ключом на 128-битное слово как

Здесь состоит из операций , , и . Ключи для вычисления создаются из параметров и . Последний представляет собой внутренний счетчик, который инициализируется значением и увеличивается во время вычисления . Важно заметить, что, если в последнем блоке биты исходного сообщения отсутствуют (что могло случится, например, при длине сообщения , кратной ), то полагается равным 0.

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

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

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

Операцию можно описать равенствами

, увеличить на 1 по модулю ()

, увеличить на 1 по модулю ()

, увеличить на 1 по модулю ()

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

Операция проводит циклический сдвиг влево строк матрицы состояния :

.

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

состоит из последовательного применения операции , определенной в AES. Рассмотрим столбцы матрицы , состоящие из 128-битных слов , где . Элементы столбцов можно представить в виде байтовых строк:

Тогда вычисляется как

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

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

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

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

Операция вычисляет значение переменной цепочки , используя полученную в результате применения 8 раундов матрицу состояния , блок сообщения и предыдущее значение переменной цепочки :

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

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

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

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

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

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

1.  Дополненное сообщение разбивается на блоков , каждый из которых имеет длину 1024 бит.
2.  Переменная цепочки состоит из восьми 128-битовых слов и инициализируется так, как описано выше.
3.  В начале сжатия переменная цепочки и блок сообщения упаковываются в матрицу 4 на 4 следующим образом:
4.  Вычисление состоит из десяти итераций (а не из восьми, как в ).
5.  Операция для переопределяется следующим образом:

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

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

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

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

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