SHA-3
Keccak (англ. Secure Hash Algorithms-3, SHA-3) — (вимовляється як «кечак») — алгоритм гешування змінної розрядності, розроблений групою авторів на чолі з Йоаном Дайменом, співавтором Rijndael, автором шифрів MMB, SHARK, Noekeon, SQUARE і BaseKing. 2 жовтня 2012 року Keccak став переможцем конкурсу криптографічних алгоритмів, проведеним Національним інститутом стандартів і технологій США[1]. 5 серпня 2015 року алгоритм затверджено та опубліковано в якості стандарту FIPS 202[2][3]. У програмній реалізації автори заявляють про 12,5 циклах на байт при виконанні на ПК з процесором Intel Core 2. Проте в апаратних реалізаціях Keccak виявився набагато швидшим, ніж всі інші фіналісти.[4]
Алгоритм SHA-3 побудований за принципом криптографічної губки (дана структура криптографічних алгоритмів була запропонована авторами алгоритму Keccak раніше)[5].
У 2004—2005 роках кілька алгоритмів гешування були атаковані, в тому числі були опубліковані серйозні атаки проти алгоритму SHA-1, затвердженого Національним інститутом стандартів і технологій (NIST). У відповідь NIST провів відкриті семінари та 2 листопада 2007 року анонсував конкурс на розробку нового алгоритму гешування. 2 жовтня 2012 року переможцем конкурсу став алгоритм Keccak і був сертифікований як новий алгоритм SHA-3[6]. 5 серпня 2015 року алгоритм затверджено та опубліковано в якості стандарту FIPS 202[7][2].
Алгоритм був розроблений Гвідо Бертоні, Йоаном Дайменом, Жілем Ван Аше з STMicroelectronics і Мікаелем Пітерсом з NXP[8].
Алгоритм заснований на більш ранніх геш-функціях Panama і RadioGatún[9]. Panama був розроблений Джоаном Дайменом і Крейгом Клеппом в 1998 році, RadioGatún був реалізований на основі Panama Дайменом, Пітерсом і Ван Аше у 2006 році.
В ході конкурсу учасникам дозволялося вносити зміни у свій алгоритм для виправлення знайдених проблем. Зміни, внесені в алгоритм Keccak[10][11]:
- Кількість раундів було збільшено з 12 + до 12 + 2
- Padding був змінений зі складної форми на більш просту, описану нижче
- Швидкість (rate) r була збільшена до межі безпеки (раніше округлялася вниз до найближчого ступеня 2)
Геш-функції сімейства SHA-3 побудовані на основі конструкції криптографічної губки, в якій дані спочатку «вбираються» в губку, при якому початкове повідомлення піддається багатораундовим перестановкам , потім результат «віджимається» з губки. На етапі «вбирання» блоки повідомлення додаються за модулем 2 з підмножиною стану, який потім перетвориться з допомогою функції перестановки . На етапі «віджимання» вихідні блоки зчитуються з одного і того ж підмножинного стану, зміненого функцією перестановок . Розмір частини стану, який записується і зчитується, називається «швидкістю» (англ. rate) і позначається , а розмір частки, яка незаймана введенням / виведенням, називається «ємністю» (англ. capacity) і позначається .
Алгоритм отримання значення хеш-функції можна розділити на кілька етапів:
- Вихідне повідомлення додається до рядка довжини, кратній ,за допомогою функції доповнення (pad-функції).
- Рядок ділиться на блоків довжини :
- «Всмоктування»: кожен блок доповнюється нулями до рядка довжини біт і підсумовується по модулю 2 з рядком стану , де — рядок довжини біт ( = + ). Перед використанням цієї функції всі елементи дорівнюють нулю. Для кожного наступного блоку стан — рядок, отриманий застосуванням функції перестановок до результату попереднього кроку.
- «Віджимання»: поки довжина менша ( — кількість біт в результаті геш-функції), до додається перших біт стану , після кожного додавання до , застосовується функція перестановок . Потім обрізається до довжини біт
- Рядок довжини біт повертається в якості результату
Завдяки тому, що стан містить додаткових біт, алгоритм стійкий до атаки подовженням повідомлення, до якої прийняті алгоритми SHA-1 і SHA-2.
У SHA-3 стан — це масив 5 × 5 слів довжиною = 64 біта, всього 5 × 5 × 64 = 1600 біт. Також в Keccak можуть використовуватися довжини , рівні меншим ступенями 2 (від = 1 до = 32).
Для того, щоб вихідне повідомлення M можна було розділити на блоки довжини r, необхідно доповнення. У SHA-3 використовується патерн pad10*1[12]: до повідомлення додається 1, після нього 0 або більше нульових бітів (до r-1), в кінці -1.
r-1 нульових бітів може бути додано, коли останній блок повідомлення має довжину r-1 біт. Цей блок доповнюється одиницею, наступний блок складатиметься з r-1 нулів і одиниць.
Два одиничні біти додаються і в тому випадку, якщо довжина вихідного повідомлення M ділиться на r. У цьому випадку до повідомлення додається блок, який починається і закінчується одиницями, між якими r-2 нульових бітів. Це необхідно для того, щоб повідомлення, що закінчується послідовністю бітів як у функції доповнення, і для повідомлення без цих бітів значення геш-функції були різні.
Перший одиничний біт необхідний для того, щоб результати геш-функції від повідомлень, що відрізняються кількома нульовими бітами в кінці, були різними.
Функція перестановок, використовувана в SHA-3, включає в себе виключне «АБО» (XOR), побітове «І» (AND) і побітове заперечення (NOT). Функція визначена для рядків довжини-2 ступеня . В основній реалізації SHA-3 ().
Стан можна подати у вигляді тривимірного масиву розміром 5 × 5 × . Тоді елемент масиву - це біт рядка стану .
Функція містить кілька кроків: , , , , , які виконуються декілька раундів. На кожному кроці позначимо вхідний масив A, вихідний масив A'.
Для всіх і таких, що , , покладемо
Для всіх таких, що , , ,
Для всіх , таких, як ,
Нехай на початку . Для від 0 до 23:
- , таких, що , ,
Для всіх таких, що ,
Для всіх , таких, що , ,
Введемо додаткову функцію , де вхід — ціле число , а на виході біт.
- Якщо , то повертається 1
- Нехай
- Для t від 1 до 255:
- R = 0 || R
- Повертати
— номер раунду.
- Для всіх , таких, як , ,
- Нехай — масив довжини , заповнений нулями.
- Для від 0 до :
- Для всіх , таких, як ,
- Переклад рядка в масив
- Для від до
- Переклад масиву в рядок довжини
Основою функції стиснення алгоритму є функція f, яка виконує перемішування внутрішнього стану алгоритму. Стан (позначимо його A) представляється у вигляді масиву 5×5, елементами якого є 64-бітові слова, ініційовані нульовими бітами (тобто, розмір стану складає 1600 бітів). Функція f виконує 24 раунди, в кожному з яких проводяться наступні дії:
C[x] = A[x, 0] A[x, 1] A[x, 2] A[x, 3] A[x, 4], x = 0…4; D[x] = C[x — 1] (С[x + 1] >>> 1), x = 0…4; A[x, y] = A[x, y] D[x], x = 0…4, y = 0…4; B[y, 2x + 3y] = A[x, y] >>> r[x, y], x = 0…4, y = 0…4; A[x, y] = B[x, y] (~B[x + 1, y] & B[x + 2, y]), x = 0…4, y = 0…4,
- B — тимчасовий масив, аналогічний за структурою масиву стану;
- C та D — тимчасові масиви, що містять по п'ять 64-бітних слів;
- r — масив, що визначає величину циклічного зсуву для кожного слова стану;
- ~x — порозрядний додаток до x;
- та операції з індексами масиву виконуються по модулю 5.
Крім наведених вище операцій, в кожному раунді також виконується накладення операцією XOR раундової константи на слово A[0, 0].
Перед виконанням функції стискання накладається операція XOR фрагментів вихідного повідомлення з фрагментами вихідного стану. Результат обробляється функцією f. Дане накладення в сукупності з функцією стискання, що виконуються для кожного блоку вхідних даних, являють собою «вбираючу» (absorbing) фазу криптографічного губки.
Варто зазначити, що функція f використовує лише операції, стійкі до атак, що використовують витік даних по побічних каналах.
Результуюче геш-значення обчислюється в процесі виконання «вичавлень» (squeezing) фази криптографічної губки, основу якої становить описана вище функція f. Можливі розміри геш-значень — 224, 256, 384 512 біт.
Оригінальний алгоритм Keccak має безліч параметрів, що налаштовуються з метою забезпечення оптимального співвідношення криптостійкості і швидкодії для певного застосування алгоритму на певній платформі. Регульованими величинами є: розмір блоку даних, розмір стану алгоритму, кількість раундів у функції f() та інші.
Протягом конкурсу гешування Національного інституту стандартів і технологій учасники мали право налаштовувати свої алгоритми для вирішення виникаючих проблем. Так, були внесені деякі зміни в Keccak: кількість раундів було збільшено з 18 до 24 з метою збільшення запасу безпеки.
Автори Keccak заснували ряд призів за досягнення в криптоаналізі даного алгоритму.
Версія алгоритму, прийнята в якості остаточного стандарту SHA-3, має кілька незначних відмінностей від оригінальної пропозиції Keccak на конкурс. Зокрема, були обмежені деякі параметри (відкинуті повільні режими c=768 і c=1024), в тому числі для збільшення продуктивності[13][14][15][16]. Також у стандарті були введені функції з подовжуваним результатом» (XOF, Extendable Output Functions) SHAKE128 і SHAKE256, для чого гешоване повідомлення необхідно було доповнювати «суфіксом» з 2 або 4 біт, в залежності від типу функції.
Функція | Формула |
---|---|
SHA3-224(M) | Keccak[448](M||01, 224) |
SHA3-256(M) | Keccak[512](M||01, 256) |
SHA3-384(M) | Keccak[768](M||01, 384) |
SHA3-512(M) | Keccak[1024](M||01, 512) |
SHAKE128(M, d) | Keccak[256](M||1111, d) |
SHAKE256(M, d) | Keccak[512](M||1111, d) |
У грудні 2016 року Національний інститут стандартів і технологій США опублікував новий документ, NIST SP.800-185[17], що описує додаткові функції на основі SHA-3:
Функція | Опис |
---|---|
cSHAKE128(X, L, N, S) | Параметризується версія SHAKE |
cSHAKE256(X, L, N, S) | |
KMAC128(K, X, L, S) | Імітовставка на основі Keccak |
KMAC256(K, X, L, S) | |
KMACXOF128(K, X, L, S) | |
KMACXOF256(K, X, L, S) | |
TupleHash128(X, L, S) | Гешування кортежу рядків |
TupleHash256(X, L, S) | |
TupleHashXOF128(X, L, S) | |
TupleHashXOF256(X, L, S) | |
ParallelHash128(X, B, L, S) | Паралелізована геш-функція на основі Keccak |
ParallelHash256(X, B, L, S) | |
ParallelHashXOF128(X, B, L, S) | |
ParallelHashXOF256(X, B, L, S) |
Значення різних варіантів гешів від порожнього рядка.
SHA3-224("") 6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7 SHA3-256("") a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a SHA3-384("") 0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004 SHA3-512("") a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26 SHAKE128("", 256) 7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26 SHAKE256("", 512) 46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be
Мала зміна повідомлення призводить до значних змін у значенні геш-функції завдяки лавинному ефекту як показано в наступних прикладах:
SHA3-224("The quick brown fox jumps over the lazy dog") d15dadceaa4d5d7bb3b48f446421d542e08ad8887305e28d58335795 SHA3-224("The quick brown fox jumps over the lazy dog.") 2d0708903833afabdd232a20201176e8b58c5be8a6fe74265ac54db0
SHA3-256("The quick brown fox jumps over the lazy dog")
69070dda01975c8c120c3aada1b282394e7f032fa9cf32f4cb2259a0897dfc04
SHA3-256("The quick brown fox jumps over the lazy dog.")
a80f839cd4f83f6c3dafc87feae470045e4eb0d366397d5c6ce34ba1739f734d
SHA3-384("The quick brown fox jumps over the lazy dog")
7063465e08a93bce31cd89d2e3ca8f602498696e253592ed26f07bf7e703cf328581e1471a7ba7ab119b1a9ebdf8be41
SHA3-384("The quick brown fox jumps over the lazy dog.")
1a34d81695b622df178bc74df7124fe12fac0f64ba5250b78b99c1273d4b080168e10652894ecad5f1f4d5b965437fb9
SHA3-512("The quick brown fox jumps over the lazy dog")
01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450
SHA3-512("The quick brown fox jumps over the lazy dog.")
18f4f4bd419603f95538837003d9d254c26c23765565162247483f65c50303597bc9ce4d289f21d1c2f1f458828e33dc442100331b35e7eb031b5d38ba6460f8
SHAKE128("The quick brown fox jumps over the lazy dog", 256)
f4202e3c5852f9182a0430fd8144f0a74b95e7417ecae17db0f8cfeed0e3e66e
SHAKE128("The quick brown fox jumps over the lazy dof", 256)
853f4538be0db9621a6cea659a06c1107b1f83f02b13d18297bd39d7411cf10c
Ціль | Тип атаки | Вихід | Варіант | CF Call | Пам'ять |
---|---|---|---|---|---|
Геш-функція | Колізія | 160 | r = {240, 640, 1440},
c = 160, 1, 2 раунди | ||
Геш-функція | Знаходження прообразу | 80 | r = {240, 640, 1440},
c = 160, 1, 2 раунди | ||
Перестановки | Атака-розрізнювач | Всі | 24 раунди | ||
Перестановки | Диференційна властивість | Все | 8 раундів | ||
Геш-функція | Атака-розрізнювач | 224, 256 | 4 раунди | ||
Геш-функція | Колізія | 224, 256 | 2 раунди | ||
Геш-функція | Знаходження другого прообразу | 224, 256 | 2 раунди | ||
Геш-функція | Знаходження другого прообразу | 512 | 6 раундів | ||
Геш-функція | Знаходження другого прообразу | 512 | 7 раундів | ||
Геш-функція | Знаходження другого прообразу | 512 | 8 раундів | ||
Геш-функція | Колізія | 224, 256 | 4 раунди |
- ↑ NIST Selects Winner of Secure Hash Algorithm (SHA-3) Competition. Архів оригіналу за 5 жовтня 2012. Процитовано 19 квітня 2018.
- ↑ а б NIST Releases SHA-3 Cryptographic Hash Standard. Архів оригіналу за 17 серпня 2015. Процитовано 19 квітня 2018.
- ↑ NIST Manuscript Publication Search. Архів оригіналу за 12 серпня 2015. Процитовано 19 квітня 2018.
- ↑ Shu-jen Chang, Ray Perlner, William E. Burr, Meltem Sonmez Turan, John M. Kelsey. Third-Round Report of the SHA-3 Cryptographic Hash Algorithm Competition. — DOI:10.6028/nist.ir.7896.
- ↑ Keccak Team (англ.). keccak.team. Архів оригіналу за 16 грудня 2017. Процитовано 15 грудня 2017.
- ↑ SHA-3 Project - Hash Functions | CSRC. csrc.nist.gov. Архів оригіналу за 20 листопада 2017. Процитовано 7 листопада 2017.
- ↑ NIST Releases SHA-3 Cryptographic Hash Standard. Архів оригіналу за 17 серпня 2015. Процитовано 19 квітня 2018.
- ↑ NIST Selects Winner of Secure Hash Algorithm (SHA-3) Competition. NIST. 2 жовтня 2012. Архів оригіналу за 30 квітня 2017. Процитовано 2 жовтня 2012.
- ↑ Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche. The Road from Panama to Keccak via RadioGatún : [арх. 22 грудня 2017] // Symmetric Cryptography. — Dagstuhl, Germany : Schloss Dagstuhl - Leibniz-Zentrum fuer Informatik, Germany, 2009.
- ↑ Keccak Team. keccak.team. Архів оригіналу за 13 листопада 2017. Процитовано 12 листопада 2017.
- ↑ Keccak Team. keccak.team. Архів оригіналу за 13 листопада 2017. Процитовано 12 листопада 2017.
- ↑ Morris J. Dworkin. SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions. — DOI:10.6028/nist.fips.202.
- ↑ Will Keccak = SHA-3?. 1 жовтня 2013. Процитовано 20 грудня 2013.
- ↑ What the heck is going on with NIST’s cryptographic standard, SHA-3? (англ.). 24 вересня 2013. Процитовано 20 грудня 2013.
- ↑ Yes, this is Keccak!. 4 жовтня 2013. Процитовано 20 грудня 2013. — ответное заявление от авторов Keccak
- ↑ The Keccak sponge function family. 17 січня 2011. Процитовано 30 вересня 2015. — изменение алгоритма заполнения в 3-м раунде конкурса
- ↑ SHA-3 Derived Functions: cSHAKE, KMAC, TupleHash and ParallelHash
- NIST Selects Winner of Secure Hash Algorithm (SHA-3) Competition [Архівовано 5 жовтня 2012 у Wayback Machine.] / NIST, October 2012 (англ.)
- The Keccak sponge function family [Архівовано 12 жовтня 2016 у Wayback Machine.] / Сайт Noekeon, 2015-10-15 — Офіційна сторінка хеш-функції Keccak (англ.)
- Хеш-функція Keccak і конструкція Sponge як універсальний криптопримитив [Архівовано 23 червня 2013 у Wayback Machine.], pgpru.com, 2010—2013 (переклад матеріалу з noekon.org)
- SHA-3 Standard: Перестановка-Based Hash and Extendable-Output Functions | NIST [Архівовано 17 вересня 2017 у Wayback Machine.] (англ.)
- Software resources. https://keccak.team/. The Keccak team. Архів оригіналу за 7 грудня 2017. Процитовано 6 грудня 2017.
- Java implementation, Pitaya