Криптографическая хеш-функцияКриптографические хеш-функции — это выделенный класс хеш-функций, который имеет определённые свойства, делающие его пригодным для использования в криптографии. Принципы построенияИтеративная последовательная схема![]() В общем случае в основе построения хеш-функции лежит итеративная последовательная схема. Ядром алгоритма является сжимающая функция — преобразование k входных в n выходных бит, где n — разрядность хеш-функции, а k — произвольное число, большее n. При этом сжимающая функция должна удовлетворять всем условиям криптостойкости. Входной поток разбивается на блоки по (k − n) бит. Алгоритм использует вре́менную переменную размером в n бит, в качестве начального значения которой берётся некое общеизвестное число. Каждый следующий блок данных объединяется с выходным значением сжимающей функции на предыдущей итерации. Значением хеш-функции являются выходные n бит последней итерации. Каждый бит выходного значения хеш-функции зависит от всего входного потока данных и начального значения. Таким образом достигается лавинный эффект. При проектировании хеш-функций на основе итеративной схемы возникает проблема с размером входного потока данных. Размер входного потока данных должен быть кратен (k − n). Как правило, перед началом алгоритма данные расширяются неким, заранее известным, способом. Помимо однопроходных алгоритмов, существуют многопроходные алгоритмы, в которых ещё больше усиливается лавинный эффект. В этом случае данные сначала повторяются, а потом расширяются до необходимых размеров. Сжимающая функция на основе симметричного блочного алгоритмаВ качестве сжимающей функции можно использовать симметричный блочный алгоритм шифрования. Для обеспечения большей безопасности можно использовать в качестве ключа блок данных, предназначенный к хешированию на данной итерации, а результат предыдущей сжимающей функции — в качестве входа. Тогда результатом последней итерации будет выход алгоритма. В таком случае безопасность хеш-функции базируется на безопасности используемого алгоритма. ![]() Обычно при построении хеш-функции используют более сложную систему. Обобщённая схема симметричного блочного алгоритма шифрования изображена на рис. 2. Таким образом, мы получаем 64 варианта построения сжимающей функции. Большинство из них являются либо тривиальными, либо небезопасными. Ниже изображены четыре наиболее безопасные схемы при всех видах атак. ![]() Основным недостатком хеш-функций, спроектированных на основе блочных алгоритмов, является низкая скорость работы. Необходимую криптостойкость можно обеспечить и за меньшее количество операций над входными данными. Существуют более быстрые алгоритмы хеширования, спроектированных самостоятельно, с нуля, исходя из требований криптостойкости. Наиболее распространённые из них — MD5, SHA-1, SHA-2. ТребованияК криптографическим хеш-функциям предъявляются следующие требования: 1. Сопротивление поиску прообраза: при наличии хеша должно быть трудно найти какое-либо сообщение , такое что , Это свойство связано с понятием односторонней функции. Функции, у которых отсутствует это свойство, уязвимы для атак нахождения первого прообраза. 2. Сопротивление поиску второго прообраза: при наличии сообщения , должно быть трудно найти другое сообщение (не равное ) такое, что . Это свойство иногда называют слабым сопротивлением поиску коллизий. Функции, у которых отсутствует это свойство, уязвимы для атак поиска второго прообраза. 3. Стойкость к коллизиям Коллизией для хеш-функции называется такая пара значений и ′, ′, для которой . Так как количество возможных открытых текстов больше числа возможных значений свёртки, то для некоторой свёртки найдётся много прообразов, а следовательно, коллизии для хеш-функций обязательно существуют. Например, пусть длина хеш-прообраза 6 битов, длина свёртки 4 бита. Тогда число различных свёрток — , а число хеш-прообразов — , то есть в 4 раза больше, значит хотя бы одна свёртка из всех соответствует 4 прообразам. Стойкость хеш-функции к коллизиям означает, что нет эффективного полиномиального алгоритма, позволяющего находить коллизии. Данные свойства не являются независимыми:
Для криптографии важно, чтобы значения хеш-функции сильно изменялись при малейшем изменении аргумента (лавинный эффект). Значение хеша не должно давать утечки информации даже об отдельных битах аргумента. При разработке современного российского стандарта ГОСТ Р 34.11-2012 (Стрибог) к криптографическим хеш-функциям были сформулированы следующие требования:
4. Псевдослучайность: должно быть трудно отличить генератор псевдослучайных чисел на основе хеш-функции от генератора случайных чисел, например, он проходит обычные тесты на случайность. Доказуемо безопасные хеш-функцииБезопасность хеш-функции может обеспечиваться сложностью некоторой математической задачи при наличии доказательства, что атаки, направленные на нарушение требований к ней, настолько же сложны, насколько и решение этой задачи.[1] Криптографическая хеш-функция является доказуемо защищённой от коллизий, если задача нахождения коллизий может быть средуцирована за полиномиальное время[англ.] от задачи , которая считается неразрешимой за полиномиальное время. Иначе говоря, если алгоритм позволял бы за полиномиальное время решить задачу нахождения коллизий при существовании редуцирующего алгоритма , работающего также за полиномиальное время, то последний позволил бы алгоритму решить задачу за полиномиальное время, что противоречит её сложности, а значит задача нахождения коллизий не легче задачи . Аналогично определяется доказуемая защищённость от поиска первого и второго прообраза. Стойкость к поиску второго прообраза вытекает из доказанной стойкости к коллизиям, поэтому на практике иногда теоретически доказывается только стойкость к нахождению первого прообраза и стойкость к коллизиям.[2] Некоторые задачи, полагающиеся неразрешимыми за полиномиальное время, которые могут быть использованы для построения таких функций:
Недостатки доказательного подходаПри наличии теоретических гарантий сложности, у доказательного подхода имеются и существенные недостатки:
SWIFFT является примером хеш функции, которая несколько обходит описанную проблему безопасности. Может быть показано, что для любого алгоритма, который взламывает SWIFFT с вероятностью за время найдётся алгоритм, который решает определённую математическую задачу в худшем случае за время в зависимости от и .[4] Примеры доказуемо безопасных хеш-функции
Идеальная криптографическая хеш-функцияИдеальной криптографической хеш-функцияей является такая криптографическая хеш-функция, к которой можно отнести пять основных свойств:
Таким образом, идеальная криптографическая хеш-функция, у которой длина n (то есть на выходе n бит), для вычисления прообраза должна требовать как минимум операций. Злоумышленник будет искать прообраз для идеальной хеш-функции следующим образом: у него есть число h, и ему надо найти такое m, что H(m) = h. Если это идеальная хеш-функция, то злоумышленнику остаётся лишь перебирать все возможные M и проверять, чему равна хеш-функция от этого сообщения. Результат вычисления, если m перебирается полностью, есть фактически случайное число. Если число h лежит в диапазоне от 0 до , то тогда в среднем на поиски нужного h злоумышленник будет тратить итераций. Таким образом, вычисление прообраза займёт в два раза меньше итераций, чем в идеальном случае. Вычисление второго прообраза останется . В поиске коллизий оценка даст , причём это не совсем точный результат. Данная оценка идёт из оценки так называемого «Парадокса дней рождения». Если злоумышленник хочет написать программу по поиску коллизий, ему будет оптимально вначале завести себе словарь коллизий. Соответственно, дальше он вычисляет хеш-функцию от очередного сообщения и проверяет, принадлежит эта хеш-функция очередному сообщению или нет. Если принадлежит, то коллизия найдена, и тогда можно найти по словарю исходное сообщение с данным хеш-кодом. Если нет, то он пополняет словарь. На практике такой способ не реализуется, потому что не хватило бы памяти для подобного словаря. «Атака дней рождения»Атака «дней рождения» — используемое в криптоанализе название для метода поиска коллизий хеш-функций на основе парадокса дней рождения. Суть парадокса в том, что в группе, состоящей из 23 или более человек, вероятность совпадения дней рождения (число и месяц) хотя бы у двух людей превышает 50 %. Например, если в классе 23 ученика или более, то более вероятно то, что у кого-то из одноклассников дни рождения придутся на один день, чем то, что у каждого будет свой неповторимый день рождения. «Лавинный эффект»Рассмотрим этот эффект и его роль на примере процесса хеширования блокчейна. Это свойство означает, что если мы вносим малые изменения во входную строку, то хеши (то есть output криптографической функции) будут кардинально отличаться друг от друга. Проверим это свойство на простом примере. Рассмотрим, например, результат хеш-функции из семейства MD — MD5. На вход подадим значения, у которых будут отличаться только регистр первых символов — строки практически идентичны. Однако их хеши (результат хеш-функции) различны.
«Высокая энтропия»Хорошие хеш-функции обладают свойством «Высокой энтропии». Это означает, что хеши массивов данных должны быть максимально распределены в системе в процессе хеширования, то есть обладать высоким показателем энтропии в смысле информации. Как известно, энтропия в смысле информации — мера неопределённости некоторой системы, в частности непредсказуемость появления какого-либо символа. Так, например, рассмотрим уравнение , где — конкатенация строки и строки , а — криптографическая хеш-функция. Если значение обладает высоким показателем энтропии, то найти такое значение , которое бы удовлетворяло уравнению, будет практически невозможно. Термин «Высокая энтропия» в контексте хеш-функций означает состояние, при котором значение выбрано из такого широкого круга всевозможных вариантов, что попытки угадывания методом случайного подбора имеют очень низкий шанс на успех. Например, число, которое находится в рамках от 1 до 10, обладает низким показателем энтропии, в то время как число, которое находится в интервале между 1 и , наоборот, имеет высокий показатель энтропии. Семейство хеш-функций MD и SHAНа сегодняшний день подавляющую долю применений хеш-функций «берут на себя» алгоритмы MD5, SHA-1, SHA-256, а в России — ещё и ГОСТ Р 34.11-2012 (Стрибог). Конечно, существует и множество других менее известных или распространённых только в узких сообществах алгоритмов (например, RIPEMD, TIGER, Panama и др.), однако, эти алгоритмы не так распространены. Ниже представлен анализ хеш-функций MD4, которая была предшественником MD5, а также хеш-функции SHA.
ПримененияЭлектронная подписьЧтобы убедиться, что сообщение отправил конкретный отправитель, вместе с сообщением передаётся так называемая электронная подпись. Получатель проверяет, действительно ли электронная подпись относится к данному сообщению. В связи с тем, что использование криптографии с открытыми ключами (подписывание, проверка подписей и т. д.) — процесс очень медленный, более того, если подписывать всё сообщение целиком, то размеры этой подписи будут сопоставимы с размером сообщения, подписывают не сообщение, а хеш-функцию от сообщения. И далее получатель, когда расшифровывает подпись, получает хеш-функцию. Далее он сравнивает хеш-функцию от того сообщения, которое он получил, и хеш-функцию, которая была получена в результате расшифровки. За счёт того, что хеш-функция имеет фиксированную длину, она меньше, чем само сообщение. Это позволяет быстро вычислить электронную подпись. Размер этой подписи будет мал по сравнению с размером сообщения. Проверка парольной фразыВ большинстве случаев парольные фразы не хранятся на целевых объектах, хранятся лишь их хеш-значения. Хранить парольные фразы нецелесообразно, так как в случае несанкционированного доступа к файлу с фразами злоумышленник узнает все парольные фразы и сразу сможет ими воспользоваться, а при хранении хеш-значений он узнает лишь хеш-значения, которые не обратимы в исходные данные, в данном случае — в парольную фразу. В ходе процедуры аутентификации вычисляется хеш-значение введённой парольной фразы и сравнивается с сохранённым. Примером в данном случае могут служить ОС GNU/Linux и Microsoft Windows XP. В них хранятся лишь хеш-значения парольных фраз из учётных записей пользователей. Данная система подразумевает передачу сообщения по защищённому каналу, то есть каналу, из которого криптоаналитику невозможно перехватить сообщения или послать своё. Иначе он может перехватить парольную фразу, и использовать её для дальнейшей нелегальной аутентификации. Защищаться от подобных атак можно при помощи метода «вызов-ответ». Пусть некий клиент, с именем name, производит аутентификацию по парольной фразе, pass, на некоем сервере. На сервере хранится значение хеш-функции H(pass, R2), где R2 — псевдослучайное, заранее выбранное число. Клиент посылает запрос (name, R1), где R1 — псевдослучайное, каждый раз новое число. В ответ сервер посылает значение R2. Клиент вычисляет значение хеш-функции H(R1, H(pass, R2)) и посылает его на сервер. Сервер также вычисляет значение H(R1, H(pass, R2)) и сверяет его с полученным. Если значения совпадают — аутентификация верна. В такой ситуации пароль не хранится открыто на сервере и, даже перехватив все сообщения между клиентом и сервером, криптоаналитик не может восстановить пароль, а передаваемое хеш-значение каждый раз разное. Хеширование биткойнаТранзакции платёжной системы Биткойна, которые представляются в виде некоторого массива данных, объединяются в блоки (в дальнейшем, совокупность всех блоков будем называть блокчейном) и проходят через алгоритм хеширования, то есть данные их полей подаются на вход криптографической хеш-функции. Каждая транзакция указывает, откуда списываются средства и куда они направляются. Для указания адресата используется его публичный ключ (уникальный идентификатор в сети биткойн). Чтобы адресат мог использовать полученные деньги в рамках протокола биткойна (исключаем продажу собственного кошелька — Wallet), он должен создать новую транзакцию, которая будет брать валюту с предыдущей и перенаправлять по другому адресу, используя публичный ключ. Соответственно, новая транзакция вместе с транзакциями других пользователей сети биткойн попадёт в новый блок. Таким образом число блоков в блокчейне растёт. Однако, каждая транзакция должна быть одобрена — система должна прийти к консенсусу. Для этого есть несколько способов, но в биткойне используется принцип Proof-of-Work (PoW). После принятия транзакции она считается настоящей и криптовалюта переходит от одного кошелька к другому. Система биткойна является децентрализованной системой без выделенных центров генерации блоков. Каждый участник может взять набор транзакций, ожидающих включения в журнал, и сформировать новый блок. Более того, в системах типа BitCoin такой участник (майнер) ещё и получит премию в виде определённой суммы или комиссионных от принятых в блок транзакций. Но нельзя просто так взять и сформировать блок в децентрализованных системах. Система должна прийти к консенсусу, то есть получить одобрение. Для этого есть несколько способов, но в биткойне используется принцип Proof-of-Work (PoW). Надёжность таких систем основывается именно на том, что новый блок нельзя сформировать быстрее (в среднем), чем за определённое время. Например, за 10 минут (BitCoin).
difficulty — количество нулевых бит, которые будут в начале числа target. target — число, меньше которого должен быть хеш блока, чтобы блок считался верным. Target или, точнее, difficulty зависит от текущей мощности сети и нужно менять сложность каждые n (в сети BitCoin — 2016) блоков, для того, чтобы один блок генерировался раз в 10 минут. Предположим, что в сети генерируется 2016 блоков, и каждый клиент проверяет, за какое время создавался каждый блок. Если это время больше, чем рассчитывалось, то есть больше 10 минут, то сложность уменьшается. nonce — случайное число, которое нужно подобрать майнерам для того, чтобы составить блок. Устройство структуры данных биткойнаКак уже говорилось выше, набор транзакций Биткойна представляются в виде связанных блоков данных — блокчейн. Структура устройства самого блокчейна представлена в виде связанного списка с указателями. Каждый блок имеет указатель, который содержит ссылку на предыдущий блок данных. Таким образом, для того, чтобы перейти к n + 1 блоку, необходимо пройти по указателям предыдущих n блоков. Соответственно, указатели добавляют адрес нового блока только после прохождения исходного блока данных через алгоритм хеширования биткойна — это позволяет сделать связь надёжной и защищённой. Такая система уязвима с малой вероятностью перед атаками злоумышленников, которые могут попытаться изменить данные в блокчейне, например, для осуществления собственной транзакции по выбранном адресу. Как уже говорилось, хеш каждого блока в блокчейне зависит не только от его собственного содержания, но и от содержания предыдущего блока. Таким образом, любое изменение данных в исходном блоке влечёт за собой изменение данных в других блоках. Это гарантирует неизменность блокчейна и безопасность системы, так как «подделать» блокчейн оказывается крайне тяжело. Однако, следует заметить, что хеш у каждого блока должен быть уникальным, иначе отслеживание покушений на атаку станет невозможным. Дерево МерклаВсе транзакции представлены как строки в шестнадцатеричном формате, которые хешируются для получения идентификаторов транзакций. На их основе строится хеш блока, который учитывается последующим блоком, обеспечивая неизменяемость и связность. Единое хеш-значение блока собирается при помощи дерева Меркла. Дерево Меркла — полное двоичное дерево, в листовые вершины которого помещены хеши от транзакций, а внутренние вершины содержат хеши от сложения значений в дочерних вершинах, а корневой узел дерева (Top Hash) содержит хеш от всего набора данных. ![]() Построение дерева Меркла для блокчейна биткойна происходит следующим образом: — результат хеш-функции от транзакции
При этом, когда, транзакция L1, например, будет потрачена, то данные о ней можно удалить из блока и оставить только её хеш для верификации блока. Когда будут потрачены транзакций L1 и L2, то тогда мы можем удалить и их хеши (Hash 0-0 и Hash 0-1), оставив только Hash 0, опять же в целях верификации блока. В момент, когда все транзакции окажутся использованными, тогда можно удалить все хеши, кроме Top Hash, потому что информация об этих транзакциях будет больше не нужна.
Майнинг биткойнаМайнинг — это процесс поиска консенсуса по принципу Proof-Of-Work — получение одобрения на создание нового блока. Фактически в сети BitCoin это сводится к подсчёту хеша от блока и сравнением его с числом target: если хеш оказывается меньше target, то генерируется новый блок, в противном случае — нет. Майнеры обеспечивают беспрерывный рост блокчейна. Для этого используются огромные вычислительные мощности — каждый майнер делает свой вклад в увеличение общего хешрейта биткоина (вычислительной мощности) . От показателя общего хешрейта зависит удельный вес операции хеширования биткойна каждым майнером — чем выше общий хешрейт сети, тем больший объём вычислительной работы за меньшее количество времени должен сделать майнер, чтобы сохранить средний размер своего вознаграждения за майнинг. Процесс подстановки nonce в строку длится до тех пор, пока не будет найдено верное решение. Иногда количество попыток может доходить до миллионов раз. Тот майнер, который первым найдёт верное решение, добавляет блок в блокчейн и получает за это вознаграждение. Процесс подбора nonce основан на применении метода brute force. Поэтому майнинговое оборудование непрерывно генерирует случайные строки до тех пор, пока не будет найдено необходимое значение nonce. Примеры криптовалют, которые используют хеш-функцию SHA-256 для шифрованияSHA—256 — это классический алгоритм для криптовалют: на нём построена основная криптовалюта — Bitcoin. Соответственно, и в форках биткоина используется этот алгоритм: в Bitcoin Cash, Bitcoin SV. В то же время, в Bitcoin Gold майнеры используют криптофункцию - Equihash Помимо них, SHA—256 используется также в: Также алгоритм SHA-256 используется как подпрограмма в криптовалюте Litecoin, а основным алгоритмом для майнинга её является Scrypt. См. такжеПримечания
Литература
Ссылки
|
Portal di Ensiklopedia Dunia