Pull to refresh

Поиск коллизий в SHA-256 на платформе Node.js при помощи Bitcoin Hasher

Reading time7 min
Views6.9K

Перед началом чтения хочу предупредить, что все описанные ниже определения и проделанные мною исследования несут в себе ознакомительный характер и являются неполными или неточными.

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

Для понимания работы приложения Bitcoin Hasher содержание статьи было поделено на небольшие разделы:

  1. Немного теории

  2. Немного о SHA-2

  3. Немного о Blockchain

  4. Bitcoin Hasher

  5. Полезные материалы

1. Немного теории

Алгоритмом шифрования называется некая функция принимающая на вход строку произвольной длины, которая посредством определённого математического алгоритма преобразует INPUT (строку произвольной длины) в OUTPUT (строку фиксированной длины). Данный процесс конвертации называется хешированием или шифрованием. Конечным результатом шифрования любой подающей на вход информации называется цифровым отпечатком (дайджестом). Цель любого алгоритма заключается в сжатии, рассеивании и перемешивании входной информации. Оттого насколько сильно она преобразована будет зависеть не только безопасность этого самого отпечатка, но и алгоритма хеширования посредством которого был сформирован отпечаток. Наглядный процесс конвертации показан на схеме:

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

  1. В результате преобразования полученный фиксированный ключ должен обеспечивать надёжную защиту информации

  2. При незначительном изменении входной информации пропускаемую через hash-функцию должно соблюдаться существенное изменение выходного значения

  3. Отсутствие какой-либо зависимости между входной и выходной информацией

  4. Сложность или невозможность подбора входного значения для цифрового отпечатка

Целью шифрования информации при выборе наиболее стойкого и нового стандарта является сохранение и необратимое преобразование исходных данных, что на мой взгляд является и одним из важнейших его преимуществ. Недостатком - появление неизбежных коллизий при преобразовании. Предположим что есть два отличающихся информацией входных блока (x) которые нужно "пропустить" через функции хеширования (H) и получить фиксированной длины отпечатки (y). Если блоки (x) проходящие через функции (H) будут иметь одинаковые отпечатки (y) значить в результате выполненной работы образуется коллизия:

2. Немного о SHA-2

На момент написания этой статьи одним из наиболее эффективных алгоритмов хеширования является семейство криптографических систем защиты информации SHA-2 (Secure Hash Algorithm Version 2 - безопасный алгоритм хеширования, версия 2).

Все функции, которые входят в данное "семейство", а именно: SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/256 и SHA-512/224 построены на основе структуры Меркла-Дамгарда, что сказывается на их реальной стойкости к различным видам атак. Принцип работы абсолютно всех вышеприведённых алгоритмов заключается в разбивке входящей информации на части одинакового размера, каждая из которых подвергается обработке выбранной односторонней функцией сжатия. Ключевым преимуществом при таком подходе является алгоритмическая односторонность, то бишь невозможность восстановления каких-либо исходных данных на основе полученного выходного результата без наличия сформированного ключа. Данное элегантное решение было представлено взамен устаревшему SHA-1 Агентством Национальной Безопасности США в 2002 году для более надёжного шифрования конфиденциальных данных. Одним из наиболее применимых на сегодняшний день алгоритмов является SHA-256, свою популярность по внедрению его в различные системы он завоевал благодаря таким масштабным проектам как: Bitcoin и Blockchain (о Blockchain далее остановимся чуть подробнее). Все представленные функции благополучно работают и применяются по сегодняшний день.

Ниже представлен результат работы каждого из алгоритмов, которые входят в семейство SHA-2:

SHA-224:       Hello World ! --> 2c8abaa6a94a76fe9c6005994567d67a1631bc90dfca267099dc750f
SHA-256:       Hello World ! --> 07f2bdef34ed16e3a1ba0dbb7e47b8fd981ce0ccb3e1bfe564d82c423cba7e47
SHA-384:       Hello World ! --> 67e60f9ce837caa3ca82550f0dfcbde1b8b8a7c1605fa8d115bcc2314204fd95f5f607306622c38c0205de7df6d426d8
SHA-512:       Hello World ! --> feab0028f1142d420a1425d1dd5b518225b4523aa1cff63385ece3411318819f5ec83042ccb79d81f20e4a243866886ca3ae3026153acff8e126c0e89631502e
SHA-512/256:   Hello World ! --> a70e1d1268e729e90db4c0834214f449c8e7b652777f40a8a0d26f2372e39ca7
SHA-512/224:   Hello World ! --> 7cc0d174b7ce522eff7d7ee59789e420d75d0244f006ef8ce0f4efb7

3. Немного о Blockchain

Для понимания работы приложения я обязан написать пару слов о Blockchain сети так как именно она базируется на работе с алгоритмом SHA-256 а, также является важным "поставщиком входной информации" для Bitcoin Hasher.

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

Окунувшись в историю формирования технологии, работы и исследования учёных для удобства были разбиты на несколько этапов:

  1. (1991 год): Размышления о Blockchain, как о защищённом хранилище цифровых документов без возможности их подделки или возврата были описаны в работах Стюарта Хаббера и У. Скотта Шторнетта в 1991 году. Столь гениальная и стойкая идея была сформулирована задолго до появления Blockchain-сети.

  2. (1992 год): Для надёжной работы Blockchain в дизайн работы будущей сети инкорпорировали так называемое дерево Меркла, что впоследствии привело к налаживанию связей между всеми записями данных во всей цепочке глобальной экосистемы Blockchain.

  3. (2008 год): Некий человек или организация под псевдонимом Сатоши Накамото публикует документ под названием: "Bitcoin: a peer-to-peer electronic cash system". Данный документ впоследствии станет отправной точкой создания нынешнего Blockchain для валюты Bitcoin.

  4. (2009 год): В альтернативу нынешней финансовой системе Сатоши Накамото реализовывает децентрализованную, не подконтрольную не одной государственной единице, сеть Blockchain для работы с первой в мире цифровую валюту Bitcoin.

Программное решение продукта было спроектировано таким образом, что любое вмешательство в её работу не приведёт абсолютно ни к чему, так как парадигмы, которые были заложены в Blockchain с самого её основания остаются стойкими, актуальными и применимыми по сегодняшний день.

Вся информация о переводах в Blockchain хранится в виде блоков, каждый из которых представляет собой объект и имеет следующий вид (Пример блока под номером 685466, созданный 2021-05-30 08:05):

{
      "hash": "00000000000000000009fde417c010d7ec9ffb25a268f4b0667681ed9b74cf65",       (уникальный идентификатор созданного блока)
      "ver": 536870916,                                                                 (версия блока)
      "prev_block": "00000000000000000007b7241ee4748769266870bdab4e5306379739db07c466"  (уникальный идентификатор предыдущего блока),
      "mrkl_root": "8d620000ab7ba942a165ed49be563a31c33269ce8f2d40b8317784475a543fe7"   (хеш всех транзакций в текущем блоке),
      "time": 1622351111                                                                (время за которое был создан текущий блок),
      "bits": 386752379                                                                 (суб-единица BTC),
      "nonce": 3069945434                                                               (случайное значение которое можно скоректировать для подтверждения работы),
      "n_tx": 996                                                                       (колличество подтвержденных транзакций в текущем блоке),
      "size": 1602081,                                                                  (размер текущего блока)
      "block_index": 685466                                                             (индекс текущего блока),
      "height": 685466                                                                  (высота текущего блока),
      "tx": [
         "--Array of Transactions--"                                                    (Массив транзакций содержащих информацию)
      ]
   }

Достоверную информацию о всех блоках и транзакциях, можно получить на сайте Blockchain, в разделе API.

Пройдя путь от идей и размышлений до самостоятельной технологии Blockchain стал таким, каким мы знаем его сегодня. Остальными этапами дальнейшего развития и формирования, вплоть до сегодняшнего дня, сводятся в постоянной поддержке стабильного и бесперебойного процесса работы для всех пользователей децентрализованной сети.

4. Bitcoin Hasher

Bitcoin Hasher представляет собой небольшое приложение для поиска коллизий в алгоритме шифрования SHA-256.

Осуществление поиска производится путем создания так называемого "двойного шифрования" цифровых отпечатков. То бишь из уже ранее зашифрованной информации полученной из Blockchain, приложение генерировало подобный отпечаток для каждой из транзакций посредством применения SHA-256.

Алгоритм работы сводился к следующему:

  1. На клиенте JavaScript делал новый XHR-запрос к Blockchain API следующего вида: https://blockchain.info/rawblock/ (уникальный идентификатор блока вводимый в input приложения).

  2. После отправки запроса к Blockchain серверам, в ответе Bitcoin Hasher получал детальную информацию о блоке, пример которой я уже описывал.

  3. Из поля "tx" приложение "забирало" массив дайджестов подтвержденных транзакций в конкретном блоке и на их основе Node.js генерировал точно такой же цифровой отпечаток каждой из транзакций.

  4. Параллельно работы генерации из поля "prev_block" (в которое входит значение идентификатора предыдущего блока) на клиенте JavaScript создавал новый XHR-запрос следующего вида: https://blockchain.info/rawblock/ (уникальный идентификатор предыдущего блока). Данный процесс был зациклен до тех пор пока все блоки и транзакции не будут обработаны.

  5. При параллельной работе клиент-серверного приложения все INPUT-OUTPUT данные записываются в папку db_blocks/block-NUMBER_BLOCK.txt

  6. Итоговой задачей остается найти INPUT дайджест, который является ключом к интересующему вас OUTPUT отпечатку.

Полезные материалы для ознакомления с приложением:

Repository Bitcoin Hasher

Пример формирования "двойного шифрования", для блока с высотой 665862 в Blockchain

Процесс работы Bitcoin Hasher:

5. Полезные материалы

  1. Алферов А. П., Зубов А.Ю., Кузьмин А.С., Черемушкин А. В. Основы криптографии. М.: Гелиос АРВ, 2001. 479 с.

  2. Децентрализованные приложения. Технология Blockchain в действии. С. Равала

  3. Практическая криптография. Нильс Фергюсон и Брюс Шнайер

Tags:
Hubs:
-6
Comments10

Articles

Change theme settings