CubeHash


CubeHash[1] — это параметризуемое семейство криптографических хеш-функций CubeHashr/b. CubeHash8/1 была предложена Дэниелом Бернштейном[en] в качестве нового стандарта для SHA-3 в конкурсе хеш-функций, проводимым Национальным институтом стандартов и технологий (НИСТ). Вначале НИСТ требовал около 200 циклов на байт[2]. После некоторых уточнений от НИСТ автор сменил параметры на CubeHash16/32, которая примерно в 16 раз быстрее, чем CubeHash8/1 и легко догоняет SHA-256 и SHA-512 на различных платформах[3][4][5][6].

Инициализация. 128-байтовое состояние рассматривается как последовательность 32 четырёх-байтовых слов x00000, x00001, x00010,…, x11111, каждое из которых представляется в little-endian форме 32-битовых целых чисел. Первые три слова x00000, x00001, x00010 выставляются в h/8, b, r соответственно. Оставшиеся слова равны нулю. Затем состояние преобразуется посредством 10r одинаковых раундов.

Заполнение. Добавляется 1 бит ко входящему сообщению, затем оно дополняется минимально возможным количеством нулевых битов так, чтобы количество битов было кратно 8b.

Заполнение не требует разделение хранилища длины сообщения, блока для обработки и остального. Реализация может хранить одиночное число между 0 и 8b, чтобы записать число бит обработанных на данный момент в текущем блоке.

Завершение. К последнему состоянию слова x11111 по модулю два прибавляется 1. Далее состояние преобразуется путём проведения 10r одинаковых раундов.

Алгоритм CubeHash не включает в себя блоки счётчиков, блоки, использующие случайные числа, и тому подобные блоки. Без этих блоков легче найти состояние, в котором происходит коллизия, но этот аргумент не работает, когда размер состояния довольно большой. Обычная атака на CubeHash должна сделать 2^400 попыток для нахождения коллизии 1024 битного состояния для CubeHash. Также нет необходимости нарушать любую симметрию, которая используется в раундах.