Хеш-функція BLAKE побудована з трьох раніше вивчених компонентів:
режим ітерації HAIFA забезпечує стійкість до атак другого роду
внутрішня структура local wide-pipe забезпечує захист від колізій
алгоритм стиснення для BLAKE є модифікованою версією потокового шифру ChaCha, який дуже добре розпаралелюється і чия безпека ретельно проаналізована[1]
Швидкодія і реалізація
Швидкодія на двох різних процесорах:
Процесор
Швидкість (тактів/байт)
BLAKE-256
BLAKE-512
Intel Core i5-2400M (Sandy Bridge)
7.49
5.64
AMD FX-8120 (Bulldozer)
11.83
6.88
Можливість реалізації на різних мікроконтролерах:
Мікроконтролер
BLAKE-256
BLAKE-512
RAM(байт)
ROM(байт)
RAM(байт)
ROM(байт)
Cortex-M3 based microcontroller (32-bit processor)
280
1320
516
1776
ATmega1284P microcontroller (8-bit processor)
267
3434
525
6350
Швидкодія на FPGA: На FPGA Xilinx Virtex 5, BLAKE-256 реалізується на 56 комірках і може досягати пропускної здатності більш ніж в 160 Мбіт/с, а BLAKE-512 — на 108 комірках зі швидкістю до 270 Мбіт/с.
Швидкодія на ASIC: На 180 nm ASIC, BLAKE-256 може бути реалізована на 13.5 kGE. На 90 nm ASIC, BLAKE-256 реалізована на 38 kGE і може досягати продуктивності в 10 Гбіт/с, а BLAKE-512 — на 79 kGE і зі швидкістю 15 Гбіт/с[2].
Функція стиснення алгоритму BLAKE-256 приймає на вхід:
Змінні ланцюжка h = h0,…,h7 (8 слів);
Блок повідомлення m = m0,…,m15;
Значення солі s = s0,…,s3;
Значення лічильника t = t0,t1.
Таким чином, на вхід їй подається 30 слів (8+16+4+2=30, 30*4 = 120 байт = 960 біт). Повертає функція стиснення тільки нове значення змінних ланцюжка: h' = h'0,…,h'7. Надалі будемо позначати h'=compress(h, m, s, t)>
Ініціалізація
16 змінних, v0,…,v15, що описують поточний стан v, ініціалізуються початковими значеннями в залежності від вхідних даних і представлені у вигляді матриці 4×4:
←
Раундова функція
Після того, як стан v ініціалізований, запускається серія з 14 раундів. Раунд — це операція над станом , яка виробляє обчислення, розбиті на наступні блоки:
на r-му раунді блок обчислень працює наступним чином:
j ← σr%10[2×i]
k ← σr%10[2×i+1]
a ← a + b + (mj ⊕ ck)
d ← (d ⊕ a) >>> 16
c ← c + d
b ← (b ⊕ c) >>> 12
a ← a + b + (mk ⊕ cj)
d ← (d ⊕ a) >>> 8
c ← c + d
b ← (b ⊕ c) >>> 7
Перші чотири блоки G0,…,G3 можуть обчислюватися паралельно, так як кожен змінює свою певну колонку змінних матриці станів. Назвемо процедуру обчислення G0,…,G3column step. Точно також можуть бути паралельно обчислені G4,…,G7, але вони в свою чергу змінюють кожен свою діагональ матриці стану v. Тому назвемо процедуру обчислення G4,…,G7diagonal step. Можливість паралельного обчислення Gi представлена графічно.
На раундах, номери r яких більше 9, використовується перестановка σr%10, наприклад, на 13-тому раунді використовується σ3.
Останній крок
Після всіх раундів нове значення змінних ланцюжка h'0,…,h'7 обчислюється із змінних матриці стану, вхідних змінних і з солі :
Опишемо процес хешування повідомлення m довжиною l<2^64 біт. Спочатку повідомлення доповнюється функцією padding даними для кратності 512 біт (64 байтам), потім, блок за блоком, його обробляє функція стиснення compression function.
У функції padding повідомлення спочатку доповнюється бітами, так, що його довжина стає по модулю 512 дорівнює 447: спочатку додається 1, потім необхідну кількість нулів. Після цього додається ще одна одиниця і 64-бітове представлення довжини повідомлення l від старшого до молодшого біта. Таким чином, довжина повідомлення стає кратною 512.
Padding гарантує, що довжина повідомлення стане кратною 512 бітам.
Щоб вирахувати хеш повідомлення, результат функції padding ділиться на блоки з 16 слів m0,…,mN-1. Нехай Li — кількість біт вихідного повідомлення у блоках m0,…,mi, тобто виключаючи ті біти, які були додані в процедурі padding. Наприклад, якщо повідомлення має довжину 600 біт, то після процедури padding воно буде мати 1024 біт і буде розділено на два блоки: m0 і m1. Притому L0=512, L1=600.
В деяких випадках останній блок не містить біт оригінального повідомлення. Наприклад, якщо у вихідному повідомленні 1020 біт, то в результаті процедури padding воно буде мати довжину 1536 біт і в m0 буде 512 біт вихідного повідомлення m1 — 508, а в m2 — 0. Виставимо L0=512, L1=1020, а L2=0. Тобто правило таке: якщо в останньому блоці немає біт оригінального повідомлення, то виставимо лічильник LN-1 рівним 0. Це гарантує, що якщо i ≠ j, то Li ≠ Lj.
Значення солі визначається користувачем або задається рівним 0, якщо її не потрібно використовувати (s0=s1=s2=s3=0). Хеш повідомлення таким чином обчислюється:
h0 ← IV
for i=0,...,N-1
hi+1 ← compress(hi,mi,s,li)
return hN.
Процес хешування наочно представлений на блок-схемі:
Алгоритм 64-бітної версії функції ідентичний: значення зсуву рівні 32, 25, 16 і 11 відповідно, число раундів збільшено до 16.
BLAKE-512("The quick brown fox jumps over the lazy dog")
= 1F7E26F63B6AD25A0896FD978FD050A1766391D2FD0471A77AFB975E5034B7AD
2D9CCF8DFB47ABBBE656E1B82FBC634BA42CE186E8DC5E1CE09A885D41F43451
BLAKE2
BLAKE2 (Сайт BLAKE2 [Архівовано 1 листопада 2018 у Wayback Machine.]) — це поліпшена версія BLAKE — одного з п'яти фіналістів конкурсу на хеш-функції SHA-3 (головним чином покращено швидкодію), представлена 21 грудня 2012 року. Розробники: Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O Hearn, і Christian Winnerlein. Була створена як альтернатива широко використовуваним в минулому MD5 і SHA-1, в яких були знайдені уразливості.
Відмінності від BLAKE
У BLAKE2, на відміну від BLAKE, немає додавання констант в раундовій функції. Також змінено константи зсуву, спрощено додавання, доданий блок параметрів, який складається з ініціалізуючими векторами. Крім того, скорочено кількість раундів з 16 до 12 у функції BLAKE2b (аналог BLAKE-512) і з 14 до 10 у BLAKE2s (аналог BLAKE-256). В результаті число тактів на біт скоротилася з 7,49 для BLAKE-256 і 5,64 для BLAKE-512 до 5,34 і 3,32 для Blake2s і Blake2b відповідно.
BLAKE2b-512("The quick brown fox jumps over the lazy dog")
= A8ADD4BDDDFD93E4877D2746E62817B116364A1FA7BC148D95090BC7333B3673
F82401CF7AA2E4CB1ECD90296E3F14CB5413F8ED77BE73045B13914CDCD6A918