В главе 6 Серьезная криптография, они пишут о функция губки:
- Он выполняет операцию XOR первого блока сообщений, M1, с H0, предопределенным начальным значением внутреннего состояния (например, строкой, состоящей только из нулей). Все блоки сообщений имеют одинаковый размер и меньше, чем внутреннее состояние.
- Перестановка P преобразует внутреннее состояние в другое значение того же размера.
- Он выполняет XOR для блока M2 и снова применяет P, а затем повторяет это для блоков сообщений M3, M4 и так далее. Это называется поглощающая фаза.
- После внедрения всех блоков сообщений он снова применяет P и извлекает блок битов из состояния для формирования хэша. (Если вам нужен более длинный хеш, снова примените P и извлеките блок.) Это называется фаза сжатия.
Безопасность функции губки зависит от длины ее внутреннего состояния и длины блоков. Если блоки сообщений имеют длину r-бит, а внутреннее состояние имеет длину w-бит, то существует c = w ÷ r битов внутреннего состояния, которые не могут быть изменены блоками сообщений. Значение c называется емкостью губки, а уровень безопасности, обеспечиваемый функцией губки, равен c/2. Например, чтобы достичь 256-битной защиты с 64-битными блоками сообщений, внутреннее состояние должно быть w = 2 х 256 + 64 = 576 бит. Конечно, уровень безопасности также зависит от длины n хеш-значения. Таким образом, сложность атаки столкновением является наименьшим значением между 2^{n/2} и 2^{c/2}, тогда как сложность второй атаки с прообразом является наименьшим значением между 2^n и 2^{c/ 2}.
Чтобы быть безопасным, перестановка P должна вести себя как случайная
перестановка, без статистической предвзятости и без математической структуры
это позволило бы злоумышленнику предсказать результаты. Как при сжатии
хэши, основанные на функциях, губчатые функции также заполняют сообщения, но
заполнение проще, потому что не нужно включать сообщения
длина. За последним битом сообщения просто следует бит 1 и столько же
нули по мере необходимости.
Страница Википедии слишком непрозрачна для превращения в код.
Хотите знать, можно ли показать упрощенную демонстрацию функции губки в реальном мире, чтобы довести до конца эти 4 пункта о том, как это работает.
Некоторый вопросы связанные с его реализацией:
- Какой размер блока? Предполагая 512
- Какие входные данные (utf-8 и т.д.)? Это имеет значение?
- С чем выполнить XOR для первого блока сообщений? Какой номер? И будущие блоки тоже?
Я действительно не знаю, с чего начать, я также не нашел фрагментов кода, связанных с «функциями губки».
Бумага Keccak Sponge Functions слишком сложна в математике, чтобы можно было извлечь из нее четкую программную реализацию (по крайней мере, для меня).
Просто ищу голые основы. Возможно это настолько просто, насколько это возможно?