ECHO

ECHO

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

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

Содержание

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

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

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

Обозначения

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

b_0b_1...b_{n-2}b_{n-1}

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

B_{0}\, =\, b_0 \| b_1 \| ... \| b_7
B_{1}\, =\, b_8 \| b_9 \| ... \| b_{15}
\vdots
B_{s-1}\, =\, b_{n-8} \| b_{n-7} \| ... \| b_{n-1}


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

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

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

w_{0}\, =\, B_0 \| B_1 \| ... \| B_{15} =\, b_0 \| b_1 \| ... \| b_{127}
w_{1}\, =\, B_{16} \| B_{17} \| ... \| B_{31} =\, b_{128} \| b_{129} \| ... \| b_{255}
\vdots \vdots
w_{r-1}\, =\, B_{s-16} \| B_{s-15} \| ... \| B_{s-1} =\, b_{n-128} \| b_{n-127} \| ... \| b_{n-1}

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

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

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

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

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

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

V_i = \mbox{COMPRESS}_{512}(V_{i-1}, M_i, C_i, \mbox{SALT}),

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

V_i = \mbox{COMPRESS}_{1024}(V_{i-1}, M_i, C_i, \mbox{SALT})

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

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

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

V_0 = (v_{0}^{0},v_{0}^{1},v_{0}^{2},v_{0}^{3}),

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 \le i \le 3

Когда применяется \mbox{COMPRESS}_{1024} (\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}),

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 \le i \le 7

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

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

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

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


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

\mbox{COMPRESS}_{512}

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

 V_i = \mbox{COMPRESS}_{512}(V_{i-1}, M_i, C_i, \mbox{SALT})\mbox{ },\mbox{ }0 \le i \le t

Каждый блок 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}

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

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

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

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

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

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

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

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

\mbox{BIG.SHIFTROWS}(S)

\mbox{BIG.MIXCOLUMNS}(S)

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

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

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

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

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

k_1=\kappa\|\overbrace{0..0}^{64}\mbox{, } k_2 = \mbox{SALT},

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

k_1=\kappa\mbox{ , } k_2 = \mbox{SALT}\,

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

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

w_{0}' = AES(AES(w_{0},k_1), k_2), увеличить \kappa на 1 по модулю 2^{64} (2^{128})

w_{1}' = AES(AES(w_{1},k_1), k_2), увеличить \kappa на 1 по модулю 2^{64} (2^{128})

...

w_{15}' = AES(AES(w_{15},k_1), k_2), увеличить \kappa на 1 по модулю 2^{64} (2^{128})

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

\mbox{BIG.SHIFTROWS}(S)

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

w_{i+4j}' = w_{i+4((i+j)\bmod 4)}, \mbox{ }0\le i,j\le 3.

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

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

\mbox{BIG.MIXCOLUMNS}(S)

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

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

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


\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 \le j \le 15

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

Окончание вычисления \mbox{COMPRESS}_{512}

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

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

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

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

v_{i}^{0} = 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} = 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} = 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} = 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} обозначены элементы матрицы S, \oplus — операция исключающего ИЛИ.

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

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

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

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

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

\mbox{COMPRESS}_{1024}

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

1.  Дополненное сообщение M' разбивается на t блоков M_{1}...M_{t}, каждый из которых имеет длину 1024 бит.
2.  Переменная цепочки состоит из восьми 128-битовых слов V_i = v_{i}^0...v_{i}^7 и инициализируется так, как описано выше.
3.  В начале сжатия переменная цепочки и блок сообщения упаковываются в матрицу 4 на 4 следующим образом:
{| class="wikitable" width="220px"

|- align="center" bgcolor="white" | v_{i-1}^{0} | v_{i-1}^{4} | m_{i}^{0} | m_{i}^{4} |- align="center" bgcolor="white" | v_{i-1}^{1} | v_{i-1}^{5} | m_{i}^{1} | m_{i}^{5} |- align="center" bgcolor="white" | v_{i-1}^{2} | v_{i-1}^{6} | m_{i}^{2} | m_{i}^{6} |- align="center" bgcolor="white" | v_{i-1}^{3} | v_{i-1}^{7} | m_{i}^{3} | m_{i}^{7} |}

4.  Вычисление состоит из десяти итераций \mbox{BIG.ROUND} (а не из восьми, как в \mbox{COMPRESS}_{512}).
5.  Операция \mbox{BIG.FINAL} для \mbox{COMPRESS}_{1024} переопределяется следующим образом:
{|

|- | v_{i}^{0} | = | v_{i-1}^{0}\oplus m_{i}^{0} \oplus w_{0} \oplus w_{8} | width="30px" rowspan="4" | | v_{i}^{4} | = | v_{i-1}^{4}\oplus m_{i}^{4} \oplus w_{4} \oplus w_{12} |- | v_{i}^{1} | = | v_{i-1}^{1}\oplus m_{i}^{1} \oplus w_{1} \oplus w_{9} | v_{i}^{5} | = | v_{i-1}^{5}\oplus m_{i}^{5} \oplus w_{5} \oplus w_{13} |- | v_{i}^{2} | = | v_{i-1}^{2}\oplus m_{i}^{2} \oplus w_{2} \oplus w_{10}

| v_{i}^{6} | = | v_{i-1}^{6}\oplus m_{i}^{6} \oplus w_{6} \oplus w_{14} |- | v_{i}^{3} | = | v_{i-1}^{3}\oplus m_{i}^{3} \oplus w_{3} \oplus w_{11}

| v_{i}^{7} | = | v_{i-1}^{7}\oplus m_{i}^{7} \oplus w_{7} \oplus w_{15} |}

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

Длина переменной цепочки для \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}

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

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

Источники

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужно сделать НИР?

Полезное


Смотреть что такое "ECHO" в других словарях:

  • écho — écho …   Dictionnaire des rimes

  • Echo — Echo …   Deutsch Wörterbuch

  • écho — [ eko ] n. m. • XIIIe; lat. echo, gr. êkhô 1 ♦ Phénomène de réflexion du son par un obstacle qui le répercute; le son ainsi répété. Effet d écho. Il y a de l écho dans cette église. ⇒ réverbération. Écho simple, qui ne reproduit les sons qu une… …   Encyclopédie Universelle

  • Echo — Écho Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom.  Pour les articles homophones, voir écot et eco …   Wikipédia en Français

  • Echo 1 — (eigentlich Echo 1A) ist der Name eines großen Ballonsatelliten der USA, der am 12. August 1960 als erster Nachrichten und geodätischer Satellit gestartet wurde. Seine internationale COSPAR Nummer war 60 009 01 (9. Start des Jahres …   Deutsch Wikipedia

  • Echo 1A — Echo 1 Echo 1 (eigentlich Echo 1A) ist der Name eines großen Ballonsatelliten der USA, der am 12. August 1960 als erster Nachrichten und geodätischer Satellit gestartet wurde. Seine internationale COSPAR Nummer war 60 009 01 (9. Start des Jahres… …   Deutsch Wikipedia

  • echo — (от англ. echo эхо) команда Unix, предназначенная для отображения строки текста. Команда echo выводит текст (выводит текст на стандартное устройство вывода). Синтаксис echo [ПАРАМЕТР]... [СТРОКА]... Параметры n не выводить в конце символ… …   Википедия

  • Echo — Ech o ([e^]k [ o]), n.; pl. {Echoes} ([e^]k [=o]z). [L. echo, Gr. hchw echo, sound, akin to hchh , h^chos, sound, noise; cf. Skr. v[=a][,c] to sound, bellow; perh. akin to E. voice: cf. F. [ e]cho.] 1. A sound reflected from an opposing surface… …   The Collaborative International Dictionary of English

  • Echo — Saltar a navegación, búsqueda Echo puede referirse a: Echo (computación), un concepto informático. Toyota Echo, un modelo de automóvil de la marca Toyota. ECHO (premio), un premio musical. Echo and the Bunnymen, un grupo musical británico. Echo… …   Wikipedia Español

  • écho — ÉCHO. s. m. (Prononcez Éco.) Les Poëtes ont feint une Nymphe de ce nom, fille de l Air, qui étant devenue amoureuse de Narcisse, dont elle ne put se faire aimer, fut métamorphosée en rocher, et ne conserva que la voix. Ce mot est féminin en ce… …   Dictionnaire de l'Académie Française 1798


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»