Хеш-функция - это такая функция, которая осуществляет преобразование набора входных данных произвольной длины в битовую последовательность установленной длины. Хеш-функции играют важную роль в современной криптографии. Технологии развиваются, появляются новые требования к безопасности и вычислительной сложности. Лидерами среди алгоритмов хеширования во многих сферах остаются алгоритмы семейства SHA, однако есть и другое семейство алгоритмов, основанных на клеточных автоматах и заслуживающих всеобщего внимания.
Клеточные автоматы
Клеточный автомат достаточно распространенная вещь, заслуживающая отдельного поста. Однако если коротко, то это дискретная модель, представляющая собой сетку произвольной размерности, каждая клетка которой в каждый момент времени может принимать одно из конечного множества состояний, и определено правило перехода клеток из одного состояния в другое.
В случае элементарных клеточных автоматов сетки ячеек имеют одномерное измерение.
В клеточном автомате для каждой ячейки существует набор других ячеек, называемых окрестностью, которые определяют следующее состояние ячейки. Начальное состояние - это состояние, в котором определены значения ячейки и их окрестности в момент времени t. Теперь новое поколение ячеек создается, когда "t" увеличивается на 1.
Выше представлены две соседние итерации для Правила 30, который определяется следующим образом:
Что можно для простоты интерпретировать в следующем виде:
Преимущества использования клеточных автоматов
Клеточные автоматы обеспечивают высокий уровень параллелизма, что позволяет достичь высоких скоростей в условиях ограниченных вычислительных ресурсов и жестких требований к энергопотреблению.
Обладают хорошим лавинным эффектом (малое изменение входных данных влечет полное изменение выходных).
Устойчивость к атакам временного анализа.
Вышеописанные преимущества сразу наталкивают на мысль использовать такие алгоритмы в интернете вещей.
Что же там под капотом?
Алгоритм получает на вход сообщение произвольного размера и ключ , размером: 128, 192 или 256 бит и возвращает хешированное значение ключа.
Базовое описание алгоритма
Первоначальное сообщениебыть дополнено следующим образом:
дополнение можно производить простым заполнением недостающих разрядов нулями.
Обозначим дополненное сообщение как.
Аналогично дополняется ключ.
Обозначим дополненный ключ как
Сообщение разбивается на блоки по 512 бит.
Каждый 512 битный блок, полученный на предыдущем шаге разбивается ещё раз на 8 подблоков по 64 бита.
К каждому 512 блоку применяется правило 30.
Выход пункта 5 вместе с 512 битным ключом поступают в функцию трансформации (ФТ).
Этот результат подвергается операции XOR с результатом пункта 5 для следующего 512 битного блока.
Ключ для последующих раундов получается с помощью поворота ключа предыдущей итерации, который выполняет циклический сдвиг битов на 1.
Шаги 6, 7 и 8 повторяются, пока не кончатся блоки сообщения по 512 бит, то есть пока всё сообщение не будет хешировано.
Теперь рассмотрим один из вариантов реализации самой функции трансформации, для приведенной ниже функции трансформации авторам удалось добиться полного лавинного эффекта.
Функция трансформации
Для получения полностью случайного выхода по заданному входу в функции трансформации используются как клеточные автоматы, так и побитовые логические операции.
Здесь мы будем оперировать с отдельными 64 битными блоками.
Это означает, что байты из напрямую отображаются в
или
Если раунд нечетный, то используется иначе
или
Если раунд нечетный, то используется иначе
или
Если раунд нечетный, то используется иначе
Функция определена в пункте 1.
или
Если раунд нечетный, то используется иначе
Функция определена в пункте 4.
Где ROTL — циклический сдвиг битов влево, ROTR — циклический сдвиг битов вправо.
Внутри этой функции преобразования количество раундов распределяется динамически. Они рассчитываются по формуле:
количество '1' в блоке сообщения(512 битовом) количество '0' в ключе (512 битовом) .
Пару слов о безопасности
При построении функций трансформации можно обойтись и простым использованием правила 30 клеточного автомата, однако это не придаст хеш-функции полного лавинного эффекта и случайности. Поэтому оно всегда применяется в связке с другими нелинейными правилами клеточных автоматов и побитовыми операциями между ними. Такие алгоритмы хеширования достигают полного лавинного эффекта за небольшое число итераций и проходят все статистические тесты, распространяемые Национальным Институтом Стандартов и Технологий.
Ссылки и статьи по теме:
Building Secure and Fast Cryptographic Hash Functions Using Programmable Cellular Automata
LCASE: Lightweight Cellular Automata-based Symmetric-key Encryption
Cellular Automata Based Hashing Algorithm (CABHA) for Strong Cryptographic Hash Function
A New Cryptographic Hash Function Based on Cellular Automata Rules 30 , 134 and Omega-Flip Network
GarretThief
Мне давно интересно — есть генераторы рандома, которые заполняются даннными, а затем их преобразуют по сложному непредсказуемому алгоритму, а есть хэш-функции, которые работают по тому же принципу.
Вы, как человек, разбирающийся больше меня, может знаете — являются ли они взаимозаменяемыми и, если нет, то почему?
Storan
Даже навскидку если прикинуть — 100% взаимозаменяемости точно нет. Ибо «Хеш-функция — это такая функция, которая осуществляет преобразование набора входных данных произвольной длины в битовую последовательность установленной длины».
а ГПСЧ, насколько я понимаю их работу, всё-таки фиксированные N бит имеют и как результат, и их же как входные данные уже для следующей итерации.
Опять же, если немного призадуматься про назначения — хеш-функция, как бы и должна выполнятся быстро, но если речь про криптографию, то какой-то промежуток времени её вычисление должно занимать, для защиты от брут-форса.
У ГСПЧ такого ограничения точно нет, лишь бы выдавал данные похожие на нормальное распределение, а если он это ещё и «мгновенно» сможет сделать, тем лучше.
GarretThief
Хм, только что наткнулс на википедии, что в /dev/random, Microsoft CryptoAPI и Java SecureRandom используют SHA-1 и MD-5.
Но всё равно лично мне непонятно, почему как нельзя использовать.
imageman
Хоть uacrypto и говорит о «не взаимозаменяемы в общем случае» лично я не считаю последовательность random = SHA-3(random) плохой (она просто в несколько раз медленнее более простых ГПСЧ).
К примеру тут habr.com/ru/post/122711 пишут: «Самый простой объект который может дать хорошую случайность это хеш-функции.»
habr.com/ru/post/151187 — «Подробно о генераторах случайных и псевдослучайных чисел» («В интернете можно пройти тесты DIEHARD и множество других, чтобы определить критостойкость алгоритма.»)
GarretThief
Спасибо, интересные статьи.
TheDaemon
Как минимум, для криптографического ПДСЧ, должно быть сложно по выходным данным понять внутреннее состояние, чтобы предсказать предыдущие/последующие данные. Ваша схема этому критерию не соответствует.
imageman
Да, схему, конечно же, можно (нужно) доработать.
r = SHA-3( r )
random = r mod 1000
В этом случае даже зная random не получится предсказать значение внутренней переменной r (и предсказать следующее значение random).
PS. По правде говоря, большинство криптостойких хешей имеют длину более 128 бит, а переменная random почти всегда будет 64 бита или короче, поэтому такое усечение будет делаться всегда.
anonymous
К хеш функциям и "генераторам рандома" предъявляются различные требования при разработке. Криптографические Хеш функции должны быть устойчивы к коллизиям, нахождению прообраза, нахождению второго прообраза и обеспечивать компрессию строк большой длинны в строку малого размера. Генераторы рандома должны уметь генерировать последовательность бит вычислимо неотличимую от случайной последовательности. Так как эти свойства хеш функций и псевдослучайных генераторов не являются эквивалентными, то соответственно криптопримитивы не взаимозаменяемыми в общем случае.