Привет всем хабровчанам и просто заглянувшим! Поддавшись осенне-зимнему тренду на Хабре на (около)криптографические статьи, я решил поддержать оный, потому что чем больше годной информации на русском, тем лучше-ж, да..?Итак, сегодня я хочу рассказать вам о Blue Midnight Wish (BMW, да-да, может кто-то еще не понял). Сразу хочу предупредить - это моя первая статья, поэтому будьте нежнее, по возможности... В 2007 году Национальным институтом стандартов и технологий (NIST) был объявлен конкурс на создание нового криптоалгоритма для замены SHA-1 и SHA-2, по итогам которого должен был быть избран алгоритм для SHA-3. Blue Midnight Wish был одним из предложенных алгоритмов, успешно прошедшим первый тур отбора. Для тех кто хотя бы слегка в курсе освещаемой темы, милости прошу к следующему параграфу, а остальным предлагаю пробежаться по основным понятиям, которые будут использоваться дальше: Хэш-функция - это любая функция, которая может использоваться для отображения данных произвольного размера в значения фиксированного размера. Значения, возвращаемые хэш-функцией, называются хэш-значениями, хэш-кодами, дайджестами или просто хэшами. При построении хэш-функции стараются минимизировать число коллизий, оптимизировать скорость работы и уменьшить потребляемые ресурсы. Существует класс хэш-функций, используемых в криптографии - собственно криптографические хэш-функции. Их отличает криптостойкость, BMW - это криптографическая хэш-функция. SHA (Secure Hash Algorithm) - алгоритм безопасного хэширования, на данный момент (декабрь 2021) насчитывает четыре поколения, последнее это SHA-3. Необходимые далее обозначения  Двойная трубка(double pipe, dp). Изменяющееся значение, которое минимум в два раза шире, чем конечная цифровая подпись в n бит  Счетверенная трубка(quadruple pipe, qp) - аналогично, но уже вчетверо     i-е значение dp, — начальное значение.    i-е значение qp.    j-е слово из Где разбивается на заранее определённое количество блоков - слова    j-е слово qp     Первые 16 слов из     Последние 16 слов из   Сообщение Если описывать алгоритм максимально ёмко, то выйдет что-то вродеСообщение M делим на N m-битных блоков и далее В целом дальше в статье я буду распространяться про все обозначения из этих 13 (тут от страха мог умереть один американец) строчек кода. Blue Midnight Wish следует общему шаблону проектирования большинства хэш-функций. Два основных этапа: Первичная обработка (а) заполнение сообщения (padding), (б) разбиение сообщения на m-битные блоки (parsing), (в) установка начальных значений, которые будут использоваться при вычислении хэша Вычисление хэша (а) создание расписания сообщений (message schedule) из дополненного сообщения, (б) использование этого расписания вместе с функциями, константами и операциями со словами для итеративного создания серии значений двойной трубки, (в) окончательное значение двойной трубки, сгенерированное итеративным процессом в (б) используется в качестве входных данных для функции финализации (определим ее далее); (г) n последних значащих бит функции финализации используются для расчета хэша сообщения. Размеры блоков и слов зависят от конкретной реализации алгоритма BMW, привожу их в таблице: версия алгоритма размерсообщения, бит размерблока, бит размерслова, бит размерхэша, бит BMW224          512 32 224 BMW256          512 32 256 BMW384            1024 64 384 BMW512          1024 64 512 Далее в статье подробнее разберу весь алгоритм по шагам на примере BMW256. Предположим, что длина сообщенияравнабит. Добавляем единичный бит в конец сообщения, далеенулевых бит, где - наименьшее неотрицательное решение уравнения . Затем добавляется 64-битный блок, равный числу , выраженному с помощью его двоичного представления.  Например, сообщение "habr", закодированное в 8-битном ASCII, имеет длину , поэтому сообщение дополняется битом «1», затем нулевыми битами и затем 64-битным двоичным представлением числа 32, чтобы стать 512-битным дополненным сообщением.  После того, как сообщение было дополнено, оно должно быть разбито наm-битовых блоков перед вычислением хэша. Для BMW256 дополненное сообщение разбирается на512-битных блоков, . Поскольку 512 бит входного блока могут быть выражены шестнадцатью 32-битными словами, первые 32 бита блока сообщенияобозначаются, следующие 32 бита -и так далее до. Из-за того, что BMW имеет обратный (little-endian) порядок байтов, обратите внимание на обратный порядок байтов в .                 Перед началом вычисления хэш-функции для каждого из хэш-алгоритмов должно быть установлено начальное значение dp - . Размер и значение слов в зависят от размера дайджеста сообщения. для BMW256 начинается с байта 0x40 и принимает все 64 последовательных байтовых значения до 0x7F.должно состоять из шестнадцати 32-битных слов.  BMW256 может использоваться для хэширования сообщениядлинойбит, где . Алгоритм использует шестнадцать 32-битных слов которые являются частью двойной трубки; дополнительные шестнадцать 32-битных слов, которые вместе со словами двойной трубки образуют счетверённую трубку; два временных 32-битных слова и . Слова счетверённой трубки обозначены как. Слова двойной трубки обозначенные как , изначально хранят значение , которое далее итерационно заменяется промежуточным значением двойной трубки (после обработки каждого блока сообщения), окончательно будут хранить значение двойной трубки .   Мы используем три функции: 1.  принимает 2 аргумента - и каждый из m битов, и для любого значения (текущее значение dp) она биективно преобразует (i-й блок сообщения). Результат    является первой частью счетверённой трубки. 2. Вторая функция принимает три аргумента: блокиз m битов, текущее значение dpи значение (первая часть qp), чтобы вычислить вторую часть  cчетверённой трубы qp. Эта функция для каждогоделает следующее: для данной пары однозначно вычисляет , затем для данной пары однозначно вычисляет и для данной пары она однозначно вычисляет . 3. отображает 3m бит в m бит. Она принимает два аргумента: блок размером m бит и текущее значение размером 2m бит, чтобы создать новую двойную трубку из m бит. Конечным результатом BMW256 является 256-битный хэш, который представляет собой 256 младших значащих битов из окончательного хэш-значения , то есть значений . Преобразования, как и конкретную реализацию алгоритма я позволю себе определить картинками из документации IEEE чуть ниже (простите, простите, простите), для любознательных ссылка (на IEEE); - операция XOR циклически переставляет первый элемент вектора в конец.  - сдвиг вправо на  бит слова   - сдвиг влево на  бит слова  Функция представляет собой композицию преобразований  Для определения функции еще разок воспользуемся псевдокодом, - известные выбранные параметры Функция задается следующим образом: Вычисляются   Алгоритм Blue Midnight Wish достойно показал себя в конкурсе NIST, но в конечном итоге уступил алгоритму Keccak. Причиной стала возможная уязвимость к псевдо-коллизионным атакам.Такие структуры как BMW, на мой взгляд, заставляют хотя бы проникнуться уважением к труду тех кто угрохал много сил на свое дело на своем примере показывают, что темпы развития технологий сейчас поражают воображение, реально применяется о-малое от создаваемых решений и алгоритмов, при высокой доле отсеивания хороших вариантов, чтобы в конечном счете найти лучший.  Эта статья проба пера и введение к циклу, в скором времени для большей наглядности завезу реализацию BMW и нескольких других алгоритмов участников SHA-3, следите за обновлениями. Большое спасибо что прочитали, мне очень приятно видеть это:) Danilo Gligoroski, Vlastimil Klima, Svein Johan Knapskog, Mohamed El-Hadedy, Jørn Amundsen, Stig Frode Mjølsnes. Blue Midnight Wish. // Trondheim, Norway: Norwegian University of Science and Technology, 2008. — С. 71. https://ieeexplore.ieee.org/document/5683052 - документация с IEEE. Soren S. Thomsen. Pseudo-cryptanalysis of Blue Midnight Wish. — 2009. — С. 7.