Skip to content

Latest commit

 

History

History
53 lines (34 loc) · 8.19 KB

readme.md

File metadata and controls

53 lines (34 loc) · 8.19 KB

Keccak256

Автор: Роман Ярлыков 🧐

Keccak256 - это криптографический алгоритм хеширования. Он является членом семейства хеш-функций SHA-3 и был выбран в качестве стандарта хеш-функций NIST в 2012 году. Очень подробно о том, как работает алгоритм, можно почитать в стандарте и в документации от команды keccak, но там очень много криптографии, для понимания его работы достаточно знать только несколько основных вещей о хеш-функциях и о самом алгоритме.

Что такое хеш-функция?

Хеш-функция - это функция, которая принимает произвольный набор данных в качестве входных данных (сообщение) и выдает фиксированную длину хш-значения в качестве выходных данных (дайджест). Длина сообщения может варьироваться, но длина дайджеста фиксирована.

Хеш-функция не может быть обратимой, то есть невозможно вычислить входные данные по хеш-значению. Это означает, что хеш-функция не может быть использована для шифрования данных, но она может быть использована для создания цифровых подписей, которые могут быть проверены, чтобы убедиться, что данные не были изменены.

Хеш-функции являются компонентами для многих важных приложений информационной безопасности, включая:

  1. генерацию и проверку цифровых подписей;
  2. деривацию ключей (например используется для создание HD-кошельков, когда из мастер-ключа генерируются дочерние ключи (подробнее тут), что позволяет зная только мнемоническую фразу восстановить все аккаунты кошелька);
  3. генерацию псевдослучайных битов (это процесс генерации последовательности битов, которые кажутся случайными, но на самом деле генерируются детерминированным алгоритмом, при этом без ключа нельзя угадать эту последовательность).

Почему keccak256?

Длина дайджеста (выходных данных) криптографической функции может быть разной, например 160, 224, 256, 384 и 512 бит. Чем больше длина дайджеста, тем больше информации он может содержать, но тем дольше будет процесс его вычисления. Поэтому, как правило, используются дайджесты длиной 256 бит, так как они достаточно длинные, чтобы содержать достаточно информации, но при этом вычисляются достаточно быстро.

Keccak256 считается высокозащищенным алгоритмом хеширования, который устойчив к различным типам атак, таким как атаки на предварительный образ, атаки на коллизии и атаки на увеличение длины. При этом он является одним из самых эффективных алгоритмов хеширования и его поддерживает большое количество библиотек. По этим причинам он был выбран для использования в таких блокчейнах как Ethereum и Bitcoin для выполнения различных задач.

Функции семейства keccak основаны на функции губки. В контексте криптографии конструкция губки — это режим работы, основанный на перестановке (или преобразовании) фиксированной длины, а также правиле заполнения, которое строит функцию, отображающую ввод переменной длины в вывод переменной длины. Подробнее о функции губки тут.

Keccak256 в Solidity

keccak256 — это также функция, встроенная в Solidity. Она принимает любое количество входных данных и преобразует их в уникальный 32-байтовый хеш (32 байта это как раз 256 бит).

Можно попробовать выполнить этот код в Remix. Нужно ввести текст, число и адрес Ethereum в функцию чтобы получить на вывод хеш bytes32. Затем изменить один из параметров и повторно сгенерировать вывод хеша - можно заметить, что хеш изменился. Если ввести первоначальные параметры то можно снова получить исходны хеш.

    pragma solidity 0.8.17;

    contract Hash {
        function hash(string memory _text, uint256 _number, address _address) public pure returns (bytes32) {
            return keccak256(abi.encodePacked(_text, _number, _address));
        }
    }

В смарт-контрактах функция keccak256 используется для различных целей, например работа с подписями, создание хеш-таблиц (маппингов), вычисление селектора функций, работа с деревом Меркла и т.д.

Также функция keccak256 может быть использована не только для служебных целей, но и для определенной логики на смарт-контракте, например в схеме commit-reveal, когда пользователь сначала отправляет транзакцию с хешированными данными, а затем отправляет реальные данные, которые будут проверены на соответствие этому хешу.

Links

  1. SHA-3 Standard
  2. Keccak
  3. Ethereum 201: HD Wallets
  4. Hashing Functions In Solidity Using Keccak256
  5. Hashing with Keccak256
  6. Keccak-256 online tool