Функция сжатия
В зависимости от желаемой битовой длины
результата хеширования в ECHO применяются две функции сжатия:
и
. Нижний индекс равен длине
переменной цепочки. На итерации
обе функции принимают 4 параметра:
- Текущее значение переменной цепочки
с битовой длиной
.
- Текущий блок сообщения с битовой длиной
.
- Полное число
бит сообщения, обработанных к концу данной итерации. Если текущий блок
— последний, то
может оказаться меньше или равно значению
. В противном случае выполняется равенство
. Размер счётчик
можно выбрать равным 64 или 128 битам.
.
То, какая функция сжатия используется, зависит от выбранной битовой длины значения хеш-функции. Для
от 128 до 256 бит применяется
:
,
для
от 257 до 512 бит переменная цепочки вычисляется по формуле
Результатом работы обеих функций является некоторое значение с фиксированной битовой длиной. Поэтому для получения величин размера
конечный результат сокращается на необходимое число бит.
Инициализация
В начале хеширования счетчик
устанавливается в 0:
. Начальное значение переменной цепочки устанавливается таким образом, что каждое её слово является 128 битовым представлением числа
, то есть размера результата хеширования. В том случае, когда используется
(
лежит в пределах от 128 до 256 бит) переменная цепочки
состоит из 4 слов:
Когда применяется
(
от 257 до 512 бит),
COMPRESS512
Дополненное сообщение
делится на
блоков
, каждый длиной
бит. Эти блоки друг за другом подаются на вход функции
, при этом в итоге вычисляется
значений переменной цепочки:
Каждый блок
можно представить в виде двенадцати 128-битовых слов:
Переменная цепочки
аналогичным образом записывается в виде последовательности из 4 слов:
Дальнейшие операции проводятся над матрицей состояния
из 4 строк и 4 столбцов:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
В начале
-ой итерации вычисления значения
и
упаковываются в матрицу
следующим образом:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вычисление
происходит в 8 раундов, называемых в ECHO
. Каждый такой раунд состоит из последовательного применения 3 функций:
BIG.SUBWORDS(S, SALT, κ)
— это 2 AES раунда. Обозначим действие одного раунда AES с ключом
на 128-битное слово
как
Здесь
состоит из операций
,
,
и
. Ключи
для вычисления
создаются из параметров
и
. Последний представляет собой внутренний счетчик, который инициализируется значением
и увеличивается во время вычисления
. Важно заметить, что, если в последнем блоке
биты исходного сообщения отсутствуют (что могло случится, например, при длине сообщения
, кратной
), то
полагается равным 0.
Значения ключей для двух раундов AES получаются следующим образом:
если счетчик
выбран 64-битным, и
для 128-битного счетчика.
Операцию
можно описать равенствами
, увеличить
на 1 по модулю
(
)
, увеличить
на 1 по модулю
(
)
, увеличить
на 1 по модулю
(
)
Счетчик
увеличивается на протяжении всех восьми раундов (которые выше названы
), то есть, например, в начале второго раунда
.
BIG.MIXCOLUMNS(S)
состоит из последовательного применения операции
, определенной в AES. Рассмотрим столбцы матрицы
, состоящие из 128-битных слов
, где
. Элементы столбцов можно представить в виде байтовых строк:
|
|
|
|
|
|
|
|
|
|
|
|
Тогда
вычисляется как
Последняя формула представляет собой операцию
, в которой сложение и умножение определены в поле
по модулю многочлена
.
Окончание вычисления COMPRESS512
Функцию
можно описать, используя определенные выше операции:
Операция
вычисляет значение переменной цепочки
, используя полученную в результате применения 8 раундов матрицу состояния
, блок сообщения
и предыдущее значение переменной цепочки
:
|
|
|
|
|
|
|
|
|
|
|
|
Здесь за
обозначены элементы матрицы
,
— операция исключающего ИЛИ.
Конечное значение хеш-функции
Конечное значение переменной цепочки — это строка из 512 бит:
Результатом хеширования с битовой длиной
, принимающей значения от 128 до 256, являются
крайних левых бит переменной цепочки. Например, для значения хеш-функции
с длиной
: