- Приватный ключ биткоина (private key) – что это такое, как выглядит, как получить и безопасно сохранить
- Как внешне выглядят публичный и приватный ключи кошелька биткоина
- Публичный адрес (ключ)
- Как создать приватные биткоин-ключи
- Как получить (экспортировать) приватный ключ биткоина
- Извлечение (экспорт) приватных ключей из криптокошельков
- Получение приватного ключа из онлайн-кошелька Blockchain
- Получение ключа в бумажного кошельке
- Что такое детерминированный кошелек (HD wallet), seed фраза
- Как безопасно хранить приватные ключи
- Bitcoin in a nutshell — Cryptography
- Table of content
- Introduction
- Elliptic curve
- Elliptic curve over a finite field
- SECP256k1
- Digital signature
- Private key
- Python
- Python, ECDSA
- Bitcoin-cli
- Public key
- Python, ECDSA
- C++, libbitcoin
- Formats & address
- Base58Check encoding
- Private key formats
- Public key formats
- Address
- Sign & verify
Приватный ключ биткоина (private key) – что это такое, как выглядит, как получить и безопасно сохранить
Сегодня рассмотрим значение слов «приватный ключ биткоина» – для чего он нужен, как получить и как правильно хранить.
В то время как публичный ключ, или адрес, представляет собой средство идентификации кошелька, подобие логина, приватный ключ – строго конфиденциальная информация. Внешне выглядит как набор символов, введя которые, пользователь получает доступ к управлению счетом. Приватные (их еще называют частными или закрытыми) ключи хранятся в специальном файле, публичные –формируются криптографическим методом именно на основе приватных.
Как внешне выглядят публичный и приватный ключи кошелька биткоина
Приватный ключ биткоина кодируется в следующих форматах: Base64, MINI, Hex, WIF, сжатый WIF. Все они взаимосвязаны и преобразуются один в другой:
- Формат WIF (51 символ, «5» в начале): 5JPeWYZx922hXi49Lg2RJPwLfqcmDGS9YegMNgANvx8cJa6kNK8.
- Большинство криптовалютных кошельков, используют для хранения приватных ключей WIF-сжатый формат (52 символа, начинается с «L» или «K»): KykxZQLSNPYVtYCsoqFGFnEqpRar997zihJgvfrPo8LapFrAtaea.
- Формат Hex (64 символа): 4BBFF74CA25A2A00409DCB24EC0418E9A41F9B3B56216A183E0E9731F4589DC6.
- Формат Base64 (44 символа): S7/3TKJaKgBAncsk7AQY6aQfmztWIWoYPg6XMfRYncY=.
На картинке один приватный ключ биткоина в разных форматах:
Публичный адрес (ключ)
Внешний вид публичного биткоин-ключа в различных форматах:
- Наиболее используемый в кошельках — короткий адрес. Он имеет вид 1BSUkuwtdM7gkdy6W4Q954gNKWBgy4A19Q и всегда начинается с единицы или тройки (segwit address).
Публичные ключи (public key) видны всем желающим и используются как адрес для отправки или получения биткоинов. В одном кошельке можно сгенерировать неограниченное количество публичных ключей. Каждому будет соответствовать свой приватный ключ.
Как создать приватные биткоин-ключи
При создании любого кошелька для биткоина создается приватный ключ. В зависимости от вида бумажников можно обладать контролем над ними или нет. Последний случай больше относится к онлайн-сервисам, на которых можно пройти простую регистрацию, получить адрес биткоина, но приватные ключи не доступны. Контроль над ними имеют владельцы данных онлайн-кошельков. Поэтому рекомендуем выбирать криптокошельки с возможностью выгрузки приватных ключей или сохранением seed.
- Локальные. Устанавливаются на десктопные или мобильные устройства. К ним относят Jaxx, Electrum, Coinomi, Exodus и другие. Делятся на «тонкие» и «толстые», в зависимости от способа обращения к блокчейн-сети.
- Онлайн-кошельки. Для их создания обычно нужно указать email и пароль. Такие сервисы могут предоставлять возможность просмотра приватных ключей или не иметь такой функции. Популярные сайты для хранения криптомонет: blockchain.com.
- Биржи криптовалют. После создания счета доступны кошельки для криптовалют, которые в листинге площадки. Приватные ключи не предоставляются. Можно вносить депозит на предоставленный адрес, торговать криптовалютой и совершать вывод. Популярные торговые платформы: LocalBitcoins (ЛокалБиткоинс), EXMO, Binance, Huobi, BitMEX и другие.
- Аппаратные кошельки. Наиболее безопасный вариант сохранить криптоактивы в безопасности. Владелец имеет полный контроль над всеми приватными ключами, а их кража невозможна. Выпускают аппаратные устройства Ledger, Trezor и другие.
- Бумажные. Это может быть просто записанный приватный ключ на бумаге или сервисы, которые его генерируют и предоставляют возможность распечатать и сохранить. Способ относится к «холодному» хранению криптовалют.
Как получить (экспортировать) приватный ключ биткоина
Бывают ситуации, когда необходимо получить свой приватный ключ из кошелька для тех или иных целей. Разберем, как это сделать.
Извлечение (экспорт) приватных ключей из криптокошельков
В качестве примера используется «тонкий» десктопный кошелек Exodus. В нем нужно произвести операцию экспорта приватного биткоин-ключа. Изначально она надежно скрыта, поскольку разработчики справедливо считают, что неопытному пользователю лучше не пытаться ее произвести. Неверные действия чреваты потерей средств из кошелька.
Инструкция по экспорту:
- Активировать «Developer Menu». В Windows и Linux это действие производится нажатием сочетания клавиш Ctrl+Shift+D.
- Выбрать ту криптовалюту, частный ключ которой интересует в текущий момент. Перейти по пунктам: «Developer» – «Assets» – «Bitcoin» или иная выбранная валюта – «Export Private Keys».
- В появившемся окне подтвердить свое желание нажатием кнопки «I’m sure».
- На рабочем столе появится папка под названием «Exodus-export», внутри – файл формата CSV. Это файл скопировать в надежное место, папку сразу удалить.
Открыть файл можно через текстовый редактор Libre Office, Wordpad, Exel, стандартный Блокнот и т. д. В графе «PRIVKEY» будет буквенно-цифровое сочетание – это и есть приватный (закрытый) ключ биткоина:
Получение приватного ключа из онлайн-кошелька Blockchain
Рассмотрим, как получить приватный ключ в популярном онлайн-кошельке Блокчейн. В настройках функции экспорта ключей нет. Нужно воспользоваться seed-фразой, которая находится по адресу «Настройки» — «Безопасность» — «Фраза для восстановления кошелька». Скопировать все слова и перейти в генератор iancoleman.io . Указать количество слов (12) и вставить их в форму «BIP39 Mnemonic».
Опуститься вниз страницы в раздел «Derived Addresses». В нем будет адрес, публичный и приватный ключ.
Получение ключа в бумажного кошельке
Бумажные кошельки генерируют приватные ключи локально с помощью выполнения скрипта в браузере.
После сбора случайной энтропии высветится сжатый адрес биткоина и приватный ключ в сжатом WIF-формате. Что с ними делать, понятно по картинке:
Сервис для создания бумажных кошельков: bitaddress.org.
Что такое детерминированный кошелек (HD wallet), seed фраза
В 2011 году для решения ряда проблем с анонимностью разработчики Bitcoin Core выпустили такую разработку, как HD Wallet. HD расшифровывается «hierarchical deterministic», то есть «иерархически детерминированный». Звучит непонятно, но по факту все не так сложно.
В контексте криптовалют словом «иерархия» обозначают связь между элементами. В данном случае появляется возможность использовать один адрес для выяснения второго, а также применять секретную seed-фразу для генерации сразу многих связанных между собой адресов.
Пример seed (backup phase) в кошельке Blockchain (всего 12 слов):
«Детерминированная» система – та, где недопустимы никакие случайности в процессе формирования будущих состояний. То есть конкретные вводные данные всегда будут выдавать конкретный результат.
Преимущества технологии HD wallet:
- Усиление анонимности. Владелец HD wallet обладает одной копией программного бумажника с одним тайным ключом (называемым также «семя» или «master key»). При объединении семени с хеш-функциями образуется бесконечное количество связанных между собой адресов. Связь невидима со стороны. Это адреса называют «дочерними».
- Легкость запоминания сид-фразы. Записать или выучить код из 12 слов намного легче, чем хранить приватные ключи для каждого отдельного адреса биткоина.
- Комфортное резервное копирование. Многие пользователи сталкиваются с проблемами резервного копирования мобильных кошельков на iOS или Android – возникает необходимость использовать один и тот же ключ, а это прямая угроза для безопасности. HD кошелек вообще не требует создания резервных копий, достаточно распечатать или сохранить в надежном месте сид-фразу.
Технология реализована в надстройке Armory для Bitcoin Core, кошельках Electrum, MultiBit HD, BitGo, CarbonWallet, The Hive, Mycelium Bitcoin Wallet, Green Address, Trezor и других.
Как безопасно хранить приватные ключи
Используя интернет-кошельки, следует понимать, что ключи хранятся на серверах компании-разработчика. Пользователь лично владеет private key лишь в случае использования десктопных, аппаратных или бумажных кошельков.
Варианты хранения кода:
- На бумаге.
- На флешке в виде скриншота или фотографии, pdf-файла.
- На жестком диске, в том числе съемном.
- На физической монете, металлической пластине (своеобразный аналог аппаратного «холодного» кошелька в форме криптовалютной монеты).
- В памяти.
Ни один из перечисленных способов не дает 100%-ную гарантию сохранности ключа, в каждом случае есть вероятность физического повреждения, взлома или кражи. Так что выбор каждый делает, исходя из своих соображений.
В Сети сейчас много злоумышленников, которые мечтают украсть приватный ключ биткоина. Они могут соблазнять бесплатными токенами, предлагать получить новые монеты, а взамен просят загрузить в сеть или созданную ими программу частный ключ. Делать этого ни в коем случае нельзя.
Источник
Bitcoin in a nutshell — Cryptography
Одна из причин, почему Bitcoin продолжает привлекать столько внимания — это его исключительная «математичность». Сатоши Накамото удалось создать систему, которая способна функционировать при полном отсутствии доверия между ее участниками. Все взаимодействия основаны на строгой математике, никакого человеческого фактора — вот в чем была революционность идеи, а не в одноранговой сети, как многие думают. Поэтому первую главу я решил посвятить именно математическим основам Bitcoin.
Ниже я постараюсь объяснить вам самые базовые вещи — эллиптические кривые, ECC, приватные / публичные ключи и так далее. По возможности я буду иллюстрировать свои слова примерами кода, преимущественно на Python 2.7, если что-то непонятно — спрашивайте в комментариях.
Table of content
Introduction
Как я уже сказал выше, криптография — это фундаментальная часть Bitcoin. Без нее вообще бы ничего не заработало, поэтому начинать нужно именно отсюда.
В Bitcoin используется так называемая криптография на эллиптических кривых (Elliptic curve cryptography, ECC). Она основана на некоторой особой функции — эллиптической кривой (не путать с эллипсом). Что это за функция и чем она так примечательна я расскажу дальше.
Elliptic curve
Эллипти́ческая крива́я над полем
— неособая кубическая кривая на проективной плоскости над
(алгебраическим замыканием поля
), задаваемая уравнением 3-й степени с коэффициентами из поля
и «точкой на бесконечности» — Wikipedia
Если на пальцах, то эллиптическая кривая — это внешне довольно простая функция, как правило, записываемая в виде так называемой формы Вейерштрасса:
В зависимости от значений параметров и
, график данной функции может выглядеть по разному:
Скрипт для отрисовки графика на 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
Электро́нная по́дпись (ЭП), Электро́нная цифровая по́дпись (ЭЦП) — реквизит электронного документа, полученный в результате криптографического преобразования информации с использованием закрытого ключа подписи и позволяющий проверить отсутствие искажения информации в электронном документе с момента формирования подписи (целостность), принадлежность подписи владельцу сертификата ключа подписи (авторство), а в случае успешной проверки подтвердить факт подписания электронного документа (неотказуемость) — Wikipedia
Общая идея такая: Алиса хочет перевести 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 . Этот формат я использовал в примерах выше, для красоты его еще иногда разделяют пробелами.
Другой более прогрессивный формат — WIF (Wallet Import Format). Строится он довольно просто:
- Берем приватный ключ, например 0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D
- Записываем его в Base58Check с префиксом 0x80 . Все.
Public key formats
На всякий случай напомню, что публичный ключ — это просто точка на прямой SECP256k1. Первый и самый распространенный вариант его записи — uncompressed формат, по 32 байта для X и Y координат. Чтобы не возникало путаницы, используется префикс 0x04 и того 65 байт.
Однако, как можно догадаться из названия, это не самый оптимальный способ хранить публичный ключ.
Вы удивитесь, но второй формат называется compressed. Суть его в следующем: публичный ключ — это точка на кривой, то есть пара чисел удовлетворяющая уравнению . А значит можно записать только Х координату и если нам понадобится Y координата — просто решаем уравнение. Тем самым мы уменьшаем размер публичного ключа почти на 50%!
Единственный нюанс — если точка лежит на кривой, то для ее Х координаты очевидно существует два решения такого уравнения (посмотрите на графики выше, если сомневаетесь). Обычно мы бы просто сохранили знак для Y координаты, но когда речь идет о функции над конечным полем, то нужно воспользоваться следующим свойством: если для Х координаты существуют решения уравнения, то одна из точек будет иметь четную Y координату, а вторая — нечетную (опять же, можете сами в этом убедиться).
В первом случае используется префикс 0x02 , во втором — 0x03 . Вот иллюстрация процесса:
Address
Как уже было сказано, адрес получается из публичного ключа однозначным образом. Более того, провести обратную операцию невозможно, так как используются криптографически стойкие хэш функции — RIPEMD160 и SHA256. Вот алгоритм перевода публичного ключа в адрес:
- Возьмем приватный ключ, например 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.
Источник