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-битное представление числа  

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

 

COMPRESS512

править

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

 

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

 

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

 

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

   
       
       
       
       

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

   
       
       
       
       

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

 

 

 

BIG.SUBWORDS(S, SALT, κ)

править

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

 

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

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

 

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

 

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

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

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

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

 

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

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

BIG.SHIFTROWS(S)

править

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

 .

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

       
       
       
       
   
       
       
       
       

BIG.MIXCOLUMNS(S)

править

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

     
     
     
     

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

 

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

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

править

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

 

 
 
 
 
 
 

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

     
     
     
     

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

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

править

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

 

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

 

COMPRESS1024

править

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

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

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

править

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

 

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

 

Источники

править

Ссылки

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