Криптография - ядро ​​технологии блокчейн

Потребность в кодировании информации возникла одновременно с развитием письменности. Зашифрованное письмо было впервые использовано в Древнем Египте, Месопотамии и Древней Индии. Со временем люди научились использовать специальные инструменты для кодирования текста. Одним из первых известных криптографических устройств был скайтал, который использовался для отправки сообщений спартанскими военными. Технология криптографии постоянно развивается. Поскольку существующие методы шифрования перестали быть эффективными, люди изобретали новые способы кодирования информации.

Во время Второй мировой войны Третий рейх использовал очень сложные электромеханические роторные шифраторы, называемые машинами Enigma, для кодирования своих военных сообщений. Машина Enigma состояла из клавиатуры, роторов, печатных плат и ламп. Вводимый текст преобразовывался в шифр роторами, положение которых изменялось при каждом нажатии клавиши. Чтобы взломать код Enigma, потребовались годы усилий центра дешифрования из 10 000 человек.

С появлением компьютеров криптография вышла на новый уровень. Многие страны, особенно США, создали новые программы шифрования, спонсируемые государством. Среди них - алгоритм хеширования безопасности SHA-256, разработанный NIST. Теперь, среди множества других приложений, этот алгоритм используется для создания блоков в биткойнах. В сети блокчейнов Ethereum используется алгоритм Keccak, на основе которого был создан новый стандарт алгоритма хеширования SHA-3, впервые опубликованный в 2015 году.

SHA-256 и процесс создания блока

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

Вот пример текста в сравнении с его хешем:

Как видите, длина текста, преобразованного с использованием SHA-256, не влияет на длину хэша, который всегда состоит из 64 символов и имеет размер 256 байт. Алгоритм SHA-256 чувствителен даже к регистру вводимых букв: хеши для слов Hello и hello (с большой буквы и без буквы) совершенно разные.

Цель майнинга - определить хэш генерируемого блока, который будет подходить для всех транзакций в данной сети. Сложность майнинга возрастает, поскольку для создания отдельного блока требуется больше вычислительной мощности. По мере роста вычислительной мощности для создания блоков количество нулей в хэш-коде также растет. В настоящее время в начале хэша биткойна 20 последовательных нулей, и для создания блока требуется огромный объем вычислительных ресурсов. Однако максимальное время генерации блока остается постоянным и составляет 10 минут. Сложность майнинга автоматически увеличивается после создания каждых 2016 блоков. Эта скорость переключения была зафиксирована исходным кодом Биткойна.

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

Заголовок каждого блока состоит из следующих компонентов:

Версия, хэш заголовка предыдущего блока, хеш корня Меркла, временная метка, цель сложности и значение nonce.

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

  1. Первоначально система вычисляет хеши всех транзакций в блоке.
  2. Затем система делит эти транзакции на пары и вычисляет хеш-сумму суммы этих пар транзакций.
  3. Затем система делит вычисленные суммы на пары и вычисляет их снова и снова, пока не будет вычислен единственный хэш-код, так называемый корень.

Вот бинарное хеш-дерево Меркеля:

Как видно, дерево Меркла имеет двоичную структуру, поэтому оно должно иметь четное количество элементов. В случае появления дерева Меркла с нечетным числом элементов система удваивает его, чтобы сформировать пару.
Дерево Меркла с нечетным количеством элементов может выглядеть так:

Таким образом, все данные о транзакциях в данном блоке рассчитываются и записываются.

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

Криптография при проверке транзакций Биткойн и Эфириум

Данные в транзакциях Биткойн и Эфириум проверяются с помощью подписи, созданной так называемым алгоритмом цифровой подписи с эллиптической кривой (ECDSA). В этом алгоритме используются эллиптические кривые и конечные поля.

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

Эллиптическая кривая состоит из следующих параметров: уравнения, простого по модулю и базовой точки с простым порядком. Уравнение эллиптической кривой имеет вид y² = x³ + ax + b.

В Bitcoin, Ethereum, EOS, Litecoin и многих других криптовалютах используется эллиптическая кривая secp256k1 . Уравнение этой кривой выглядит как y² = x³ + 7 mod p. Простой модуль кривой secp256k1 равен = 2²⁵⁶ – 2³² – 2⁹ – 2⁸ – 2⁷ – 2⁶ – 2⁴ – 1 (или FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F в шестнадцатеричной форме). По сути, это большое простое число, отсюда и название простого по модулю.

Эллиптическая кривая над полем действительных чисел выглядит так:

Базовая точка G имеет простой порядок n, который можно представить графически как количество раз, которое точка может быть добавлена ​​сама к себе, пока ее наклон не станет бесконечным, или вертикальной линией. Базовая точка выбирается так, чтобы порядок был большим простым числом.

Для secp256k1 базовая точка G в сжатом виде имеет вид: G = 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798, а порядковый номер G равен: n = FFFFFFFF FFFFFFFFFFF48DAFFB08C08C08C08C08C08C08C08C08C08CA
Чтобы сгенерировать открытый ключ, мы должны умножить закрытый ключ на G:

Keypub = Keypriv × G

Открыть открытый ключ через закрытый ключ не так уж и сложно. Однако Keypriv - очень большое число, поэтому для получения закрытого ключа через открытый ключ и взлома алгоритма ECDSA необходимо вычислить 2²¹ операций для дополнительных точек. Для обычного компьютера такая операция займет более десяти миллиардов лет, и этот процесс совместим с возрастом Вселенной.

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

Для этого нам необходимо выполнить следующие операции:

  1. Вычислить z = хэш (транзакция) по модулю n
  2. Выберите случайное целое число k, которое больше или равно 1 и меньше или равно n-1 (1 ≤ k ≤ n-1).
  3. Получите точку (x, y), умножив k на G;

Обратите внимание, что k является временным секретным значением и должно быть уничтожено сразу после шага 5. Утечка секретного значения k - это то же самое, что утечка секретного ключа: если злоумышленник знает k и подпись, то он (или он) может вычислить секретный ключ.

4. Вычислить r = x mod n. Если r = 0, вернуться к шагу 1;

Функция x mod p делит x на p и возвращает только остаток от деления. Например, 78 мод 33 = 12 как 78 = (33x2) +12, или 98 мод 31 = 5 как 98 = (31x3) +5).

Обратите внимание, что мультипликативный обратный к s по модулю n обозначается как 1 / k mod n, а 1 / k mod n равен решению уравнения kx = 1 (mod n). Это уравнение решается с помощью алгоритма Евклида следующим образом. Предположим, что s = 3 и n = 5, тогда уравнение выглядит как 3x = 1 (mod 5) или, согласно алгоритму Евклида, как 3x = b (mod 5). Это распространяется на линейное диофантово уравнение ax - by = c, или sx - ny = b, или 3x - 5y = 1, где x = 2 и y = 1 (6–5 = 1), поэтому s-1 будет 2.

5. Вычислить s = (1 / k mod n) × (z + r × Keypriv) mod n. Если s = 0, вернитесь к шагу 1;

6. Вычисленная пара (r, s) будет подписью транзакции.

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

  1. Убедитесь, что компоненты подписи, числа r и s, находятся в диапазоне от 1 до n-1;
  2. Вычислить z = хэш (транзакция) по модулю n
  3. Вычислить w = 1 / s mod n.
  4. Вычислить u = z × w mod n;
  5. Вычислить v = r × w mod n;
  6. Вычислить точку (x, y) = (u × G) + (v × Keypub);
  7. Подтвердите, что r = x mod n. Проверенная подпись будет недействительной, если r ≠ x mod n.

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