ECHO

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

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

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

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

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

Обозначения

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

b 0 b 1 . . . b n 2 b n 1 {\displaystyle b_{0}b_{1}...b_{n-2}b_{n-1}}

или последовательностью из s = n 8 {\displaystyle s={\frac {n}{8}}} байт ( {\displaystyle \|} обозначает конкатенацию)

B 0 {\displaystyle B_{0}} = {\displaystyle =} b 0 b 1 . . . b 7 {\displaystyle b_{0}\|b_{1}\|...\|b_{7}}
B 1 {\displaystyle B_{1}} = {\displaystyle =} b 8 b 9 . . . b 15 {\displaystyle b_{8}\|b_{9}\|...\|b_{15}}
{\displaystyle \vdots }
B s 1 {\displaystyle B_{s-1}} = {\displaystyle =} b n 8 b n 7 . . . b n 1 {\displaystyle b_{n-8}\|b_{n-7}\|...\|b_{n-1}}

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

B 0 B 1 . . . B 15 {\displaystyle B_{0}\|B_{1}\|...\|B_{15}\longrightarrow }
B 0 {\displaystyle B_{0}} B 4 {\displaystyle B_{4}} B 8 {\displaystyle B_{8}} B 12 {\displaystyle B_{12}}
B 1 {\displaystyle B_{1}} B 5 {\displaystyle B_{5}} B 9 {\displaystyle B_{9}} B 13 {\displaystyle B_{13}}
B 2 {\displaystyle B_{2}} B 6 {\displaystyle B_{6}} B 10 {\displaystyle B_{10}} B 14 {\displaystyle B_{14}}
B 3 {\displaystyle B_{3}} B 7 {\displaystyle B_{7}} B 11 {\displaystyle B_{11}} B 15 {\displaystyle B_{15}}

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

w 0 {\displaystyle w_{0}} = {\displaystyle =} B 0 B 1 . . . B 15 {\displaystyle B_{0}\|B_{1}\|...\|B_{15}} = {\displaystyle =} b 0 b 1 . . . b 127 {\displaystyle b_{0}\|b_{1}\|...\|b_{127}}
w 1 {\displaystyle w_{1}} = {\displaystyle =} B 16 B 17 . . . B 31 {\displaystyle B_{16}\|B_{17}\|...\|B_{31}} = {\displaystyle =} b 128 b 129 . . . b 255 {\displaystyle b_{128}\|b_{129}\|...\|b_{255}}
{\displaystyle \vdots } {\displaystyle \vdots }
w r 1 {\displaystyle w_{r-1}} = {\displaystyle =} B s 16 B s 15 . . . B s 1 {\displaystyle B_{s-16}\|B_{s-15}\|...\|B_{s-1}} = {\displaystyle =} b n 128 b n 127 . . . b n 1 {\displaystyle b_{n-128}\|b_{n-127}\|...\|b_{n-1}}

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

w 0 w 1 . . . w 15 {\displaystyle w_{0}\|w_{1}\|...\|w_{15}\longrightarrow }
w 0 {\displaystyle w_{0}} w 4 {\displaystyle w_{4}} w 8 {\displaystyle w_{8}} w 12 {\displaystyle w_{12}}
w 1 {\displaystyle w_{1}} w 5 {\displaystyle w_{5}} w 9 {\displaystyle w_{9}} w 13 {\displaystyle w_{13}}
w 2 {\displaystyle w_{2}} w 6 {\displaystyle w_{6}} w 10 {\displaystyle w_{10}} w 14 {\displaystyle w_{14}}
w 3 {\displaystyle w_{3}} w 7 {\displaystyle w_{7}} w 11 {\displaystyle w_{11}} w 15 {\displaystyle w_{15}}

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

В зависимости от желаемой битовой длины HSIZE {\displaystyle {\mbox{HSIZE}}} результата хеширования в ECHO применяются две функции сжатия: COMPRESS 512 {\displaystyle {\mbox{COMPRESS}}_{512}} и COMPRESS 1024 {\displaystyle {\mbox{COMPRESS}}_{1024}} . Нижний индекс равен длине CSIZE {\displaystyle {\mbox{CSIZE}}} переменной цепочки. На итерации i {\displaystyle i} обе функции принимают 4 параметра:

  1. Текущее значение переменной цепочки V i 1 {\displaystyle V_{i-1}} с битовой длиной CSIZE {\displaystyle {\mbox{CSIZE}}} .
  2. Текущий блок сообщения с битовой длиной MSIZE = 2048 CSIZE {\displaystyle {\mbox{MSIZE}}=2048-{\mbox{CSIZE}}} .
  3. Полное число C i {\displaystyle C_{i}} бит сообщения, обработанных к концу данной итерации. Если текущий блок M {\displaystyle M}  — последний, то C i {\displaystyle C_{i}} может оказаться меньше или равно значению i MSIZE {\displaystyle i*{\mbox{MSIZE}}} . В противном случае выполняется равенство C i = i MSIZE {\displaystyle C_{i}=i*{\mbox{MSIZE}}} . Размер счётчик C i {\displaystyle C_{i}} можно выбрать равным 64 или 128 битам.
  4. SALT {\displaystyle {\mbox{SALT}}} .

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

V i = COMPRESS 512 ( V i 1 , M i , C i , SALT ) {\displaystyle V_{i}={\mbox{COMPRESS}}_{512}(V_{i-1},M_{i},C_{i},{\mbox{SALT}})} ,

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

V i = COMPRESS 1024 ( V i 1 , M i , C i , SALT ) {\displaystyle V_{i}={\mbox{COMPRESS}}_{1024}(V_{i-1},M_{i},C_{i},{\mbox{SALT}})}

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

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

В начале хеширования счетчик C {\displaystyle C} устанавливается в 0: C 0 = 0 {\displaystyle C_{0}=0} . Начальное значение переменной цепочки устанавливается таким образом, что каждое её слово является 128 битовым представлением числа HSIZE {\displaystyle {\mbox{HSIZE}}} , то есть размера результата хеширования. В том случае, когда используется COMPRESS 512 {\displaystyle {\mbox{COMPRESS}}_{512}} ( HSIZE {\displaystyle {\mbox{HSIZE}}} лежит в пределах от 128 до 256 бит) переменная цепочки V 0 {\displaystyle V_{0}} состоит из 4 слов:

V 0 = ( v 0 0 , v 0 1 , v 0 2 , v 0 3 ) , {\displaystyle V_{0}=(v_{0}^{0},v_{0}^{1},v_{0}^{2},v_{0}^{3}),}

v 0 i = { E0000000 00000000 00000000 00000000 , HSIZE = 224 00010000 00000000 00000000 00000000 , HSIZE = 256   ,   0 i 3 {\displaystyle v_{0}^{i}={\begin{cases}{\mbox{E0000000 00000000 00000000 00000000}},&{\mbox{HSIZE}}=224\\{\mbox{00010000 00000000 00000000 00000000}},&{\mbox{HSIZE}}=256\end{cases}}{\mbox{ }},{\mbox{ }}0\leq i\leq 3}

Когда применяется COMPRESS 1024 {\displaystyle {\mbox{COMPRESS}}_{1024}} ( HSIZE {\displaystyle {\mbox{HSIZE}}} от 257 до 512 бит),

V 0 = ( v 0 0 , v 0 1 , v 0 2 , v 0 3 , v 0 4 , v 0 5 , v 0 6 , v 0 7 ) , {\displaystyle V_{0}=(v_{0}^{0},v_{0}^{1},v_{0}^{2},v_{0}^{3},v_{0}^{4},v_{0}^{5},v_{0}^{6},v_{0}^{7}),}

v 0 i = { 80010000 00000000 00000000 00000000 , HSIZE = 384 00020000 00000000 00000000 00000000 , HSIZE = 512   ,   0 i 7 {\displaystyle v_{0}^{i}={\begin{cases}{\mbox{80010000 00000000 00000000 00000000}},&{\mbox{HSIZE}}=384\\{\mbox{00020000 00000000 00000000 00000000}},&{\mbox{HSIZE}}=512\end{cases}}{\mbox{ }},{\mbox{ }}0\leq i\leq 7}

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

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

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

Дополненное сообщение M {\displaystyle M'} записывается в виде

M = M L 1 0.....0 x HSIZE 16 L 128 {\displaystyle M'=\overbrace {M} ^{L}\|1\|\overbrace {0.....0} ^{x}\|\overbrace {\mbox{HSIZE}} ^{16}\|\overbrace {L} ^{128}}

COMPRESS512

Дополненное сообщение M {\displaystyle M'} делится на t {\displaystyle t} блоков M 1 . . . M t {\displaystyle M_{1}...M_{t}} , каждый длиной MSIZE = 1536 {\displaystyle {\mbox{MSIZE}}=1536} бит. Эти блоки друг за другом подаются на вход функции COMPRESS 512 {\displaystyle {\mbox{COMPRESS}}_{512}} , при этом в итоге вычисляется t + 1 {\displaystyle t+1} значений переменной цепочки:

V i = COMPRESS 512 ( V i 1 , M i , C i , SALT )   ,   0 i t {\displaystyle V_{i}={\mbox{COMPRESS}}_{512}(V_{i-1},M_{i},C_{i},{\mbox{SALT}}){\mbox{ }},{\mbox{ }}0\leq i\leq t}

Каждый блок M i {\displaystyle M_{i}} можно представить в виде двенадцати 128-битовых слов:

M i = m i 0 m i 1 m i 2 m i 3 m i 4 m i 5 m i 6 m i 7 m i 8 m i 9 m i 10 m i 11 {\displaystyle M_{i}=m_{i}^{0}\|m_{i}^{1}\|m_{i}^{2}\|m_{i}^{3}\|m_{i}^{4}\|m_{i}^{5}\|m_{i}^{6}\|m_{i}^{7}\|m_{i}^{8}\|m_{i}^{9}\|m_{i}^{10}\|m_{i}^{11}}

Переменная цепочки V i 1 {\displaystyle V_{i-1}} аналогичным образом записывается в виде последовательности из 4 слов:

V i 1 = v i 1 0 v i 1 1 v i 1 2 v i 1 3 {\displaystyle V_{i-1}=v_{i-1}^{0}\|v_{i-1}^{1}\|v_{i-1}^{2}\|v_{i-1}^{3}}

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

S {\displaystyle S} = {\displaystyle =}
w 0 {\displaystyle w_{0}} w 4 {\displaystyle w_{4}} w 8 {\displaystyle w_{8}} w 12 {\displaystyle w_{12}}
w 1 {\displaystyle w_{1}} w 5 {\displaystyle w_{5}} w 9 {\displaystyle w_{9}} w 13 {\displaystyle w_{13}}
w 2 {\displaystyle w_{2}} w 6 {\displaystyle w_{6}} w 10 {\displaystyle w_{10}} w 14 {\displaystyle w_{14}}
w 3 {\displaystyle w_{3}} w 7 {\displaystyle w_{7}} w 11 {\displaystyle w_{11}} w 15 {\displaystyle w_{15}}

В начале i {\displaystyle i} -ой итерации вычисления значения COMPRESS 512 {\displaystyle {\mbox{COMPRESS}}_{512}} V i {\displaystyle V_{i}} и M i {\displaystyle M_{i}} упаковываются в матрицу S {\displaystyle S} следующим образом:

S {\displaystyle S} = {\displaystyle =}
v i 1 0 {\displaystyle v_{i-1}^{0}} m i 0 {\displaystyle m_{i}^{0}} m i 4 {\displaystyle m_{i}^{4}} m i 8 {\displaystyle m_{i}^{8}}
v i 1 1 {\displaystyle v_{i-1}^{1}} m i 1 {\displaystyle m_{i}^{1}} m i 5 {\displaystyle m_{i}^{5}} m i 9 {\displaystyle m_{i}^{9}}
v i 1 2 {\displaystyle v_{i-1}^{2}} m i 2 {\displaystyle m_{i}^{2}} m i 6 {\displaystyle m_{i}^{6}} m i 10 {\displaystyle m_{i}^{10}}
v i 1 3 {\displaystyle v_{i-1}^{3}} m i 3 {\displaystyle m_{i}^{3}} m i 7 {\displaystyle m_{i}^{7}} m i 11 {\displaystyle m_{i}^{11}}

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

BIG.SUBWORDS ( S ,  SALT ,   κ ) {\displaystyle {\mbox{BIG.SUBWORDS}}(S,{\mbox{ SALT}},{\mbox{ }}\kappa )}

BIG.SHIFTROWS ( S ) {\displaystyle {\mbox{BIG.SHIFTROWS}}(S)}

BIG.MIXCOLUMNS ( S ) {\displaystyle {\mbox{BIG.MIXCOLUMNS}}(S)}

BIG.SUBWORDS(S, SALT, κ)

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

w = AES ( w , k ) {\displaystyle w'={\mbox{AES}}(w,k)}

Здесь AES {\displaystyle {\mbox{AES}}} состоит из операций SubBytes {\displaystyle {\mbox{SubBytes}}} , ShiftRows {\displaystyle {\mbox{ShiftRows}}} , MixColumns {\displaystyle {\mbox{MixColumns}}} и AddRoundKey {\displaystyle {\mbox{AddRoundKey}}} . Ключи k {\displaystyle k} для вычисления w {\displaystyle w'} создаются из параметров SALT {\displaystyle {\mbox{SALT}}} и κ {\displaystyle \kappa } . Последний представляет собой внутренний счетчик, который инициализируется значением C i {\displaystyle C_{i}} и увеличивается во время вычисления COMPRESS 512 {\displaystyle {\mbox{COMPRESS}}_{512}} . Важно заметить, что, если в последнем блоке M t {\displaystyle M_{t}} биты исходного сообщения отсутствуют (что могло случится, например, при длине сообщения L {\displaystyle L} , кратной MSIZE {\displaystyle {\mbox{MSIZE}}} ), то C t {\displaystyle C_{t}} полагается равным 0.

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

k 1 = κ 0..0 64 k 2 = SALT , {\displaystyle k_{1}=\kappa \|\overbrace {0..0} ^{64}{\mbox{, }}k_{2}={\mbox{SALT}},}

если счетчик C i {\displaystyle C_{i}} выбран 64-битным, и

k 1 = κ  ,  k 2 = SALT {\displaystyle k_{1}=\kappa {\mbox{ , }}k_{2}={\mbox{SALT}}}

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

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

w 0 = A E S ( A E S ( w 0 , k 1 ) , k 2 ) {\displaystyle w_{0}'=AES(AES(w_{0},k_{1}),k_{2})} , увеличить κ {\displaystyle \kappa } на 1 по модулю 2 64 {\displaystyle 2^{64}} ( 2 128 {\displaystyle 2^{128}} )

w 1 = A E S ( A E S ( w 1 , k 1 ) , k 2 ) {\displaystyle w_{1}'=AES(AES(w_{1},k_{1}),k_{2})} , увеличить κ {\displaystyle \kappa } на 1 по модулю 2 64 {\displaystyle 2^{64}} ( 2 128 {\displaystyle 2^{128}} )

. . . {\displaystyle ...}

w 15 = A E S ( A E S ( w 15 , k 1 ) , k 2 ) {\displaystyle w_{15}'=AES(AES(w_{15},k_{1}),k_{2})} , увеличить κ {\displaystyle \kappa } на 1 по модулю 2 64 {\displaystyle 2^{64}} ( 2 128 {\displaystyle 2^{128}} )

Счетчик κ {\displaystyle \kappa } увеличивается на протяжении всех восьми раундов (которые выше названы BIG.ROUND {\displaystyle {\mbox{BIG.ROUND}}} ), то есть, например, в начале второго раунда κ = C i + 16 {\displaystyle \kappa =C_{i}+16} .

BIG.SHIFTROWS(S)

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

w i + 4 j = w i + 4 ( ( i + j ) mod 4 ) ,   0 i , j 3 {\displaystyle w_{i+4j}'=w_{i+4((i+j){\bmod {4}})},{\mbox{ }}0\leq i,j\leq 3} .

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

w 0 {\displaystyle w_{0}} w 4 {\displaystyle w_{4}} w 8 {\displaystyle w_{8}} w 12 {\displaystyle w_{12}}
w 1 {\displaystyle w_{1}} w 5 {\displaystyle w_{5}} w 9 {\displaystyle w_{9}} w 13 {\displaystyle w_{13}}
w 2 {\displaystyle w_{2}} w 6 {\displaystyle w_{6}} w 10 {\displaystyle w_{10}} w 14 {\displaystyle w_{14}}
w 3 {\displaystyle w_{3}} w 7 {\displaystyle w_{7}} w 11 {\displaystyle w_{11}} w 15 {\displaystyle w_{15}}
{\displaystyle \longrightarrow }   {\displaystyle {\mbox{ }}}
w 0 {\displaystyle w_{0}} w 4 {\displaystyle w_{4}} w 8 {\displaystyle w_{8}} w 12 {\displaystyle w_{12}}
w 5 {\displaystyle w_{5}} w 9 {\displaystyle w_{9}} w 13 {\displaystyle w_{13}} w 1 {\displaystyle w_{1}}
w 10 {\displaystyle w_{10}} w 14 {\displaystyle w_{14}} w 2 {\displaystyle w_{2}} w 6 {\displaystyle w_{6}}
w 15 {\displaystyle w_{15}} w 3 {\displaystyle w_{3}} w 7 {\displaystyle w_{7}} w 11 {\displaystyle w_{11}}

BIG.MIXCOLUMNS(S)

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

w i {\displaystyle w_{i}} = {\displaystyle =} ( B 16 i , B 16 i + 1 , . . . , B 16 i + 15 ) {\displaystyle (B_{16i},B_{16i+1},...,B_{16i+15})}
w i + 1 {\displaystyle w_{i+1}} = {\displaystyle =} ( B 16 i + 16 , B 16 i + 17 , . . . , B 16 i + 31 ) {\displaystyle (B_{16i+16},B_{16i+17},...,B_{16i+31})}
w i + 2 {\displaystyle w_{i+2}} = {\displaystyle =} ( B 16 i + 32 , B 16 i + 33 , . . . , B 16 i + 47 ) {\displaystyle (B_{16i+32},B_{16i+33},...,B_{16i+47})}
w i + 3 {\displaystyle w_{i+3}} = {\displaystyle =} ( B 16 i + 48 , B 16 i + 49 , . . . , B 16 i + 63 ) {\displaystyle (B_{16i+48},B_{16i+49},...,B_{16i+63})}

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

( B 16 i + j B 16 i + 16 + j B 16 i + 32 + j B 16 i + 48 + j ) = ( 02 03 01 01 01 02 03 01 01 01 02 03 03 01 01 02 ) ( B 16 i + j B 16 i + 16 + j B 16 i + 32 + j B 16 i + 48 + j ) ,   i { 0 , 4 , 8 , 12 } ,   0 j 15 {\displaystyle {\begin{pmatrix}B_{16i+j}'\\B_{16i+16+j}'\\B_{16i+32+j}'\\B_{16i+48+j}'\end{pmatrix}}={\begin{pmatrix}02&03&01&01\\01&02&03&01\\01&01&02&03\\03&01&01&02\end{pmatrix}}\cdot {\begin{pmatrix}B_{16i+j}\\B_{16i+16+j}\\B_{16i+32+j}\\B_{16i+48+j}\end{pmatrix}},{\mbox{ }}i\in \{0,4,8,12\},{\mbox{ }}0\leq j\leq 15}

Последняя формула представляет собой операцию MixColumns {\displaystyle {\mbox{MixColumns}}} , в которой сложение и умножение определены в поле G F ( 2 8 ) {\displaystyle GF(2^{8})} по модулю многочлена x 8 + x 4 + x 3 + x + 1 {\displaystyle x^{8}+x^{4}+x^{3}+x+1} .

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

Функцию COMPRESS 512 {\displaystyle {\mbox{COMPRESS}}_{512}} можно описать, используя определенные выше операции:

for i := 1 to 8 do {\displaystyle {\mbox{for i := 1 to 8 do}}}

begin {\displaystyle {\mbox{begin}}}
BIG.SUBWORDS ( S ,  SALT ,   κ ) {\displaystyle {\mbox{BIG.SUBWORDS}}(S,{\mbox{ SALT}},{\mbox{ }}\kappa )}
BIG.SHIFTROWS ( S ) {\displaystyle {\mbox{BIG.SHIFTROWS}}(S)}
BIG.MIXCOLUMNS ( S ) {\displaystyle {\mbox{BIG.MIXCOLUMNS}}(S)}
end {\displaystyle {\mbox{end}}}
BIG.FINAL {\displaystyle {\mbox{BIG.FINAL}}}

Операция BIG.FINAL {\displaystyle {\mbox{BIG.FINAL}}} вычисляет значение переменной цепочки V i {\displaystyle V_{i}} , используя полученную в результате применения 8 раундов матрицу состояния S {\displaystyle S} , блок сообщения M i {\displaystyle M_{i}} и предыдущее значение переменной цепочки V i 1 {\displaystyle V_{i-1}} :

v i 0 {\displaystyle v_{i}^{0}} = {\displaystyle =} v i 1 0 m i 0 m i 4 m i 8 w 0 w 4 w 8 w 12 {\displaystyle v_{i-1}^{0}\oplus m_{i}^{0}\oplus m_{i}^{4}\oplus m_{i}^{8}\oplus w_{0}\oplus w_{4}\oplus w_{8}\oplus w_{12}}
v i 1 {\displaystyle v_{i}^{1}} = {\displaystyle =} v i 1 1 m i 1 m i 5 m i 8 w 1 w 5 w 9 w 13 {\displaystyle v_{i-1}^{1}\oplus m_{i}^{1}\oplus m_{i}^{5}\oplus m_{i}^{8}\oplus w_{1}\oplus w_{5}\oplus w_{9}\oplus w_{13}}
v i 2 {\displaystyle v_{i}^{2}} = {\displaystyle =} v i 1 2 m i 2 m i 6 m i 9 w 2 w 6 w 10 w 14 {\displaystyle v_{i-1}^{2}\oplus m_{i}^{2}\oplus m_{i}^{6}\oplus m_{i}^{9}\oplus w_{2}\oplus w_{6}\oplus w_{10}\oplus w_{14}}
v i 3 {\displaystyle v_{i}^{3}} = {\displaystyle =} v i 1 3 m i 3 m i 7 m i 10 w 3 w 7 w 11 w 15 {\displaystyle v_{i-1}^{3}\oplus m_{i}^{3}\oplus m_{i}^{7}\oplus m_{i}^{10}\oplus w_{3}\oplus w_{7}\oplus w_{11}\oplus w_{15}}

Здесь за w 0 , . . . , w 15 {\displaystyle w_{0},...,w_{15}} обозначены элементы матрицы S {\displaystyle S} , {\displaystyle \oplus }  — операция исключающего ИЛИ.

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

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

v t 0 v t 1 v t 2 v t 3 {\displaystyle v_{t}^{0}\|v_{t}^{1}\|v_{t}^{2}\|v_{t}^{3}}

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

h = v t 0 v t 1 . {\displaystyle h=v_{t}^{0}\|v_{t}^{1}.}

COMPRESS1024

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

1.  Дополненное сообщение M {\displaystyle M'} разбивается на t {\displaystyle t} блоков M 1 . . . M t {\displaystyle M_{1}...M_{t}} , каждый из которых имеет длину 1024 бит.
2.  Переменная цепочки состоит из восьми 128-битовых слов V i = v i 0 . . . v i 7 {\displaystyle V_{i}=v_{i}^{0}...v_{i}^{7}} и инициализируется так, как описано выше.
3.  В начале сжатия переменная цепочки и блок сообщения упаковываются в матрицу 4 на 4 следующим образом:
v i 1 0 {\displaystyle v_{i-1}^{0}} v i 1 4 {\displaystyle v_{i-1}^{4}} m i 0 {\displaystyle m_{i}^{0}} m i 4 {\displaystyle m_{i}^{4}}
v i 1 1 {\displaystyle v_{i-1}^{1}} v i 1 5 {\displaystyle v_{i-1}^{5}} m i 1 {\displaystyle m_{i}^{1}} m i 5 {\displaystyle m_{i}^{5}}
v i 1 2 {\displaystyle v_{i-1}^{2}} v i 1 6 {\displaystyle v_{i-1}^{6}} m i 2 {\displaystyle m_{i}^{2}} m i 6 {\displaystyle m_{i}^{6}}
v i 1 3 {\displaystyle v_{i-1}^{3}} v i 1 7 {\displaystyle v_{i-1}^{7}} m i 3 {\displaystyle m_{i}^{3}} m i 7 {\displaystyle m_{i}^{7}}
4.  Вычисление состоит из десяти итераций BIG.ROUND {\displaystyle {\mbox{BIG.ROUND}}} (а не из восьми, как в COMPRESS 512 {\displaystyle {\mbox{COMPRESS}}_{512}} ).
5.  Операция BIG.FINAL {\displaystyle {\mbox{BIG.FINAL}}} для COMPRESS 1024 {\displaystyle {\mbox{COMPRESS}}_{1024}} переопределяется следующим образом:
v i 0 {\displaystyle v_{i}^{0}} = {\displaystyle =} v i 1 0 m i 0 w 0 w 8 {\displaystyle v_{i-1}^{0}\oplus m_{i}^{0}\oplus w_{0}\oplus w_{8}} v i 4 {\displaystyle v_{i}^{4}} = {\displaystyle =} v i 1 4 m i 4 w 4 w 12 {\displaystyle v_{i-1}^{4}\oplus m_{i}^{4}\oplus w_{4}\oplus w_{12}}
v i 1 {\displaystyle v_{i}^{1}} = {\displaystyle =} v i 1 1 m i 1 w 1 w 9 {\displaystyle v_{i-1}^{1}\oplus m_{i}^{1}\oplus w_{1}\oplus w_{9}} v i 5 {\displaystyle v_{i}^{5}} = {\displaystyle =} v i 1 5 m i 5 w 5 w 13 {\displaystyle v_{i-1}^{5}\oplus m_{i}^{5}\oplus w_{5}\oplus w_{13}}
v i 2 {\displaystyle v_{i}^{2}} = {\displaystyle =} v i 1 2 m i 2 w 2 w 10 {\displaystyle v_{i-1}^{2}\oplus m_{i}^{2}\oplus w_{2}\oplus w_{10}} v i 6 {\displaystyle v_{i}^{6}} = {\displaystyle =} v i 1 6 m i 6 w 6 w 14 {\displaystyle v_{i-1}^{6}\oplus m_{i}^{6}\oplus w_{6}\oplus w_{14}}
v i 3 {\displaystyle v_{i}^{3}} = {\displaystyle =} v i 1 3 m i 3 w 3 w 11 {\displaystyle v_{i-1}^{3}\oplus m_{i}^{3}\oplus w_{3}\oplus w_{11}} v i 7 {\displaystyle v_{i}^{7}} = {\displaystyle =} v i 1 7 m i 7 w 7 w 15 {\displaystyle v_{i-1}^{7}\oplus m_{i}^{7}\oplus w_{7}\oplus w_{15}}

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

Длина переменной цепочки для COMPRESS 1024 {\displaystyle {\mbox{COMPRESS}}_{1024}}  — 1024 бит, поэтому её конечное значение:

V t = v t 0 v t 1 v t 2 v t 3 v t 4 v t 5 v t 6 v t 7 {\displaystyle V_{t}=v_{t}^{0}\|v_{t}^{1}\|v_{t}^{2}\|v_{t}^{3}\|v_{t}^{4}\|v_{t}^{5}\|v_{t}^{6}\|v_{t}^{7}}

Как и в COMPRESS 512 {\displaystyle {\mbox{COMPRESS}}_{512}} , результатом хеширования h {\displaystyle h} являются HSIZE {\displaystyle {\mbox{HSIZE}}} крайних левых бит V t {\displaystyle V_{t}} . Например, для HSIZE = 384 {\displaystyle {\mbox{HSIZE}}=384}

h = v t 0 v t 1 v t 2 v t 3 {\displaystyle h=v_{t}^{0}\|v_{t}^{1}\|v_{t}^{2}\|v_{t}^{3}}

Источники

  • Кандидаты SHA-3, прошедшие во второй раунд (англ.). Архивировано из оригинала 10 апреля 2012 года.
  • Страничка хеш-функции ECHO (англ.). Архивировано из оригинала 10 апреля 2012 года.

Ссылки

  • Конкурс SHA-3 (англ.). Архивировано из оригинала 10 апреля 2012 года.
  • HAIFA (англ.). — HAsh Iterative FrAmework. Архивировано из оригинала 10 апреля 2012 года.
Перейти к шаблону «Хеш-алгоритмы»
Общего назначения
Криптографические
Функции формирования ключа
Контрольное число (сравнение)
Применение хешей