Криптография и шифрование данных — часть 3
04.11.2021 | mnalilovich
Криптография — основа работы систем распределенного реестра, только, в отличие от традиционных систем, шифрование гарантирует безопасность на основе прозрачности вех совершенных действий, а не на ограничении доступа к системам. Таким образом, благодаря криптографии, принципам математики и свободной экономической модели удалось добиться полностью формализованного подхода к работе.
В заключительной части про основы криптографии разберем, как Сатоши Накомото смог объединить в блокчейне биткоина сразу два принципа криптографии, которые, в отличие от сессионных ключей и гибридных схем шифрования, хотя и работают в единой системе, не зависят друг от друга.
Хеш-функции
Хеш-функции позволяют преобразовать массив входных данных любой длины в выходную строку фиксированной длины. Независимо, целая книга или одна буква, фотография или трехчасовой фильм попадут на вход хеш-функции, конечная строка всегда будет заданной длины.
Существует два базовых типа хеш-функций:
- обычные,
- криптографические.
К последним предъявляются повышенные требования, и применяются они в более значимых системах. Над разработкой криптографических хеш-функций трудятся лучшие математики, а их стойкость проверятся экспертами по безопасности по всему миру.
Реализация хеш-функций есть практически в каждом языке программирования. Однако, главная особенность хорошей хеш-функции – абсолютная защита от коллизий, то есть, независимо от разности исходных данных, никогда не получится на выходе одинаковая строка. Также можно отметить лавинный эффект хороших хеш-функций. Последнее означает, что даже самое незначительное изменение входных данных приводит к кардинальным изменениям исходящей строки.
Для лучшего понимания последнего принципа рассмотрим простейший пример построения хеша SHA-256, который применяется и в биткоине, на самом распространенном языке программирования – Python: import hashlib // Импортируем библиотеку и создадим функцию, которая принимая def hash (message): // на вход некое сообщение будет возвращать хеш этих данных return hashlib.sha256(message.encode()).hexdigest()
hash_hex(‘Cryptex’) // Захешируем название биржи ‘d8902aefbffe8d53c70e2d47edff86018cf104ab8d7b69f766eb056ad12c4026’
hash_hex(‘cryptex’) // Заменим первую букву на строчную ‘1973223a21d99bbbe64bbe6d31aca7aeb155664eead280132676bc6695a79a37’
hash_hex(‘Crypteх’) // Последний символ заменим на русскую «Х» ‘27e788fb99239eafa8f053711465456164f7a7b0582aecac01c7bf860584f27b’
Как видно на примере, даже самые незначительные изменения не позволяют понять по хешу, что на вход поступали схожие данные.
Именно благодаря этим принципам и удается добиться в блокчейне необратимости цепочки транзакций. Каждый последующий блок включает в себя хеш предыдущего, а транзакции в самом блоке хешируются не по отдельности друг за другом, а собираются в единое значение по принципу двоичного дерева хешей Меркла. Таким образом, абсолютно все транзакции, совершенные за время существования блокчейна, выражаются всего в одном хеше — хеше последнего блока в цепочке.
Ключи и цифровые подписи
Цифровые подписи в блокчейне организованны на принципах ассиметричной криптографии. Подписание транзакции в данном случае происходит закрытым ключом, который должен хранится в секрете, а проверка подлинности на стороне блокчейна осуществляется при помощи открытого ключа. Как мы уже знаем, открытый ключ легко вычислить, а вот необратимость функции не позволяет узнать закрытый ключ, или для этого придется потратить колоссальное количество ресурсов.
В общем случае принцип реализации подписей с открытым ключом можно представить в виде следующей последовательности:
- пользователь А хочет перевести одну монету криптовалюты пользователю Б,
- А формирует перевод, где указывает данные на предыдущую транзакцию на свой адрес, откуда и будут браться монеты, а также данные открытого ключа пользователя Б,
- А подписывает транзакцию при помощи своего приватного ключа и отправляет данные в сеть.
Таким образом, любой участник сети имеет возможность проверить подлинность подписи транзакции, соотнеся адрес получения, на который А пришли монеты, а также ее собственный перевод в адрес Б. Если оба этих условия окажутся истинными, то отправленные монеты сеть будет считать уже принадлежащими Б.
Отсутствие централизованных узлов в криптовалютах позволяет сделать безопасность сети децентрализованной, а возможность вмешательства в работу блокчейна сводит практически до нуля.
Для более полного понимания работы криптографии в блокчейн системах, необходимо рассмотреть еще один немаловажный аспект поддержания работоспособности сети и безопасности – [майнинг](/blog/tools/technologies/ chto-takoe-maining-kriptovalut-c-tochki-zreniya-kriptografii/).