0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как создать адрес биткоин-кошелька с помощью закрытого ключа

Как создать адрес биткоин-кошелька с помощью закрытого ключа

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

В предыдущей статье мы рассматривали различные методы генерации закрытого ключа. Какой бы метод вы ни выбрали, в конце вы получите 32 байта данных. Вот ключ, который мы получили в конце той статьи:

60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2
В этой статье мы будем использовать этот закрытый ключ для получения как открытого ключа, так и адреса для биткоин-кошелька.

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

Криптография с использованием эллиптической кривой

Первое, что нам нужно сделать, это применить алгоритм цифровой подписи ECDSA или Elliptic Curve к нашему закрытому ключу. Эллиптической кривой является кривая, определенная уравнением y² = x³ + ax + b с выбранной a и b. Существует целое семейство таких кривых, которые широко известны и широко используются. Для биткоина используется кривая secp256k1/. Если вы хотите узнать больше о криптографии на основе эллиптических кривых, почитайте эту статью.

Применяя ECDSA к закрытому ключу, мы получаем 64-байтовое целое число. Оно состоит из двух 32-байтовых целых чисел, которые представляют соединенные вместе точки X и Y эллиптической кривой.

Для нашего примера мы получили:

На языке Python это будет выглядеть так:

Примечание: как видно из кода, прежде чем я использовал метод на базе модуля ECDSA, я расшифровал закрытый ключ, используя кодеки. Это больше относится к Python и меньше к самому алгоритму, но я объясню, что мы здесь делаем во избежание возможной путаницы.

В Python есть как минимум два класса, которые могут хранить закрытый и открытый ключи: “str” и “bytes”. Первый – это строка, а второй – массив байтов. Криптографические методы в Python работают с классом “bytes”, принимая его в качестве входных данных и возвращая как результат.

Теперь, есть маленькая загвоздка: строка, скажем, 4f3c не равна массиву байтов 4f3c, она равна массиву байтов с двумя элементами, O 031e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7

Этот ключ содержит ту же информацию, но он почти в два раза короче, чем несжатый ключ. Клево!

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

Шифрование открытого ключа

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

Здесь нам нужно применить SHA-256 к открытому ключу, а затем применить RIPEMD-160 к результату. Порядок очень важен.

SHA-256 и RIPEMD-160 являются двумя хэш-функциями, и опять же, мы не будем вдаваться в детали того, как они работают.

Важно то, что теперь у нас есть 160-битное целое число, которое будет использоваться для дальнейших модификаций. Назовем это зашифрованным открытым ключом. Для нашего примера, зашифрованный открытый ключ – это 453233600a96384bb8d73d400984117ac84d7e8b

Зашифрованный открытый ключ = RIPEMD-160 (SHA-256 (Открытый ключ))

Вот как мы шифруем открытый ключ в Python:

Добавление сетевого байта

Биткоин имеет две сети, основную и тестовую. Основной сетью является сеть, которую все люди используют для перевода монет. Тестовая сеть была создана, как вы уже догадались, для тестирования новых функций и программного обеспечения.
Мы хотим создать адрес для использования его в основной сети, поэтому нам нужно добавить 0x00 к зашифрованному открытому ключу. Результат 00453233600a96384bb8d73d400984117ac84d7e8b . Для тестовой сети это будет 0x6f .

Контрольная сумма

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

Чтобы вычислить контрольную сумму ключа, нам нужно применить SHA-256 дважды, а затем взять первые 4 байта результата. В нашем примере двойной SHA-256 — это 512f43c48517a75e58a7ec4c554ecd1a8f9603c891b46325006abf39c5c6b995 , и поэтому контрольная сумма 512f43c4 (обратите внимание, что 4 байта составляют 8 шестнадцатеричных цифр).


С = SHA-256 (SHA-256 (зашифрованный открытый ключ основной сети))
Контрольная сумма = первые 4 байта С

Для расчета контрольной суммы адреса используется следующий код:

Получение адреса

Наконец, чтобы получить адрес, мы просто объединяем ключ основной сети и контрольную сумму. В нашем случае это выглядит так: 00453233600a96384bb8d73d400984117ac84d7e8b512f43c4

Вот и все! Это адрес кошелька для закрытого ключа, приведенного в начале статьи.

Но вы можете заметить, что что-то не так. Вы, вероятно, уже встречали биткоин-адреса, и они не выглядели так. Ну, причина в том, что они кодируются с помощью Base58 (вариант кодирования цифрового кода в виде буквенно-цифрового текста на основе латинского алфавита. Алфавит кодирования содержит 58 символов). Это немного странно.

Вот алгоритм для преобразования шестнадцатеричного адреса в адрес Base58:

Мы получаем 17JsmEygbbEUEpvt4PFtYaTeSqfb9ki1F1 , сжатый адрес биткоин-кошелька.

Шестнадцатеричный адрес = зашифрованный открытый ключ основной сети + адрес контрольной суммы = Base58 (Шестнадцатеричный адрес)

Вывод

Процесс генерации ключей кошелька можно разделить на четыре этапа:

  • создание открытого ключа с помощью ECDSA
  • шифрование ключа с помощью SHA-256 и RIPEMD-160
  • расчет контрольной суммы с помощью двойной SHA-256
  • кодирование ключа с помощью Base58.

В зависимости от формы открытого ключа (полный или сжатый), мы получаем разные адреса, но оба совершенно допустимы.

Вот полный алгоритм для несжатого открытого ключа:

Эллиптический открытый ключ = ECDSA (закрытый ключ)
Открытый ключ = 0х04 + эллиптический открытый ключ
Зашифрованный открытый ключ = RIPEMD-160 (SHA-256 (открытый ключ))
Зашифрованный открытый ключ основной сети = 0х00 + Зашифрованный открытый ключ
С = SHA-256 (SHA-256 (Зашифрованный открытый ключ основной сети))
Контрольная сумма = первые 4 байта С
Шестнадцатеричный адрес = Зашифрованный открытый ключ основной сети + Контрольная сумма
Адрес = Base58 (Шестнадцатеричный адрес)

Если вы хотите «поиграть» с кодом, я опубликовал его на GitHub.

Я делаю обзор о криптовалютах на Medium. Первая часть – подробное описание блокчейна.

Какие ключи бывают у кошелька?

Рассмотрим кошелек в криптовалюте Bitcoin, у него есть:

Приватный ключ: генерируется случайным образом. Это 256-битное число. Обычно его записывают в шестнадцатеричном формате, например:

Публичный ключ: генерируется из приватного ключа (решается криптографическое эллиптическое уравнение). Это 512-битное число. Обычно его записывают в шестнадцатеричном формате, например:

Адрес: генерируется из публичного ключа с использованием функций хеширования. Состоит из 27-34 латинских букв или цифр (да-да, он может быть разной длины), например:

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

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

Важно 1! Никогда и никому не показывайте свой приватный ключ. Завладев приватным ключом вашего кошелька, злоумышленник может перевести все ваши Биткоины куда-угодно (украсть).

Важно 2! Но совершенно не очевидно. Вы можете сгенерировать приватный ключ самостоятельно. Для этого надо взять монетку и подбросить ее 256 раз, записать нули и единички вместо орла и решки, преобразовать в шестнадцатеричное число и вуаля!

Важно 3! Неужели никто не может сгенерировать точно такой же приватный ключ, как и я? Может, но вероятность этого чудовищно мала. Такие вот они, БОЛЬШИЕ числа. Не верите? Читайте здесь и здесь. Единственный вариант получения одинаковых кошельков — глюк генератора случайных чисел (когда он выдает неслучайные числа). Давайте посмотрим на сайт https://www.bitaddress.org/ — он генерирует приватный ключ и адрес. Кнопка «Generate new address» делает новую пару. Парадокс в том, что этот адрес, что вы видите сейчас, никто никогда не видел до вас! Вы можете сгенерировать хоть сотню новых адресов, но их никто никогда раньше не встречал! Можете забить в гугл и проверить, кстати.

Кошелек

Что же такое сам кошелек? Кошелек — файл, в котором хранится приватный и публичный ключи. Таких пар у одного кошелька может быть много, также как и адресов.

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

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

Пополняем бумажный кошелек

2-ой шаг. Отсылаем биткоины на бумажный кошелек со своего телефона. Конечно, перечислить деньги на бумажный кошелек можно с биржи или локального клиента. Но мы рекомендуем вам заранее обзавестись мобильным приложением, на котором есть опция Sweep Paper Wallet.

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

Итак, вы создали пустой бумажный кошелек и готовы перечислить в него свои деньги. Что дальше?

  1. Открываем мобильное приложение, в нашем случае, Copay, и камерой телефона сканируем QR-код публичного адреса на бумажном кошельке
  2. Мобильное приложение трансформирует QR-код в строку публичного адреса, на который мы собираемся переслать деньги
  3. А вот тут аккуратно! Убедитесь, что строка на бумаге совпадает со строкой инпута на вашем телефоне. Невниманием пользователей элегантно пользуются мошенники, которые отсылают наши биткоины на свои адреса
  4. Выбираем сумму, которую хотим отправить, и нажимаем «Send»
  5. Вуаля, наши биткоины в бумажном домике.

Давайте-ка убедимся, что с ними все в порядке. Идем на сайт https://blockchain.info и вводим публичный адрес бумажного кошелька. https://blockchain.info покажет, сколько на нашем счету биткоинов, если они уже пришли (это может занять некоторое время).

Типы криптокошельков

Существуют две основные группы кошельков – горячие и холодные. Чтобы выбрать наиболее подходящее хранилище для цифровых активов, следует ориентироваться на несколько основных критериев.

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

Холодные кошельки представляют собой криптовалютные счета, не требующие постоянного подключения к интернету. Они лучше всего подходят для длительного хранения крупных сумм активов, к которым не нужен сиюминутный доступ. К этому типу относятся аппаратные кошельки, хранящие приватные ключи пользователя. Внешне они напоминают флешку. Несмотря на преимущество в виде повышенной безопасности аппаратные кошельки сильно уступают горячим в удобстве. Для работы с ними требуются два устройства – сам кошелек и компьютер с интернет-доступом. Другим недостатком таких хранилищ является их дороговизна: если горячие кошельки зачастую бесплатны, холодные могут обойтись от $50 до $200.

Наиболее “классический” вариант — именно с декстопных кошельков все и началось. Рассматривать “полный клиент” Bitcoin Core с синхронизацией и загрузкой сотен гигабайт блокчейна биткоина мы не будем. В конце концов, мы хотим просто завести кошелек для BTC, так что функционал Bitcoin Core будет излишним. Куда разумнее использовать другой популярный кошелек — Electrum.

  • Для установки заходим на сайт Electrum и скачиваем нужный дистрибутив. В нашем случае — установочный файл для Windows.
  • Устанавливается кошелек также, как и любая другая программа. Все интересное начинается при первом запуске программы:
  • Здесь даем кошельку название и нажимаем “Next”, так как нам нужно создать кошелек. После этого программа предложит нам 4 варианта создания кошелька.
  • Стандартный — оптимальный вариант для первого кошелька.
  1. Wallet with two-factor authenticacion — был бы хорош, если бы не обязательное использование сервиса TrustedCoin, который не дает менять номер, к которому привязан кошелек, а также взимает дополнительную комиссию с каждой транзакции.
  2. Multi-signature wallet — кошелек с мультиподписями актуален в первую очередь в ситуации, когда на кошельке находятся коллективные деньги (например, средства фирмы).
  3. “Watch Bitcoin addresses” не позволяет полноценно управлять монетами, так что для нас не интересен.
  4. На следующем экране выбираем “Create a new seed”:
  5. Записываем показанную нам фразу из 12 слов. Копирование не работает, так что берем бумажку и записываем “вручную”. Как обычно — мнемоническая фраза показывается только один раз и не восстанавливается при утрате. На следующем экране нас попросят ввести seed-фразу, чтобы убедиться в ее корректной записи. Опять-таки, делать это нужно вручную — функция “Вставить” не работает.

После этого остается только придумать пароль, которым будет защищен и зашифрован файл кошелька на компьютере. Минимальное требование — 13 символов. Этот пароль можно и потерять (но не нужно) — вы сможете восстановить доступ к кошельку с помощью мнемонической фразы. После подтверждения пароля в следующем окне кошелек закроется. Запускаем его снова, заходим в свой аккаунт с помощью названия кошелька и пароля и пользуемся.

Ссылка на основную публикацию
Статьи c упоминанием слов:
Adblock
detector