SHAKE128
SHAKE128 — это криптографическая хеш-функция с переменной длиной выхода, входящая в семейство SHA-3 (Secure Hash Algorithm 3), стандартизированное Национальным институтом стандартов и технологий США (NIST) в 2015 году. В отличие от классических хеш-функций (например, SHA-256), SHAKE128 является функцией с расширяемым выходом (XOF — eXtendable Output Function), что позволяет генерировать хеш-значение произвольной заданной длины. Алгоритм основан на конструкции «губка» (sponge construction) и использует внутреннюю функцию Keccak, победившую в конкурсе NIST на новый стандарт хеширования. SHAKE128 обеспечивает уровень безопасности, эквивалентный 128-битному (устойчивость к коллизиям и прообразам), при условии, что длина выходного значения не превышает 2^128 бит.
История создания
Разработка SHAKE128 связана с конкурсом NIST на новый стандарт криптографического хеширования, объявленным в 2007 году после обнаружения уязвимостей в SHA-1 и SHA-256. Победителем конкурса в 2012 году стал алгоритм Keccak, разработанный группой криптографов (Гвидо Бертони, Жоан Даймен, Микаэль Питерс и Жиль Ван Ассхе). В 2015 году NIST опубликовал стандарт FIPS PUB 202, в который вошли четыре хеш-функции с фиксированным выходом (SHA3-224, SHA3-256, SHA3-384, SHA3-512) и две функции с расширяемым выходом — SHAKE128 и SHAKE256.
Название «SHAKE» происходит от «Secure Hash Algorithm Keccak» с акцентом на возможность «встряхивания» (shake) для получения произвольной длины выхода. Число 128 в названии указывает на уровень безопасности: 128 бит.
Принцип работы
SHAKE128 основана на конструкции «губка» (sponge construction), которая состоит из двух фаз: впитывания (absorbing) и выжимания (squeezing). Внутреннее состояние алгоритма представляет собой массив битов размером 1600 бит (5×5×64), который обрабатывается с помощью раундовой функции Keccak-f[1600].
Параметры
- Скорость (rate, r): 1344 бита (168 байт). Определяет количество битов, обрабатываемых за один цикл.
- Ёмкость (capacity, c): 256 бит. Определяет уровень безопасности (128 бит).
- Размер внутреннего состояния: 1600 бит (r + c = 1344 + 256 = 1600).
Фаза впитывания
Входное сообщение разбивается на блоки размером r бит (1344 бита). Каждый блок с помощью операции XOR накладывается на первые r бит текущего внутреннего состояния, после чего применяется раундовая функция Keccak-f[1600] (24 раунда). Если длина сообщения не кратна r, выполняется дополнение (padding) по правилу: добавляется бит 1, затем необходимое количество нулевых битов и завершающий бит 1 (так называемое «10*1» дополнение).
Фаза выжимания
После обработки всего сообщения начинается фаза выжимания. Первые r бит внутреннего состояния выдаются как часть выходного значения. Если запрошенная длина выхода превышает r бит, то после выдачи первых r бит снова применяется раундовая функция Keccak-f[1600], и процесс повторяется до тех пор, пока не будет получено необходимое количество бит.
Отличия от SHA-256 и SHA-3
| Характеристика | SHA-256 | SHA3-256 | SHAKE128 |
|---|---|---|---|
| Тип | Хеш-функция | Хеш-функция | Функция с расширяемым выходом (XOF) |
| Длина выхода | Фиксированная (256 бит) | Фиксированная (256 бит) | Переменная (от 0 до 2^128 бит) |
| Конструкция | Меркла-Дамгорда | Губка (Keccak) | Губка (Keccak) |
| Внутреннее состояние | 256/512 бит | 1600 бит | 1600 бит |
| Скорость (r) | — | 1088 бит | 1344 бит |
| Ёмкость (c) | — | 512 бит | 256 бит |
| Устойчивость к коллизиям | 128 бит | 128 бит | min(128 бит, d/2) где d — длина выхода |
Основное преимущество SHAKE128 перед SHA-256 и SHA3-256 — возможность получения хеша произвольной длины, что удобно для генерации ключей, псевдослучайных чисел и других задач, где требуется нестандартный размер выхода.
Применение
SHAKE128 используется в различных криптографических протоколах и стандартах:
- Стандарт подписи ED25519 (RFC 8032): SHAKE128 применяется в варианте Ed25519ctx для хеширования сообщений, хотя основная реализация использует SHA-512.
- Квантово-устойчивая криптография: алгоритмы, такие как Falcon (подпись на решётках) и SPHINCS+ (подпись на хешах), используют SHAKE128 или SHAKE256 в качестве криптографического примитива.
- Генерация ключей: в протоколах TLS 1.3 и SSH для получения ключей сеанса.
- Стандарт NIST SP 800-185: описывает использование SHAKE128 для построения других криптографических функций, таких как cSHAKE (customizable SHAKE) и KMAC (Keccak Message Authentication Code).
- Блокчейн и криптовалюты: некоторые проекты (например, Ethereum 2.0) используют SHAKE128 для хеширования данных.
Криптостойкость
SHAKE128 обеспечивает следующие уровни безопасности:
- Устойчивость к коллизиям: 128 бит (при условии, что длина выхода не превышает 256 бит). Для выхода длиной d бит устойчивость к коллизиям составляет min(128, d/2) бит.
- Устойчивость к прообразам: 128 бит (при условии, что длина выхода не менее 128 бит).
- Устойчивость ко второму прообразу: 128 бит.
На 2025 год не известно практических атак, снижающих эти показатели. SHAKE128 считается устойчивым к квантовым атакам с использованием алгоритма Гровера (квадратичное ускорение поиска прообраза), что снижает эффективную стойкость до 64 бит, что всё ещё приемлемо для многих приложений.
Реализации
SHAKE128 реализован в большинстве современных криптографических библиотек:
- OpenSSL (начиная с версии 1.1.1)
- Libsodium
- Bouncy Castle (Java)
- Python (библиотека
hashlibс версии 3.6) - Go (пакет
golang.org/x/crypto/sha3) - Rust (библиотека
sha3)
Критика
Основные замечания к SHAKE128 связаны с его производительностью: на аппаратном уровне реализация Keccak-f[1600] требует больше ресурсов, чем классические алгоритмы (например, SHA-256), что может быть критично для встраиваемых систем с ограниченными вычислительными мощностями. Кроме того, переменная длина выхода требует от разработчиков явного указания требуемого размера, что может привести к ошибкам (например, случайное указание слишком малой длины снижает криптостойкость).
Источники
- FIPS PUB 202: SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions (NIST, 2015)
- NIST SP 800-185: SHA-3 Derived Functions: cSHAKE, KMAC, TupleHash, and ParallelHash (2016)
- Бертони Г., Даймен Ж., Питерс М., Ван Ассхе Ж. «Keccak sponge function family» (2011)
- RFC 8032: Edwards-Curve Digital Signature Algorithm (EdDSA) (2017)
- Preneel B. «Cryptographic Hash Functions: Theory and Practice» (2010)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →