Как создается приватный ключ в кошельках с seed-фразой и без неё
![]()
Обычно криптокошельки при создании генерируют seed-фразу, которую нужно запомнить или записать, чтобы потом иметь возможность восстановить доступ к активам. Но ведь Tangem Wallet работает без нее. Как это происходит и почему мы считаем, что seed-фраза не очень безопасна?
Для начала надо разобраться, что это вообще такое. Если максимально упростить, то получится примерно так: это мнемоническая фраза, в которой закодированы приватный и публичный ключи пользователя. А благодаря вычислительной магии из этого рандомного набора слов всегда будет генерироваться один и тот же набор ключей.
Криптодеревья
Для начала стоит сказать пару слов о самих криптокошельках. Подавляющее их большинство — это иерархические детерминированные кошельки (Hierarchical deterministic wallet, HD).
Криптокошелек представляет собой «дерево» приватных и публичных ключей, благодаря которым вы получаете доступ к своей криптовалюте в разных блокчейнах и можете ей управлять. Вырастает это дерево из энтропии — случайного числа, сгенерированного генератором случайных чисел. Корневая система — это зерно (seed), ствол — пара расширенных ключей (приватный и публичный), а ветви — это огромное множество пар ключей и адресов монет в блокчейнах.
Каждый дочерний ключ может генерировать свои ключи, которые могут генерировать свои ключи и т.д., в результате чего создается определенная система иерархии. Поэтому кошельки и называют иерархическими.
А «детерминированность» (то есть однозначная предопределенность результата) здесь по той причине, что из одной и той же мнемонической фразы всегда будет генерироваться одно и то же дерево ключей одним и тем же способом.
Приватные и публичные ключи в HD криптокошельках с seed-фразой
Мнемоническая фраза (код) — это набор слов, сгенерированный из случайного числа, в свою очередь, сгенерированного генератором случайных чисел. Именно ее, а не сам приватный ключ, в большинстве случаев используют для бэкапа (резервной копии ключа). Мнемоническую фразу обычно называют seed-фразой.
Как это работает
Итак, вы создаете криптокошелек. Что в этот момент происходит и как создается мнемоническая фраза?
1. В первую очередь генератор случайных чисел генерирует энтропию.
Энтропия — это очень большое случайное число, которое никогда никем не генерировалось и больше никогда никем не будет сгенерировано.
2. Сгенерированная энтропия при помощи математических алгоритмов кодируется в цепочку слов из специального словаря. На выходе получается мнемоническая фраза.
3. Мнемоническая фраза преобразовывается в seed (не путайте с seed-фразой!). Seed — это преобразованная версия мнемонической фразы. Для преобразования используется хеш-функция.
Хеш-функция — это математический алгоритм, который сжимает данные любого размера в массив данных фиксированного размера. Входящие данные называются сообщением, а исходящие — хеш-суммой или просто хешем. Одна из главных особенностей хеш-функции состоит в том, что она однонаправленная, это значит, что из её результата (хеша) невозможно восстановить исходные данные. Еще одна важная для понимания деталь: когда входящие данные не меняются, хеш-сумма всегда будет одной и той же.
4. Из seed вычисляется мастер-ключ (extended master key). Это первый ключ, который вы получаете при преобразовании seed-фразы. Преобразование производится также при помощи хеш-функции.
5. Из мастер-ключа вычисляется расширенный приватный ключ (Xprv).
6. Из расширенного приватного ключа генерируется расширенный публичный ключ (Xpub).
Вы получили главную пару ключей, из которых создается огромное множество дочерних связок ключей для разных блокчейнов. Теперь можно пользоваться кошельком: хранить, отправлять, получать, обменивать монеты и токены и т.д.
![]()
Если с вашим криптокошельком что-то случится, для восстановления всей иерархии ключей и, соответственно, полного доступа ко всем монетам и токенам, вам понадобится мнемоническая фраза. Поэтому ее нужно записать где-то на бумажке и хранить в надежном месте.
Что плохого?
Мнемоническая фраза дает возможность без проблем восстановить всю вашу криптовалюту в случае утери, кражи или поломки вашего кошелька и… похитить все ваши криптоактивы, если попадет в руки злоумышленникам.
Задумайтесь на минутку, разработчики криптокошельков создают инновационные устройства, соревнуются в их безопасности, стараются максимально их защитить, как программно, так и физически. Ваши ключи от криптовалюты генерируются путем сложнейших математических алгоритмов, данные при помощи криптографии многократно шифруются для обеспечения максимальной сохранности ваших активов.
А доступ к вашей криптовалюте расписан на бумаге. Дюжина-две слов на ничем не защищенном листочке — мастер-ключ от всех ваших активов в открытом виде. Чтобы скомпрометировать ключ, достаточно сфотографировать, переписать (или просто запомнить) слова, а вы об этом даже не узнаете. А ещё этот листок легко повредить или потерять.
Конечно, можно зашифровать фразу, разделить на части, хранить их в разных местах или арендовать для сид-фразы ячейку в банке. Но многие ли так делают? Особенно новички в мире крипты.
Из всего этого можно сделать объективный и обоснованный вывод: seed-фраза в открытом виде — существенный изъян существующих криптопродуктов, серьезная прореха в безопасности современных криптовалютных кошельков.
Приватные и публичные ключи в криптокошельке Tangem Wallet без seed-фразы: как это работает
Tangem Wallet — это такой же иерархический детерминированный кошелек, как и его аналоги, только без их главной уязвимости — мастер-ключа от всех криптоактивов в открытом незащищенном виде, то есть мнемонической фразы в распоряжении пользователя.
При генерации мастер-ключа, пары расширенных ключей (приватного и публичного) и остальных связок ключей и адресов, используется точно такой же алгоритм, как и в других кошельках, но без этапа создания мнемонической фразы — seed генерируется прямо из энтропии.
Ключ генерируется чипом карты, в нем же и хранится. Получить его не может никто. Ни тот, кто украдет карту, ни компания Tangem, ни даже сам пользователь. А в качестве резервной копии используется не мнемоническая фраза, а другие карты из комплекта Tangem Wallet (одна или две, в зависимости от того, какой вы выбрали). При создании бэкапа между картами посредством смартфона устанавливается зашифрованный канал, по которому ключи передаются с одной карты на другую.
После завершения бэкапа ключей вы получаете две либо три идентичные копии кошелька — равнозначные карты с одинаковыми ключами и парольной защитой. Рекомендуем хранить их не вместе, а в нескольких надежных местах. Что-то случится с одной картой — берите вторую и пользуйтесь. Потеряете вторую — это уже опасно, бэкапа нет, в таком случае покупайте новый комплект Tangem Wallet и переводите свои криптоактивы на него.
Как пользоваться кошельком кошелек без seed-фразы? Все просто:
- когда хотите купить криптовалюту, вы формируете в мобильном приложении необходимую транзакцию, прикладываете карту к смартфону и вводите пароль;
- смартфон через NFC передает данные на чип;
- чип проверяет пароль, подписывает транзакцию приватным ключом и возвращает цифровую подпись приложению;
- приложение отправляет подписанную транзакцию в блокчейн.
А что если…
…Tangem закроется, сервера отключатся, приложение пропадет из Google Play и AppStore. Ответ прост — ничего. Вы сможете без проблем продолжать пользоваться криптокошельком Tangem Wallet. Подробнее читайте об этом в нашей статье «Как будет работать кошелек Tangem без компании Tangem» .
Как мне хранить Биткоин? Заводим кошелек
— Как хранить?
— Нужно завести криптовалютный кошелек!
— Где и как это сделать?
— Давайте разбираться!

Удивительно, что такие важные вопросы очень плохо освещаются в интернете. Даже при поиске, например, «bitcoin wallets comparison» выдаются совершенно идиотские сайты, а-ля 20+ Best Bitcoin Wallets to Store Bitcoins (читай скачать бесплатно, без смс), чаще всего, со странным сравнением кошельков и рекламой какого-то одно из них.
В статье Как купить криптовалюту? мы уже говорили о мультивалютном кошельке Jaxx. Он поддерживает массу монет (BTC, ETH, DASH, ETC, REP, LTC, ZEC, RSK, DGE, ICN, GNT, GNO, DGD, BCAP) и прекрасно подойдет для начала работы с криптой, если вы не собираетесь сразу вкладывать в Биткоины большие деньги.
Какие ключи бывают у кошелька?
Рассмотрим кошелек в криптовалюте Bitcoin, у него есть:
Приватный ключ: генерируется случайным образом. Это 256-битное число. Обычно его записывают в шестнадцатеричном формате, например:
Публичный ключ: генерируется из приватного ключа (решается криптографическое эллиптическое уравнение). Это 512-битное число. Обычно его записывают в шестнадцатеричном формате, например:
Адрес: генерируется из публичного ключа с использованием функций хеширования. Состоит из 27-34 латинских букв или цифр (да-да, он может быть разной длины), например:
Имея приватный ключ вы можете получить публичный ключ и адрес, а вот обратно схема не работает. Зная адрес, публичный ключ не найти, а уж приватный подавно.
Ниже приведена схема генерации адреса из приватного ключа. Если вы хотите вникнуть в процесс генерации подробнее — прочитайте эту статью. Вдобавок к ней есть вот такой сервис, который рассчитает все промежуточные значения и, конечно, сам адрес, исходя из приватного ключа — очень удобно.

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

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

Обычно кошелек защищают паролем, настоятельно рекомендуем вам это сделать.
Бывает холодный, бывает горячий…
Кошельки обычно классифицируют так:
- толстые/тонкие (есть или нет полная копия блокчейна)
- холодные/горячие (есть или нет доступ к интернету)
- бумажные
- аппаратные
- онлайн
- биржа
Рассмотрим подробнее что все это значит, например понятие холодного кошелька сильно разнится в разных источниках. Некоторые считают холодным официальный Bitcoin Core, другие txt-файл на компьютере без доступа к интернету.
Толстый и тонкий
По первоначальной задумке каждый пользователь криптовалюты должен иметь на своем компьютере полную копию блокчейна, это называется узлом сети или нодой (Подробнее). Во времена зарождения Биткоина так и было. Очень удачно написано в Популярной Механике:
Никому не доверяй
База данных в Bitcoin — блокчейн — не имеет централизованного контроля, она открыта любому участнику сети и хранится на их собственных жестких дисках. За неприкосновенность записей в ней не отвечает никто, но она жестко задается самой архитектурой распределенной базы данных. Блокчейн существует в огромном множестве копий, и чтобы изменить какую-то запись, придется скрытно проникнуть если не в каждый, то в большинство компьютеров. Эта задача практически невыполнима даже для самого алчного и технически грамотного преступника. Блокчейн — распределенная база данных, и число ее копий в Blockchain сейчас достигло многих тысяч.
Толстым клиентом называется кошелек, у которого есть полная нода. Такой кошелек может сам проверить транзакцию, определить что у Маши, действительно, есть 1 BTC на счету, отследив полный путь Биткоинов до машиного адреса. Основной толстый клиент для Биткоин — Bitcoin Core, хотя есть и другие: Bitcoin Knots, BTCD, Libbitcoin.

Тонкие клиенты (их еще называет легкими) не хранят блокчейн. Они обращаются на свои серверы. Так, например, у кошелька Electrum, который существует с 2011 года, специальные сервера, которые индексируют весь блокчейн по адресам. Клиент связывается с 10 разными, случайно выбранными серверами, соединение защищено c помощью SSL.

Jaxx, о котором мы говорили, тоже тонкий клиент.
Считается, что толстые клиенты с полной копией блокчейна надежнее!
Основной их минус — размер загружаемых данных. Сейчас для Bitcoin это уже 148 ГБ. Неслабо. Альтернатива — доверять серверам легких кошельков.
Онлайн-кошелек
Онлайн-кошелек хранит у себя ваш приватный ключ. Вы заходите в онлайн кошелек с помощью логина/пароля + двухфакторной аутентификации. Кошельки заявляют, что все защищено, зашифровано и т.п., но так ли это? На наш взгляд, довольно опасный вариант. Вы доверяете интернет-сервису свой приватный ключ. А если сервис ломанут?
Один из самых известных онлайн-кошельков — BitGo. Да, его рекомендуют многие пользователи. Да, он даже находится в списке кошельков на сайте bitcoin.org:

Но, все равно, как-то страшновато хранить там большие суммы.
Холодный или горячий
Все вышеперечисленные кошельки — горячие. Т.е. они имеют доступ к интернету, чисто теоретически, ваш приватный ключ кто-то может украсть, например, если вы будете ходить на всякие нехорошие сайты и кликать по нехорошим ссылкам.
Холодный кошелек установлен на компьютере без доступа к интернету. Можно ли так работать? Да, вполне. Вы можете на оффлайн компьютере подписать транзакцию о переводе Маше 1 BTC, скопировать текст транзакции на флешку, перенести на компьютер с доступом к интернету и отправить транзакцию в сеть. Звучит сложно (на самом деле это делается просто), но безопасность стоит того. Инструкция на английском как создать кошелек Electrum на двух компьютерах, один — оффлайн с приватным ключом, другой — онлайн, без приватного ключа.
Бумажный
Можно зайти на сайт https://www.bitaddress.org/ или другой сервис для генерации ключей. Создать ключи. Записать приватный ключ и Биткоин адрес в txt-файл. Сохранить на 3 флешки. Зашифровать. Одну флешку закопать в огороде, другую положить в карман, третью положить в банковскую ячейку…
Боитесь, что bitadress может запомнить ваш приватный ключ? Вполне может быть и такое. Тогда можно, опять же, пойти на оффлайн компьютер, поставить там Electrum и сгенерировать ключи.
Что делать если вы совсем параноик? Можно подбросить монетку 256 раз, установить на оффлайн компьютер все необходимые программы для вычисления хешей. Сгенерировать адрес. Дальше флешка, огород и т.д.
Не доверяете флешкам? Распечатайте ключи на бумаге, но эту бумагу надо как-то сохранить, и кто ее подсмотрит — получит доступ ко всему. Опасно.
Биржа

На криптовалютных биржах можно создать кошелек, практически для любой криптовалюты, за одну секунду. У вас не будет доступа к ключам, да вообще ни к чему не будет. Только адрес. Для чего можно использовать? Только для того, чтобы его пополнить, обменять Биткоины на другую криптовалюту и вывести ее.
Настоятельно не рекомендуем хранить какие-либо средства на бирже!
Как сказал Andreas Antonopoulos: «Как я могу доверить свои деньги стартапу из шести человек, который существует 3 месяца?» Кстати, классный дядька, у него много видео с ликбезом по Биткоину: https://www.youtube.com/user/aantonop/featured
Аппаратный кошелек

Аппаратный кошелек — это «флешка», которая играет роль оффлайн-компьютера с вашим приватным ключом. Такие кошельки можно использовать не только для Биткоина, но и для некоторых других популярных криптовалют. По сути — это идеальный вариант хранения ключей. Даже если вы подключите аппаратный кошелек к компьютеру, благодаря продуманной защите, никто не сможет украсть ваш приватный ключ. Кошелек защищен пин-кодом, если злоумышленник его украдет, он ничего не сможет сделать. Считается, что такие кошельки самые безопасные, но есть одно НО:
У аппаратного кошелька существует механизм восстановления на тот случай, если кошелек сломается или потеряется. Для восстановления генерируется специальный набор слов (seed), например:
constant forest adore false green weave stop guy fur freeze giggle clock sympathy interesno kto eto chitaet swing bless napishite nam vchat pleasure possess
В комплекте с кошельком даже идет специальная книжечка, чтобы записать фразу для восстановления:

Так вот, любой, кто стырит у вас этот набор слов, может получить все ваши средства. А если потерять их и сломать кошелек — прощай биточки. Такая вот фигня. Можно татуху набить, конечно, но и ее могут посмотреть…
Основные 3 конкурирующих продукта на рынке: Trezor — 90$, Ledger Nano S — 80$ и KeepKey -130$.
АААА, столько информации, что мне делать то?
Предположим, вы решили «жить в крипте».
1. Ваши сбережения (на машину, квартиру, черный день) стоит хранить на максимально защищенном кошельке: аппаратный кошелек, оффлайн-компьютер, зашифрованная флешка. Ссылок не будет, вам надо самим прочитать статью целиком и внимательно разобраться как это сделать.
2. Средства для переводов друзьям/родственникам/сотрудникам, оплаты личных счетов, счетов фирмы, получения средств за товары/услуги и т.п. мы рекомендуем хранить на локальном кошельке. Есть нормальный интернет и 150GB свободного места — Bitcoin Core. Нет — ставьте легкий, зарекомендовавший себя, Electrum. При установке обязательно проверьте контрольную сумму установочного файла (Что это?).
Bitcoin in a nutshell — Cryptography
Одна из причин, почему Bitcoin продолжает привлекать столько внимания — это его исключительная «математичность». Сатоши Накамото удалось создать систему, которая способна функционировать при полном отсутствии доверия между ее участниками. Все взаимодействия основаны на строгой математике, никакого человеческого фактора — вот в чем была революционность идеи, а не в одноранговой сети, как многие думают. Поэтому первую главу я решил посвятить именно математическим основам Bitcoin.
Ниже я постараюсь объяснить вам самые базовые вещи — эллиптические кривые, ECC, приватные / публичные ключи и так далее. По возможности я буду иллюстрировать свои слова примерами кода, преимущественно на Python 2.7, если что-то непонятно — спрашивайте в комментариях.
- Bitcoin in a nutshell — Cryptography
Table of content
- Introduction
- Elliptic curve
- Digital signature
- Private key
- Public key
- Formats & address
- Sign
- Verify
- Formats
- Links
Introduction
Как я уже сказал выше, криптография — это фундаментальная часть Bitcoin. Без нее вообще бы ничего не заработало, поэтому начинать нужно именно отсюда.
В Bitcoin используется так называемая криптография на эллиптических кривых (Elliptic curve cryptography, ECC). Она основана на некоторой особой функции — эллиптической кривой (не путать с эллипсом). Что это за функция и чем она так примечательна я расскажу дальше.
Elliptic curve
Если на пальцах, то эллиптическая кривая — это внешне довольно простая функция, как правило, записываемая в виде так называемой формы Вейерштрасса:
В зависимости от значений параметров и , график данной функции может выглядеть по разному:

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

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

Несложно увидеть, что в этом случае отсутствует третье пересечение с кривой , которое мы называли . Для того, чтобы избежать этого казуса, введем так называемую точку в бесконечности (point of infinity), обозначаемую обычно или просто , как на картинке. И будем говорить, что в случае отсутствия пересечения .
Особый интерес для нас представляет случай, когда мы хотим сложить точку саму с собой (2 кадр, точка ). В этом случае просто проведем касательную к точке и отразим полученную точку пересечения относительно .
Теперь, легким движением руки, можно ввести операцию умножения точки на какое-то число. В результате получим новую точку , то есть раз. С картинкой все должно стать вообще понятно:

Elliptic curve over a finite field
В ECC используется точно такая же кривая, только рассматриваемая над некоторым конечным полем — простое число. То есть
Все названные свойства (сложение, умножение, точка в бесконечности) для такой функции остаются в силе, хотя, если попробовать нарисовать данную функцию, то напоминать привычную эллиптическую кривую она будет лишь отдаленно (в лучшем случае). А понятие «касательной к функции в точке» вообще теряет всякий смысл, но это ничего страшного. Вот пример функции для :

А вот для , тут вообще почти хаотичный набор точек. Единственное, что все еще напоминает о происхождении этого графика, так это симметрия относительно оси .

P. S. Если вам интересно, как в случае с кривой над конечным полем вычислить координаты точки , зная координаты и — можете полистать «An Introduction to Bitcoin, Elliptic Curves and the Mathematics of ECDSA» by N. Mistry, там все подробно расписано, достаточно знать математику на уровне 8 класса.
P.P.S. На случай, если мои примеры не удовлетворили ваш пытливый ум, вот сайт для рисования кривых всех сортов, поэкспериментируйте.
SECP256k1
Возвращаясь к Bitcoin, в нем используется кривая SECP256k1. Она имеет вид и рассматривается над полем , где — очень большое простое число, а именно .
Так же для SECP256k1 определена так называемая base point, она же generator point — это просто точка, как правило, обозначаемая , лежащая на данной кривой. Она нужна для создания публичного ключа, о котором будет рассказано ниже.
Простой пример: используя Python, проверим, принадлежит ли точка кривой SECP256k1
Digital signature
Общая идея такая: Алиса хочет перевести 1 BTC Бобу. Для этого она создает сообщение типа:
Потом Алиса берет свой приватный ключ (пока что можете считать, что это число, известное только Алисе), хэш сообщения и функцию вида . На выходе она получает подпись своего сообщения — в случае ECDSA это будет пара целых чисел, для других алгоритмов подпись может выглядеть по другому. После этого она рассылает всем участникам сети исходное сообщение, подпись и свой публичный ключ.
В результате, каждый Вася при желании сможет взять эту троицу, функцию вида и проверить, действительно ли владелец приватного ключа подписывал это сообщение или нет. А если внутри сети все знают, что принадлежит Алисе, то можно понять, отправила эти деньги она или же кто-то пытается сделать это от ее имени.

Более того, предположим, что нашелся человек, вставший между Алисой и остальной сетью. Пусть он перехватил сообщение Алисы и что-то в нем изменил, буквально 1 бит из миллиарда. Но даже в этом случае проверка подписи на валидность покажет, что сообщение было изменено.
Это очень важная фича для Bitcoin, потому как сеть распределенная. Мы не можем заранее знать, к кому попадет наша транзакция с требованием перевести 1000 BTC. Но изменить ее (например указать свой адрес с качестве получателя) он не сможет, потому как транзакция подписана вашим приватным ключом, и остальные участники сети сразу поймут, что здесь что-то не так.
AHTUNG! В действительности процесс довольно сильно отличается от вышеописанного. Здесь я просто на пальцах показал, что из себя представляет электронно-цифровая подпись и зачем она нужна. Реальный алгоритм описан в главе «Bitcoin in a nutshell — Transactions».
Private key
Приватный ключ — это довольно общий термин и в различных алгоритмах электронной подписи могут использоваться различные типы приватных ключей.
Как вы уже могли заметить, в Bitcoin используется алгоритм ECDSA — в его случае приватный ключ — это некоторое натуральное 256 битное число, то есть самое обычное целое число от до . Технически, даже число 123456 будет являться корректным приватным ключом, но очень скоро вы узнаете, что ваши монеты «принадлежат» вам ровно до того момента, как у злоумышленника окажется ваш приватный ключ, а значения типа 123456 очень легко перебираются.
Важно отметить, на сегодняшний день перебрать все ключи невозможно в силу того, что — это фантастически большое число.
Постараемся его представить: согласно этой статье, на всей Земле немногим меньше песчинок. Воспользуемся тем, что , то есть песчинок. А всего адресов у нас , примерно .
Значит, мы можем взять весь песок на Земле, превратить каждую песчинку в новую Землю, в получившейся куче планет каждую песчинку на каждой планете снова превратить в новую Землю, и суммарное число песчинок все равно будет на порядки меньше числа возможных приватных ключей.
По этой же причине большинство Bitcoin клиентов при создании приватного ключа просто берут 256 случайных бит — вероятность коллизии крайне мала.
Python
Python, ECDSA
Bitcoin-cli
Public key
Пусть — наш приватный ключ, — base point, тогда публичный ключ . То есть, фактически, публичный ключ — это некоторая точка, лежащая на кривой SECP256k1.
Два важных нюанса. Во-первых, несложно видеть, что операция получения публичного ключа определена однозначно, то есть конкретному приватному ключу всегда соответствует один единственный публичный ключ. Во-вторых, обратная операция является вычислительно трудной и, в общем случае, получить приватный ключ из публичного можно только полным перебором первого.
Ниже вы узнаете, что точно такая же связь существует между публичным ключом и адресом, только там все дело в необратимости хэш-функций.

Python, ECDSA
C++, libbitcoin
Для компиляции и запуска используем (предварительно установив libbitcoin):
Вы можете видеть, что форматы публичных ключей в первом и втором примере отличаются (как минимум длиной), об этом я подробнее расскажу ниже.
Formats & address
Base58Check encoding
Эта кодировка будет встречаться нам постоянно на протяжении всей книги, поэтому стоит понимать, как она работает и зачем она вообще нужна.
Ее суть в том, чтобы максимально кратко записать последовательность байт в удобочитаемом формате и при этом сделать вероятность возможных опечаток еще меньше. Я думаю вы сами понимаете, что в случае Bitcoin безопасность лишней не бывает. Один неправильный символ и деньги уйдут на адрес, ключей к которому скорее всего никто никогда не найдет. Вот комментарий к этой кодировке из в base58.h:
Краткость записи проще всего реализовать, используя довольно распространенную кодировку Base64, то есть используя систему счисления с основанием 64, где для записи используются цифры 0,1. 9 , буквы a-z и A-Z — это дает 62 символа, оставшиеся два могут быть чем угодно, в зависимости от реализации.
Первое отличие Base58Check в том, что убраны символы 0,O,l,I на случай, если кто-нибудь решит их перепутать. Получается 58 символов, можете проверить
Второе отличие — это тот самый check. В конец строки снова добавляется checksum — первые 4 байта SHA256(SHA256(str)) . Ну и еще нужно добавить в начало столько единиц, сколько ведущих нулей было до кодировки в base58, это уже дело техники.

Private key formats
Самый очевидный способ хранить приватный ключ — это записать 256 бит в виде кучи нулей и единиц. Но, наверное, любой технически грамотный человек понимает, что будет сильно проще представить ту же самую последовательность в виде 32 байт, где каждому байту соответствует два символа в шестнадцатиричной записи. Напомню, что в этом случае используются цифры 0,1. 9 и буквы A,B,C,D,E,F . Этот формат я использовал в примерах выше, для красоты его еще иногда разделяют пробелами.
- Берем приватный ключ, например 0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D
- Записываем его в Base58Check с префиксом 0x80 . Все.
Public key formats
На всякий случай напомню, что публичный ключ — это просто точка на прямой SECP256k1. Первый и самый распространенный вариант его записи — uncompressed формат, по 32 байта для X и Y координат. Чтобы не возникало путаницы, используется префикс 0x04 и того 65 байт.
Однако, как можно догадаться из названия, это не самый оптимальный способ хранить публичный ключ.
Вы удивитесь, но второй формат называется compressed. Суть его в следующем: публичный ключ — это точка на кривой, то есть пара чисел удовлетворяющая уравнению . А значит можно записать только Х координату и если нам понадобится Y координата — просто решаем уравнение. Тем самым мы уменьшаем размер публичного ключа почти на 50%!
Единственный нюанс — если точка лежит на кривой, то для ее Х координаты очевидно существует два решения такого уравнения (посмотрите на графики выше, если сомневаетесь). Обычно мы бы просто сохранили знак для Y координаты, но когда речь идет о функции над конечным полем, то нужно воспользоваться следующим свойством: если для Х координаты существуют решения уравнения, то одна из точек будет иметь четную Y координату, а вторая — нечетную (опять же, можете сами в этом убедиться).
В первом случае используется префикс 0x02 , во втором — 0x03 . Вот иллюстрация процесса:

Address
- Возьмем приватный ключ, например 45b0c38fa54766354cf3409d38b873255dfa9ed3407a542ba48eb9cab9dfca67
- Получим из него публичный ключ в uncompressed формате, в данном случае это 04162ebcd38c90b56fbdb4b0390695afb471c944a6003cb334bbf030a89c42b584f089012beb4842483692bdff9fcab8676fed42c47bffb081001209079bbcb8db .
- Считаем RIPEMD160(SHA256(public_key)) , получается 5879DB1D96FC29B2A6BDC593E67EDD2C5876F64C
- Переводим результат в Base58Check с префиксом 0x00 — 17JdJpDyu3tB5GD3jwZP784W5KbRdfb84X . Это и есть адрес.
Sign & verify
Не думаю, что вам нужно обязательно знать технические подробности того, как именно ECDSA подписывает и проверяет сообщения, все равно вы везде будете пользоваться готовыми библиотеками. Главное, чтобы у вас было общее понимание того зачем это нужно, но если вам все таки интересно — полистайте Layman’s Guide to Elliptic Curve Digital Signatures, там внизу есть красивая визуализация всего процесса, можете сами попробовать.
У меня на этом все, следующая глава: Bitcoin in a nutshell — Transaction.
How is a private key created for Bitcoin?
![]()
Public and private key pairs are the essential first step in owning Bitcoin. A public key allows you to receive Bitcoin, and the corresponding private key keeps them safe. Knowing how these keys are created should be your first step in understanding Bitcoin.
In this article I’m going to show you how a private key is generated for Bitcoin. I will follow up with a part 2 to explain how the public key is generated.
First let’s get some knowledge.
Understanding Bits
A bit, shorthand for binary digit, is the smallest unit of data in a computer represented as a 0 or 1. Everything you see on your screen is generated by a unique combination of binary digits. For example, here’s the letter A in bits.
Understanding Random Numbers
A private key in Bitcoin is just a random number between 1 and 2²⁵⁶.
All the private keys that protect all the bitcoins in the world are just different random numbers between 1 and 2²⁵⁶. Theoretically anyone can attempt to guess your private key, but 2²⁵⁶ is such a large number that it would take an attacker billions of years to try all the possible private keys.
To create our private key we need a way to generate a random number. To do this we need to use a number generator that is cryptographically secure. A number generator is cryptographically secure when the number generated cannot be determined or known how it was chosen. Using deterministic number generators puts your private key at risk of being known.
Now that we have some understanding about bits and random numbers, let’s create a private key for Bitcoin.
Step 1: Generate a random set of data
For our purposes of Bitcoin, we need a cryptographically secure number generator to generate our number. To satisfy this requirement we need to generate a random set of data, we will convert this data into a number later.
Here’s some data from swiping my hand across the keyboard and occasionally tapping shift.
Step 2: Convert random data to 256-bit number
Now that we have a random set of data, we can use SHA256 to convert our random set of data into 256 bits.
SHA256 is a hashing algorithm that receives any length input, our random data, and creates a 256-bit digest or hash.
Here’s the SHA256 hash of our random data.
This is not 256 actual binary digits, but it is 256 bits. Our hash from SHA256 is represented in hexadecimal, and contains 64 characters. Each character in the hash represents 4 bits.
64 characters x 4 bits = 256 bits
In order for us to see our number we have to convert our hexadecimal into decimal.
That’s our number! A ridiculously huge number too. If you are curious, this is how you say our large number.
Step 3: Verify Number
Now that we have generated a cryptographically secure 256-bit random number the final thing we need to do is verify if our number is between 1 and 2²⁵⁶.
Our number, even though very large, is still much smaller than the Bitcoin limit of 2²⁵⁶. This means our number qualifies and can now be used as a private key on Bitcoin.
Step 4: Add version number
In Bitcoin every private key on the main net begins with “5”. This makes it easy to identify a private key. In order for us to have our private key start with “5” we need to add 80 to the beginning of our hexadecimal.
I’ll refer to this as our new hexadecimal.
Step 5: Add 32 bit checksum
Typing our private key, because it’s so large, can be prone to errors. Adding a checksum allows us to detect any typing errors when using our private key. To add a checksum to our private key we need to get the double SHA256 hash of our new hexadecimal number.
Here’s the hash of our new hexadecimal.
And here’s the hash of the hash above, also known as a double hash.
Now take the first 8 characters, 32 bits, of the double hash and add it to end our new hexadecimal above.
Step 6: Convert new hexadecimal to base58
To further prevent typing errors we need to convert our private key from hexadecimal to base58. Base58 removes easily mistakable alphanumeric characters o, O, L, and I. The result is 58 characters that can be used to represent our private key.
Here’s our converted base58 private key, which includes the “5” required for every private key on Bitcoin.
Conclusion
And that’s it! You now know how to generate a private key for Bitcoin. Stay tuned for part 2 where I will show you how generate a public key from the private key we created.
The goal of this article is to educate others about Bitcoin and cryptocurrency. If you found this useful please share this article with friends and tap the clap button.
WARNING:
Do not use this number as your private key. Creating a wallet using this private key will make your wallet subject to attacks.