Ключи, адреса

Ключи, адреса


Часть 1: Ключи, адреса

Часть 2: Публичный адрес

Часть 3: Кошельки


Часть 1

Введение

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

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

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

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


Криптография с открытым ключом и криптовалюта

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

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

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

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

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


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

Приватные и публичные ключи

Биткоин-кошелек содержит коллекцию из пар ключей, каждая из которых состоит из приватного и публичного ключа. Приватный ключ (k) представляет собой число, как правило, взятое наугад. Используя приватный ключ, при помощи односторонней функции умножения эллиптических кривых, мы получаем публичный ключ (K). Из публичного ключа (K), используя одностороннюю функцию криптографического хэша мы получаем Биткоин-адреса (A). В этом разделе мы начнем с создания приватного ключа, взглянем на математику эллиптической кривой, которая используется для превращения его в публичный ключ и, наконец, создадим Биткоин-адрес из публичного ключа.


Приватный ключ, публичный ключ, и Биткоин-адрес

Приватные ключи

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


Приватный ключ — это просто число. Можете взять случайный приватный ключ, используя только монету, карандаш и бумага: бросить монету 256 раз, и у вас есть двоичное число случайного приватного ключа, который можно использовать в Биткоин-кошельке. Публичный ключ может быть сгенерирован из приватного ключа.

Создание приватного ключа из случайного числа

Первый и самый важный шаг при генерации ключей — это найти надежный источник энтропии, или случайности. Создание ключа Bitcoin, по существу, то же самое, что "взять число между 1 и 2256." Точный способ выбора числа не имеет значения до тех пор, пока не предсказуем или повторим. Программное обеспечение Биткоин использует генераторы случайных чисел операционной системы. Как правило, генератор случайных чисел ОС инициализируется источником случайности пользователя, поэтому вам может быть предложено случайно пошевелить мышью в течение нескольких секунд. Для настоящих параноиков, ничто не сравнится с костями, карандашом, и бумагой.

Более точно, приватный ключ может быть любым числом между 1 и n - 1, где n константа (n = 1.158 * 1077, немного меньше, чем 2256) определяется как порядок эллиптической кривой используемой в Bitcoin (см. [elliptic_curve]). Чтобы создать подобный ключ, мы случайно выбираем 256-битное число, и убеждаемся, что оно меньше, чем n - 1. В терминах программирования, это обычно достигается путем подачи большой строки случайных битов, взятых из криптографически стойкого источника случайности, на вход хэш-алгоритма SHA256, который выдаст удобное 256-битное число. Если результат меньше, чем n - 1, мы получаем подходящий приватный ключ. В противном случае, мы просто пробуем еще раз с другим случайным числом.


Не пишите свой собственный генератор случайных чисел и не используйте генератор по умолчанию, предоставляемый вашим языком программирования. Используйте криптографически стойкий генератор псевдослучайных чисел (ГПСЧ) с зерном из источника достаточной энтропии. Изучите документацию выбранной вами библиотеки генератора случайных чисел и убедитесь, что она криптографически безопасна. Правильное имплементация и употребление ГСПЧ имеет критическое значение для безопасности ключей.

Ниже приведен случайным образом сгенерированный секретный ключ (k) в шестнадцатеричном формате (256 двоичных цифр в виде 64 шестнадцатеричных цифр, каждая по 4 бита):

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD




Размер пространства возможных приватных ключей Биткоин, 2256 — это неизмеримо большое количество. Это примерно 1077 в десятичной. Видимая Вселенная, по оценкам, имеет 1080 атомов.

Для генерации нового ключа клиентом Bitcoin Core (см. [ch03_bitcoin_client]), используйте команду getnewaddress. По соображениям безопасности она отображает только публичный ключ, но не приватный. Для того, чтобы заставить bitcoind показать приватный ключ, используйте команду dumpprivkey. Команда dumpprivkey показывает приватный ключ в формате Base58 с контрольной суммой, который называется Wallet Import Format (WIF). Вот пример генерирования и отображения приватного ключа, используя две вышеназванные команды:

$ bitcoind getnewaddress
1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
$ bitcoind dumpprivkey 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ



Команда dumpprivkey открывает файл кошелька и извлекает приватный ключ, который был создан при помощи команды getnewaddress. Bitcoind не может узнать приватный ключ из публичного, иначе если они оба не хранятся в кошельке.


Команда dumpprivkey не генерирует приватный ключ из открытого ключа, поскольку это невозможно. Команда просто показывает приватный ключ, который уже известен кошельку и который был создан с помощью команды getnewaddress.

Также можно использовать утилиту командной строки Bitcoin Explorer (см [libbitcoin]) для генерации и просмотра приватных ключей при помощи команд seed, ec-new и ec-to-wif:

$ bx seed | bx ec-new | bx ec-to-wif
5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn



Публичные ключи

Публичный ключ вычисляется из приватного ключа с помощью необратимого умножения на эллиптических кривых: \(K = k * G\), где k — это приватный ключ, G — константная точка, называемая генераторной точкой, а K — результирующий публичный ключ. Обратная операция, известная как "нахождение дискретного логарифма", вычисление k при известном возможна только при помощи полного перебора k, т.е. лобовой атаки. Прежде, чем мы продемонстрируем, как создать публичный ключ из приватного, давайте взглянем на криптографию на эллиптических кривых немного более подробно.

Криптография эллиптических кривых

Криптография на эллиптических кривых — это вид асимметричной криптографии или криптографии с открытым ключом, основанной на проблеме дискретного логарифмирования на эллиптических кривых.

Изображен пример эллиптической кривой, аналогичной той, что используется в Биткоин.


Эллиптическая кривая


В Биткоин используется определенная эллиптическая кривая и набор математических констант из стандарта под названием secp256k1 установленного Национальным Институтом Стандартов и Технологий (NIST). Кривая secp256k1 определяется следующей функцией эллиптической кривой:

\begin{equation} {y^2 = (x^3 + 7)}~\text{over}~(\mathbb{F}_p) \end{equation}

или

\begin{equation} {y^2 \mod p = (x^3 + 7) \mod p} \end{equation}

mod p (модуль простого числа р) показывает, что эта кривая над конечным полем простого порядка p, также может быть записана как \(\mathbb{F}_p\), где p = 2256 – 232 – 29 – 28 – 27 – 26 – 24 – 1 — это очень большое простое число.

Так как эта кривая определена над конечным полем простого порядка, а не вещественных чисел, она выглядит как узор из точек, рассеянных в двух измерениях, что трудно визуализировать. Тем не менее, математика идентична математике эллиптической кривой в вещественных числах. В качестве примера, на изображена та же эллиптическая кривая над гораздо меньшего конечного поля простого порядка 17, показывающий структуру точек на координатной сетке. Эллиптическая кривая Биткоин, secp256k1 может рассматриваться как гораздо более сложная картина точек на неизмеримо большой координатной сетке.


Криптография эллиптических кривых: визуализация эллиптической кривой над F(р), при р=17

Так, например, точка Р с координатами (x,y), что является точкой на кривой secp256k1. Это можно проверить самостоятельно, используя Python:

P = (55066263022277343669578718895168534326250603453777594175500187360389116729240, 32670510020758816978083085130507043184471273380659243275938904335757337482424)



В математике эллиптических кривых существует точка, называемая "точкой на бесконечности", что примерно соответствует роли 0 в сложении. На компьютерах, это иногда представлена как ​​х = у = 0 (что не удовлетворяет уравнению эллиптической кривой, но это простой отдельный случай, который может быть установлен).

Есть также оператор "сложения", имеющий некоторые свойства аналогичные традиционному сложению действительных чисел, знакомому еще со школы. Имея две точки Р1 и Р2 на эллиптической кривой, существует и третья точка такая, что Р3 = Р1 + Р2.

Геометрически эта третья точка Р3 может быть найдена путемпрочерчивания линии между Р1 и Р2. Эта линия пересечет эллиптическую кривую ровно в одной дополнительной точке. Назовем эту точку P3' = (x, y). А затем найдем точку P3 с координатами (x, –y).

Есть несколько особых случаев, которые объясняют необходимость "точки в бесконечности."

Если P1 и Р2 одна и та же точка, то прямая, проведенная "между" Р1 и Р2 должна идти по касательной к кривой в этой точке Р1. Эта касательная пересечет кривую ровно в одной новой точке. Вы можете использовать методы из тригонометрии для определения угла наклона касательной. Любопытно, но эти методы работают даже если мы ограничиваемся точками на кривой с целочисленными координатами!

В некоторых случаях (например, если Р1 и Р2 имеют одинаковые значения x-координаты, но разные значения y), касательная пройдет строго вертикально, в этом случае Р3 = "точка в бесконечности".

Если P1 является "точкой на бесконечности", то сумма Р1 + Р2 = Р2. Аналогично, если Р2 является точкой на бесконечности, то Р1 + Р2 = Р1. Это показывает, как точка на бесконечности играет роль 0.

It turns out that + is associative, which means that (A + B) + C = A + (B + C). That means we can write A + B + C without parentheses without any ambiguity.

Теперь, когда мы определили сложение, мы можем определить умножение в смысле, расширяющем сложение. Для точки Р на эллиптической кривой, если k является целым числом, то kP = Р + Р + Р + … + Р (k раз). Обратите внимание, что k иногда сбивающе с толку называется "экспонентой".


Часть 2: Публичный адрес


Источник: http://bitcoinbook-builds.mkvd.net

Report Page