Большинство криптографических хеш-функций обрабатывают данные блоками по несколько байтов, поскольку это более эффективно. Для алгоритмов, использующих 32-битные слова, такие как MD5 и SHA-256, они часто имеют размер 64 байта; для алгоритмов, использующих 64-битные слова, таких как SHA-512 или BLAKE2b, это обычно 128-байтовые блоки; и SHA-3 все еще отличается.
Каждая из этих хеш-функций содержит функцию сжатия, которая берет предыдущее состояние хэша (или начальное состояние в начале) и блок данных и объединяет их в новое состояние. Эта функция сжатия содержит определенное количество раундов; на каждый блок делается одинаковое количество раундов. Затем, после обработки последнего блока, из состояния извлекается хеш-значение, которое во многих случаях является просто копией всех или части данных состояния.
В функциях Меркла-Дамгарда, таких как MD5, SHA-256 и SHA-512, заполнение выполняется двумя частями. Сначала вычисляется длина данных в битах. В 32-битных функциях, таких как MD5 и SHA-256, это обычно 64-битное (8-байтовое) значение; в 64-битных функциях это обычно 128-битное (16-байтовое) значение. Данные дополняются таким образом, что добавляется один бит 1, а затем столько битов 0, сколько необходимо, чтобы оставить ровно место для длины. Таким образом, для MD5 или SHA-256 55-байтовое сообщение будет иметь один бит 1, семь нулевых битов, а затем длину. Однако 56-байтовое сообщение будет иметь один бит 1, шестьдесят три бита 0 для заполнения блока, затем еще четыреста сорок восемь битов 0 для заполнения следующего блока, а затем длину, поскольку места нет. как для 1 бита, так и для длины в текущем блоке. Разные алгоритмы хеширования заполняют по-разному; SHA-3 и BLAKE2b используют разные методы.
Что касается раундов, существует три разных типа раундов, о которых мы обычно говорим при обработке блока в функции сжатия. Существуют раунды, например, в MD5 и BLAKE2b, где мы обрабатываем каждое слово сообщения один раз за раунд; MD5 имеет четыре таких раунда, а BLAKE2b — 12. Существуют также алгоритмы, такие как SHA-256 и SHA-512, где слова сообщения в блоке расширяются в последовательность из многих слов (64 и 80 соответственно) и каждый раунд обрабатывает одно из этих расширенных слов. В SHA-3 мы работаем со всем состоянием с данными, которые уже объединены XOR, и каждый раунд работает со всем состоянием.
На практике почти никто не использует сообщения, которые не являются целым числом байтов, потому что с ними неудобно работать на реальном оборудовании. Но для MD5 или SHA-256 100-битное сообщение будет дополнено 1 битом, 347 битами 0 (чтобы получить 448 бит), а затем 64-битная длина будет добавлена для заполнения последнего блока ( 512 бит или 64 байта).
Хотя вы спрашивали, в частности, о MD5, я также рассмотрел здесь несколько других алгоритмов, потому что алгоритмы различаются по многим важным параметрам, и MD5 больше не следует использовать, поэтому более безопасные алгоритмы будут работать по-другому.