Общий | |
---|---|
Дизайнеры | Жан-Филипп Омассон, Лука Хенцен, Вилли Мейер, Рафаэль К.-В. Фан |
Преемники | БЛЕЙК2 |
Сертификация | Финалист SHA-3 |
Деталь | |
Размеры дайджеста | 224, 256, 384 или 512 бит |
Структура | строительство Хайфа |
Раунды | 14 или 16 |
Скорость | 8,4 cpb на ядре 2 для BLAKE-256; 7,8 cpb для BLAKE-512 |
BLAKE — это криптографическая хэш-функция , основанная на потоковом шифре ChaCha Дэниела Дж. Бернстайна , но перед каждым раундом ChaCha добавляется переставленная копия входного блока, XOR-связанная с константами раунда. Как и SHA-2 , существует два варианта, отличающихся размером слова . ChaCha работает с массивом слов 4×4. BLAKE многократно объединяет хэш-значение из 8 слов с 16 словами сообщения, усекая результат ChaCha для получения следующего хэш-значения. BLAKE-256 и BLAKE-224 используют 32-битные слова и создают размеры дайджеста 256 бит и 224 бит соответственно, в то время как BLAKE-512 и BLAKE-384 используют 64-битные слова и создают размеры дайджеста 512 бит и 384 бит соответственно.
Хэш-функция BLAKE2, основанная на BLAKE, была анонсирована в 2012 году. Хэш-функция BLAKE3, основанная на BLAKE2, была анонсирована в 2020 году.
BLAKE был представлен на конкурс хэш-функций NIST Жаном-Филиппом Омассоном, Лукой Хензеном, Вилли Майером и Рафаэлем К.-В. Фаном. В 2008 году было подано 51 заявление. BLAKE вышел в финальный тур, в котором участвовало пять кандидатов, но проиграл Keccak в 2012 году, который был выбран для алгоритма SHA-3 .
Как и SHA-2 , BLAKE существует в двух вариантах: один, использующий 32-битные слова, используемые для вычисления хэшей длиной до 256 бит, и другой, использующий 64-битные слова, используемые для вычисления хэшей длиной до 512 бит. Основное преобразование блока объединяет 16 слов ввода с 16 рабочими переменными, но между блоками сохраняется только 8 слов (256 или 512 бит).
Он использует таблицу из 16 константных слов (старшие 512 или 1024 бита дробной части числа π ) и таблицу из 10 16-элементных перестановок:
σ[0] = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15σ[1] = 14 10 4 8 9 15 13 6 1 12 0 2 11 7 5 3σ[2] = 11 8 12 0 5 2 15 13 10 14 3 6 7 1 9 4σ[3] = 7 9 3 1 13 12 11 14 2 6 5 10 4 0 15 8σ[4] = 9 0 5 7 2 4 10 15 14 1 11 12 6 8 3 13σ[5] = 2 12 6 10 0 11 8 3 4 13 7 5 15 14 1 9σ[6] = 12 5 1 15 14 13 4 10 0 7 6 3 9 2 8 11σ[7] = 13 11 7 14 12 1 3 9 5 0 15 4 8 6 2 10σ[8] = 6 15 14 9 11 3 0 8 12 2 13 7 1 4 10 5σ[9] = 10 2 8 4 7 6 1 5 15 11 9 14 3 12 13 0
Основная операция, эквивалентная четверти раунда ChaCha, работает на 4-словном столбце или диагонали a b c d
, которая объединяется с 2 словами сообщения m[]
и двумя постоянными словами n[]
. Она выполняется 8 раз за полный раунд:
j ← σ[r%10][2×i] // Вычисления индексак ← σ[r%10][2×i+1]a ← a + b + (m[j] ⊕ n[k]) // Шаг 1 (с вводом)г ← (г ⊕ а) >>> 16c ← c + d // Шаг 2 (без ввода)б ← (б ⊕ с) >>> 12a ← a + b + (m[k] ⊕ n[j]) // Шаг 3 (с вводом)г ← (г ⊕ а) >>> 8c ← c + d // Шаг 4 (без ввода)б ← (б ⊕ с) >>> 7
В приведенном выше примере r
— круглое число (0–13), которое i
может иметь значения от 0 до 7.
Отличия от функции четверти круга ChaCha следующие:
«BLAKE повторно использует перестановку потокового шифра ChaCha с вращениями, выполняемыми в противоположных направлениях. Некоторые подозревают расширенную оптимизацию, но на самом деле это происходит из-за опечатки в исходных спецификациях BLAKE», — объясняет Жан-Филипп Омассон в своем «Криптословаре». [1]
64-битная версия (которой нет в ChaCha) идентична, но количество вращений составляет 32, 25, 16 и 11 соответственно, а количество раундов увеличено до 16.
На протяжении всего конкурса хэш-функций NIST участникам разрешается «подстраивать» свои алгоритмы для решения обнаруженных проблем. Изменения, внесенные в BLAKE: количество раундов было увеличено с 10/14 до 14/16. Это сделано для того, чтобы быть более консервативным в плане безопасности, оставаясь при этом быстрым.
Значения хэш-функции пустой строки:
БЛЕЙК-224("") =7dc5313b1c04512a174bd6503b89607aecbee0903d40a8a569c94eedБЛЕЙК-256("") =716f6e863f744b9ac22c97ec7b76ea5f5908bc5b2f67c61510bfc4751384ea7aБЛЕЙК-384("") =c6cbd89c926ab525c242e6621f2f5fa73aa4afe3d9e24aed727faaadd6af38b620bdb623dd2b4788b1c8086984af8706БЛЕЙК-512("") =a8cfbbd73726062df0c6864dda65defe58ef0cc52a5625090fa17601e1eecd1b628e94f396ae402a00acc9eab77b4d4c2e852aaaa25a636d80af3fc7913ef5b8
Изменение одного бита приводит к изменению каждого бита на выходе с вероятностью 50%, демонстрируя лавинный эффект :
БЛЕЙК-512("Быстрая коричневая лиса перепрыгивает через ленивую собаку") =1f7e26f63b6ad25a0896fd978fd050a1766391d2fd0471a77afb975e5034b7ad2d9ccf8dfb47abbbe656e1b82fbc634ba42ce186e8dc5e1ce09a885d41f43451БЛЕЙК-512("Быстрая коричневая лиса перепрыгивает через ленивую до ф ") =a701c2a1f9baabd8b1db6b75aee096900276f0b86dc15d247ecc03937b370324a16a4ffc0c3a85cd63229cfa15c15f4ba6d46ae2e849ed6335e9ff43b764198a
(В этом примере 266 совпадающих битов из 512 составляют около 52% из-за случайного характера лавины.)
Общий | |
---|---|
Дизайнеры | Жан-Филипп Омассон, Сэмюэл Невес, Зооко Уилкокс-О'Херн , Кристиан Виннерлейн |
Получено из | БЛЕЙК |
Деталь | |
Размеры дайджеста | до 64 байт (BLAKE2b); до 32 байт (BLAKE2s); произвольный (BLAKE2X) |
Раунды | 10 или 12 |
Скорость | 3,5 cpb на Core i5 (Ivy Bridge) для BLAKE2b [2] |
BLAKE2 — это криптографическая хэш-функция на основе BLAKE, созданная Жаном-Филиппом Омассоном, Сэмюэлем Невесом, Зуко Уилкокс-О'Херном и Кристианом Виннерлейном. Целью разработки была замена широко используемых, но сломанных алгоритмов MD5 и SHA-1 в приложениях, требующих высокой производительности программного обеспечения. BLAKE2 был анонсирован 21 декабря 2012 года. [3] Референсная реализация доступна под лицензиями CC0 , OpenSSL и Apache License 2.0 . [4] [5]
BLAKE2b быстрее, чем MD5, SHA-1, SHA-2 и SHA-3, на 64-битных архитектурах x86-64 и ARM. [4] BLAKE2 обеспечивает лучшую безопасность, чем SHA-2, и аналогична SHA-3: иммунитет к расширению длины , недифференцируемость от случайного оракула и т. д. [6]
BLAKE2 удаляет добавление констант к словам сообщения из функции раунда BLAKE, изменяет две константы вращения, упрощает заполнение, добавляет блок параметров, который объединяется с помощью операции XOR с векторами инициализации, и сокращает количество раундов с 16 до 12 для BLAKE2b (преемник BLAKE-512) и с 14 до 10 для BLAKE2s (преемник BLAKE-256).
BLAKE2 поддерживает режимы keying, salting, personalization и hash tree и может выводить дайджесты от 1 до 64 байт для BLAKE2b или до 32 байт для BLAKE2s. Существуют также параллельные версии, разработанные для повышения производительности на многоядерных процессорах ; BLAKE2bp (4-way parallel) и BLAKE2sp (8-way parallel).
BLAKE2X — это семейство функций с расширяемым выходом (XOF). В то время как BLAKE2 ограничен 64-байтовыми дайджестами, BLAKE2X допускает дайджесты до 256 ГиБ. Сам по себе BLAKE2X не является экземпляром хэш-функции и должен быть основан на реальном экземпляре BLAKE2. Примером экземпляра BLAKE2X может быть BLAKE2Xb16MiB , который будет версией BLAKE2X на основе BLAKE2b, производящей дайджесты размером 16 777 216 байт (или ровно 16 МиБ , отсюда и название такого экземпляра). [7]
BLAKE2b и BLAKE2s указаны в RFC 7693. Дополнительные функции, использующие блок параметров (соль, персонализированные хэши, древовидное хэширование и т. д.), не указаны, и, следовательно, не поддерживается BLAKE2bp, BLAKE2sp или BLAKE2X. [8]
BLAKE2b использует вектор инициализации, который совпадает с IV, используемым SHA-512. Эти значения прозрачно получены путем взятия первых 64 бит дробных частей положительных квадратных корней первых восьми простых чисел.
IV 0 = 0x6a09e667f3bcc908 // Дробь (sqrt (2)) IV 1 = 0xbb67ae8584caa73b // Дробь (sqrt (3)) IV 2 = 0x3c6ef372fe94f82b // Дробь (sqrt (5)) IV 3 = 0xa54ff53a5f1d36f1 // Дробь (sqrt (7)) IV 4 = 0x510e527fade682d1 // Дробь (sqrt (11)) IV 5 = 0x9b05688c2b3e6c1f // Дробь (sqrt (13)) IV 6 = 0x1f83d9abfb41bd6b // Дробь (sqrt (17)) IV 7 = 0x5be0cd19137e2179 // Дробь(sqrt(19))
Псевдокод для алгоритма BLAKE2b. Алгоритм BLAKE2b использует 8-байтовые (UInt64) слова и 128-байтовые фрагменты.
Алгоритм BLAKE2b Вход: M Сообщение для хеширования cbMessageLen: Число, (0..2 128 ) Длина сообщения в байтах Ключ Необязательный ключ длиной 0..64 байта cbKeyLen: Число, (0..64) Длина необязательного ключа в байтах cbHashLen: Число, (1..64) Желаемая длина хэша в байтах Выход: Хэш Хэш cbHashLen байт Инициализируйте вектор состояния h с помощью IV h 0..7 ← IV 0..7 Смешайте размер ключа (cbKeyLen) и желаемую длину хеша (cbHashLen) в h 0 h 0 ← h 0 xor 0x0101kknn , где kk — длина ключа (в байтах), nn — желаемая длина хеша (в байтах) Каждый раз при сжатии мы записываем, сколько байт было сжато. cBytesCompressed ← 0 cBytesRemaining ← cbMessageLen Если был указан ключ (т.е. cbKeyLen > 0) , то дополните его конечными нулями, чтобы сделать его 128 байт (т.е. 16 слов), и добавьте его в начало сообщения M if (cbKeyLen > 0) then M ← Pad(Клавиша, 128) || M cBytesRemaining ← cBytesRemaining + 128 конец, если Сжать все 128-байтовые фрагменты сообщения, за исключением последнего фрагмента while (cBytesRemaining > 128) do chunk ← получить следующие 128 байт сообщения M cBytesCompressed ← cBytesCompressed + 128 увеличить количество сжатых байтов cBytesRemaining ← cBytesRemaining - 128 уменьшить количество байтов в M, оставшихся для обработки h ← Compress(h, chunk, cBytesCompressed, false) false ⇒ это не последний кусок end while Сжать последние байты из фрагмента M ← получить следующие 128 байт сообщения M Мы получим cBytesRemaining байт (т. е. 0..128 байт) cBytesCompressed ← cBytesCompressed+cBytesRemaining Фактическое количество байтов, оставшихся в фрагменте M ← Pad(chunk, 128) Если M был пуст, то мы все равно сожмем последний фрагмент нулей h ← Compress(h, chunk, cBytesCompressed, true) true ⇒ это последний кусок Результат ← первые cbHashLen байты вектора состояния little endian h Конец алгоритма BLAKE2b
Функция Compress берет полный 128-байтовый фрагмент входного сообщения и добавляет его в текущий массив состояний:
Функция Compress Вход: h Фрагмент вектора постоянного состояния Фрагмент сообщения размером 128 байт (16 двойных слов) для сжатия t: Число, 0..2 128 Количество байтов, переданных в сжатие IsLastBlock: Логическое значение Указывает, является ли это последним раундом сжатия Выход: h Обновленный вектор постоянного состояния Настройка локального рабочего вектора V V 0..7 ← h 0..7 Первые восемь элементов копируются из постоянного вектора состояния h V 8..15 ← IV 0..7 Оставшиеся восемь элементов инициализируются из IV Смешиваем 128-битный счетчик t с V 12 :V 13 V 12 ← V 12 xor Lo(t) Lo 64-бит UInt128 t V 13 ← V 13 xor Hi(t) Hi 64-бит UInt128 t Если это последний блок, то инвертируем все биты в V 14 , если IsLastBlock , то V 14 ← V 14 xor 0xFFFFFFFFFFFFFFFF Обрабатывать каждый 128-байтовый фрагмент сообщения как шестнадцать 8-байтовых (64-битовых) слов m m 0..15 ← фрагмент Двенадцать раундов смешивания криптографических сообщений для i от 0 до 11 do Выберите график смешивания сообщений для этого раунда. BLAKE2b использует 12 раундов, в то время как SIGMA имеет только 10 записей. S 0..15 ← SIGMA[i mod 10] Раунды 10 и 11 используют SIGMA[0] и SIGMA[1] соответственно Mix(В 0 , В 4 , В 8 , В 12 , м[С0 ] , м[С1 ] ) Mix(В 1 , В 5 , В 9 , В 13 , м[С 2 ], м[С 3 ]) Mix(В 2 , В 6 , В 10 , В 14 , м[С 4 ], м[С 5 ]) Микс(В 3 , В 7 , В 11 , В 15 , м[С6 ] , м[С7 ] ) Mix(В 0 , В 5 , В 10 , В 15 , м[С 8 ], м[С 9 ]) Mix(В 1 , В 6 , В 11 , В 12 , м[С 10 ], м[С 11 ]) Mix(В 2 , В 7 , В 8 , В 13 , м[С 12 ], м[С 13 ]) Mix(V 3 , V 4 , V 9 , V 14 , m[S 14 ], m[S 15 ]) конец для Смешать верхнюю и нижнюю половины V в текущий вектор состояния h h 0..7 ← h 0..7 xor V 0..7 h 0..7 ← h 0..7 xor V 8..15 Результат ← h Конец функции Сжатие
Функция Mix вызывается функцией Compress и смешивает два 8-байтовых слова из сообщения в хэш-состояние. В большинстве реализаций эта функция будет записана в виде встроенной функции или в виде встроенной функции.
Функция Mix Входы: V a , V b , V c , V d четыре 8-байтовых записи слова из рабочего вектора V x, y две 8-байтовых записи слова из дополненного сообщения m Выход: V a , V b , V c , V d модифицированные версии V a , V b , V c , V d V a ← V a + V b + x с входом V d ← (V d xor V a ) rotateright 32 V c ← V c + V d нет входа V b ← (V b xor V c ) повернуть вправо 24 V a ← V a + V b + y с входом V d ← (V d xor V a ) повернуть вправо 16 V c ← V c + V d нет входа V b ← (V b xor V c ) повернуть вправо 63 Результат ← V a , V b , V c , V d Конечная функция Mix
Значения хэш-функции пустой строки:
BLAKE2s-224("") =1fa1291e65248b37b3433475b2a0dd63d54a11ecc4e3e034e7bc1ef4BLAKE2s-256("") =69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9BLAKE2b-384("") =b32811423377f52d7862286ee1a72ee540524380fda1724a6f25d7978c6fd3244a6caf0498812673c5e05ef583825100BLAKE2b-512("") =786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce
Изменение одного бита приводит к изменению каждого бита на выходе с вероятностью 50%, демонстрируя лавинный эффект :
BLAKE2b-512("Быстрая коричневая лиса перепрыгивает через ленивую собаку") =a8add4bdddfd93e4877d2746e62817b116364a1fa7bc148d95090bc7333b3673f82401cf7aa2e4cb1ecd90296e3f14cb5413f8ed77be73045b13914cdcd6a918BLAKE2b-512("Быстрая коричневая лиса перепрыгивает через ленивую до ф ") =ab6b007747d8068c02e25a6008db8a77c218d94f3b40d2291a7dc8a62090a744 c082ea27af01521a102e42f480a31e9844053f456b4b41e8aa78bbe5c12957bb
В дополнение к эталонной реализации [5] следующие криптографические библиотеки предоставляют реализации BLAKE2:
Общий | |
---|---|
Дизайнеры | Джек О'Коннор, Сэмюэл Невес, Жан-Филипп Омассон, Зуко Уилкокс-О'Хирн |
Впервые опубликовано | 9 января 2020 г. ( 2020-01-09 ) |
Получено из | Бао, БЛЕЙК2 |
Деталь | |
Размеры дайджеста | 256 бит, произвольно расширяемый |
Структура | дерево Меркла |
Раунды | 7 |
Скорость | 0,49 cpb на Cascade Lake-SP с AVX-512 [24] |
BLAKE3 — это криптографическая хеш-функция, основанная на Bao и BLAKE2, созданная Джеком О'Коннором, Жаном-Филиппом Аумассоном, Сэмюэлем Невесом и Зуко Уилкокс-О'Хирном . [25] Она была анонсирована 9 января 2020 года на Real World Crypto . [26]
BLAKE3 — это единый алгоритм со множеством желаемых функций (параллелизм, XOF , KDF , PRF и MAC ), в отличие от BLAKE и BLAKE2, которые являются семействами алгоритмов с несколькими вариантами. BLAKE3 имеет структуру двоичного дерева , поэтому он поддерживает практически неограниченную степень параллелизма (как SIMD, так и многопоточность) при достаточно длинных входных данных. Официальные реализации Rust и C [27] имеют двойную лицензию : как общественное достояние ( CC0 ) и Apache License . [28]
BLAKE3 разработан так, чтобы быть максимально быстрым. Он постоянно в несколько раз быстрее, чем BLAKE2. Функция сжатия BLAKE3 тесно связана с функцией BLAKE2s, с самым большим отличием в том, что количество раундов сокращено с 10 до 7, изменение основано на предположении, что текущая криптография слишком консервативна. [29] В дополнение к обеспечению параллелизма, формат дерева Меркла также позволяет осуществлять проверенную потоковую передачу (проверку на лету) и инкрементные обновления. [27]