Публичный адрес

Публичный адрес


Создание публичного ключа

Начиная с закрытого ключа в виде случайного числа k, мы умножаем его на заданную точку кривой называемую точкой генерации G для того, чтобы получить еще какую-то точку кривой, которая и будет являться соответствующим открытым ключ K. Точка генерации определена как часть стандарта secp256k1 и всегда одна и та же для ключей в Биткоин:

\begin{equation} {K = k * G} \end{equation}

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


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

Реализуя умножение на эллиптический кривой, мы берем приватный ключ k сгенерированный ранее и умножаем его на генераторную точку G для нахождения публичного ключа K:

K = 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD * G



Публичный ключ K определен как точка K = (х, у):

K = (x, y)

где,

x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB



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

На рисунке ниже виден процесс получения точек G, 2G, 4G при помощи геометрических операций на кривой.


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

Биткоин-адреса

Биткоин-адрес представляет собой строку из цифр и символов латинского алфавита. Адреса, полученные из публичных ключей начинаются с цифры "1". Вот пример адреса:

1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy



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

Биткоин-адрес получается из публичного ключа путем использования односторонней криптографической операции хеширования. А "алгоритм хэширования" или просто "алгоритм хеша" — это односторонняя функция, производящая отпечаток или "хэш" произвольного количества данных на входе. Криптографические хэш-функции широко используются в Биткоин: в Биткоин-адресах, в адресах сценариев, и в алгоритме доказательства работы в манинге. Адрес из публичного ключа получается в результате применения алгоритма под названием Secure Hash Algorithm (SHA) и RACE Integrity Primitives Evaluation Message Digest (RIPEMD), конкретно SHA256 and RIPEMD160.

Начиная с открытого ключа K, мы вычисляем SHA256-хэш и результат пропускаем через хэш-алгоритм RIPEMD160, получив на выходе 160-ти битное (20-байт) число:

\begin{equation} {A = RIPEMD160(SHA256(K))} \end{equation}

где К — это публичный ключ и А результирующий Биткоин-адрес.


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

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


Кодировки Base58 и Base58Check

Для того, чтобы представлять длинные числа в компактном виде, используя меньше символов, многие компьютерные системы используют смешанные буквенно-цифровые представления с базой (или системов счисления) выше, чем 10. Например, в то время как традиционная десятичная система использует 10 цифр от 0 до 9, шестнадцатеричная система использует 16, с буквами от А до F в качестве шести дополнительных символов. Число, представленное в шестнадцатеричном формате короче, чем эквивалентное в десятичном представлении. Еще более компактное, представление Base-64 используется для передачи бинарных данных в "текстовых средах", наподобие системы email. Алфавит Base-64 состоит из 26 прописных букв, 26 заглавных букв, 10 цифр, и еще двух символов: "+" и "/". Base-64 чаще всего используется для кодирования вложений в сообщениях электронной почты. Формат кодирования Base58 разработан для использования в Биткоин и используется во многих других кирптовалютах. Он предлагает баланс между компактным представлением, читаемостью, определением и предотвращением ошибок. Base58 — это подмножество Base64, использующее прописные и заглавные буквы и цифры, но без некоторых символов, которые часто ошибочно принимают за друг друга и могут отображаться идентично некоторыми шрифтами. В частности, Base58 — это Base64 без числа 0 (ноль), O (заглавная буква О), l (маленкая L), I (большая i), и символов "\+" и "/". Или, проще говоря, это набор прописных и заглавных букв и цифр без четырех (0, O, L, I), упомянутых выше.

Пример 1. алфавит Base58

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz



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

Для конвертирования данных (числовых) в формат Base58Check, к данным сначала требуется добавить префикс, называемый "байтом версии", который служит для определения типа кодируемых данных. Например, в случае Биткоин-адреса префикс 0 (0x00 в шестнадцатеричной системе), в то время как префикс для приватного ключа — это 128 (0x80 в шестнадцатеричной системе).

Далее мы вычисляем контрольную сумму "удвоенный SHA", в смысле, что применяем хеш-алгоритм SHA256 дважды на предыдущем результате (префиксе и данных).

checksum = SHA256(SHA256(prefix+data))



Из полученного 32-ухбайтного хэша (хэш хэша), мы берем только первые четыре байта. Эти четыре байта служат в качестве кода проверки ошибочности, или контрольной суммы. Эта контрольная сумма затем добавляется к концу строки.

Результат состоит из трех элементов: префикса, данных и контрольной суммы. Этот результат кодируется с использованием описанного раньше алфавита Base58. Ниже иллюстрируется процесс кодирования в формат Base58Check.


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


Table 1. Префикс версии в Base58Check и примеры закодированного результатаTypeVersion prefix (hex)Base58 result prefixБиткоин-адрес

0x00

1

Pay-to-Script-Hash адрес

0x05

3

Testnet-адрес

0x6F

m или n

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

0x80

5, K или L

BIP38 зашифрованный приватный ключ

0x0142

6P

BIP32 Расширенный публичный ключ

0x0488B21E

xpub

Давайте посмотрим на весь процесс создания Биткоин-адреса, от приватного ключа, к публичному ключу (точке на эллиптической кривой), адресу после двойного хеширования и, наконец, после кодирования в Base58Check. C++ код в [addr_example] показывает полный процесс шаг-за-шагом. Пример кода использует библиотеку libbitcoin, описанную в [alt_libraries].


Пример 2. Создаем Биткоин-адрес в кодировке Base58Check из приватного ключа


Код использует предопределенный приватный ключ, поэтому, он выдает один и тот же Биткоин-адреса при каждом запуске, как показано на [addr_example_run].


Пример 3. Компиляция и запуск addr

Форматы ключей

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


Форматы приватных ключей

Приватный ключ может быть представлен ​​в различных форматах, каждый из которых соответствует тому же самому 256-битному числу. В таблице показаны три распространенных формата, используемых для представления закрытых ключей.


Table 2. Представления приватных ключей (форматы кодирования)ТипПрефиксОписаниеШестнадцатиричный

Нет

64 шестнадцатиричных цифры

WIF

5

Кодировка Base58Check: Base58 с префиксом версии 128 и 32-битной контрольной суммой

Сжатый WIF

К или L

То же, что выше, но с добавлением суффикса 0x01 перед кодированием

В таблице 3 показан приватный ключ в этих трех форматах.


Table 3. Пример: один и тот же ключ в разных форматахФорматПриватный ключШестнадцатиричный

1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd

WIF

5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

Сжатый WIF

KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

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

Мы используем команду wif-to-ec из Bitcoin Explorer, чтобы показать, что оба WIF ключа представляют один и тот же приватный ключ:

$ bx wif-to-ec 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd

$ bx wif-to-ec KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd



Декодирование из Base58Check

Команды Bitcoin Explorer (см. [libbitcoin]) позволяют легко писать сценарии оболочки и однострочники для управления Биткоин-ключами, адресами и транзакциями. Вы можете использовать Bitcoin Explorer для расшифровки формата Base58Check из командной строки.

Команда base58check-decode используется для декодирования несжатого ключа:

$ bx base58check-decode 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
wrapper
{
    checksum 4286807748
    payload 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd
    version 128
}



Результат содержит ключ, префикс версии Wallet Import Format (WIF) равный числу 128, и контрольную сумму.

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


$ bx base58check-decode KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
wrapper
{
    checksum 2339607926
    payload 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd01
    version 128
}



Перекодирование из шестнадцатеричного представления в Base58Check

Для того, чтобы закодировать в формат Base58Check (в противоположность предыдущей команде), мы используем команду base58check-encode из Bitcoin Explorer (см. [libbitcoin]), которой передадим приватный ключ в шестнадцатиричном виде с префиксом версии 128 для Wallet Import Format (WIF):

bx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd --version 128
5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn



Перекодирование из шестнадцатеричного вида (сжатый ключ) в Base58Check

Для кодирования "сжатого" закрытого ключа в Base58Check (см. [comp_priv]), мы добавляем суффикс 01 к шестнадтеричному представлению ключа и затем кодируем, как описано выше:

$ bx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd01 --version 128
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ



В результате WIF-сжатый формат начинается с "K". Это означает, что приватный ключ в нем имеет суффикс "01" и будет использоваться для создания исключительно сжатых публичных ключей (см. [comp_pub]).

Форматы публичных ключей

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

Как мы видели ранее, публичный ключ — это точка на эллиптической кривой, имеющей координаты (x,y). Как правило он представлен префиксом 04 и двумя 256-битными числами после префикса : в первом числе x координата точки, а во втором y координата. Префикс 04 используется для того, чтобы можно было отличить несжатые публичные ключи от сжатых, которые начинаются с 02 или 03.

Вот открытый ключ, сгенерированный из приватного ключа, созданного нами ранее, в виде координат x and y:

x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB



Вот тот же самый публичный ключ показан в виде 520-битного числа (130 шестнадцатеричных цифр) с префиксом 04 и далее x и y в виде 04 x y:

K = 04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A<?pdf-cr?>07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB



Сжатые публичные ключи

Сжатые публичные ключи были введены для того, чтобы уменьшить размер транзакций и сэкономить место в блокчейне. Большинство транзакций включает публичный ключ, необходимый для проверки учетных данных владельца при платеже. Каждый публичный ключ требует 520 битов (префикс \+ x \+ y), которые, если их умножить на несколько сотен транзакций в блоке, или десятки тысяч транзакций в день, добавляют значительное количество к объему блокчейна.

Как мы видели ранее, публичный ключ — это точка (x,y) на эллиптической кривой. Поскольку кривая выражает математическую функцию, точка на кривой представляет собой решение уравнения, а значит, если мы знаем x координату, то мы можем вычислить y координату, решив уравнение y2 mod p = (x3 + 7) mod p. Это позволяет хранить только x координату публичного ключа, опуская y координату и уменьшив размера ключа и пространство, необходимое для его хранения на 256 бит. Почти 50% уменьшение размера каждой транзакции, помогает сэкономить много пространства в течение долгого времени!

В то время как несжатые публичные ключи имеют префикс 04, сжатые начинаются либо с 02, либо с 03. Давайте разберемся почему возможных префиксов два: так как в левой части уравнения находится у2, это означает, что у может быть как положительным, так и отрицательным. На графике это означает, что в результирующая координата y может быть над осью х или под. Кривая симметрична относительно оси х. Так что, хоть мы и можем опустить значение координаты y, ее знак нам сохранить придется, или, другими словами, мы должны помнить, был ли он выше или ниже оси абсцисс, так как каждый из этих вариантов представляет собой различные точки и различные публичные ключи. При расчете эллиптической кривой в двоичной арифметике на конечной области простого порядка р, y координата имеет либо четное, либо нечетное значение, что соответствует знаку, как описано выше. Таким образом, для разлечения этих двух возможных значений у, мы храним сжатый публичный ключ с префиксом 02, если у четное, и, 03, если нечетно, позволяя программному обеспечению правильно выводить координату y из x и распаковывать публичный ключ к полным координатам точки.



Вот тот же публичный ключ, сгенерированный ранее, показан как сжатый публичный ключ длиной 264 бит (66 шестнадцатеричных цифр) с префиксом 03указанием избыточной y координаты:

K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A



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

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

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

Сжатые приватные ключи

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

Помните, что эти форматы не взаимозаменяемы. В более новых кошельках, которые используют сжатые публичные ключи, приватные ключи будут экспортированы только сжатыми (с префиксом K или L). Если кошелек более старой реализации и не использует сжатые публичные ключи, приватные ключи будут экспортированы в WIF (с префиксом 5). Здесь задача просигнализировать импортирующему кошельку, что он должен просканировать блокчейн на предмет сжатых или несжатых публичных ключей и адресов.

Если Биткоин-кошелек поддерживает сжатые публичные ключи, он будет их использовать во всех транзакциях. Сжатые публичные ключи будут использоваться для получения Биткоин-адреса, которые, в свою очередь, будут использованы в транзакциях. При экспорте приватных ключей из более нового кошелька, поддерживающего сжатые публичные ключи, используется модифицированный Wallet Import Format с добавлением одного байта суффикса 01 к закрытому ключу. Рузультирующий приватный ключ в кодировке Base58Check называется "Сжатый WIF" и начинается с буквы К или L, а не с "5", как в случае с WIF-кодированнымы (несжатыми) ключами из более старых кошельков.

В таблице показан тот же ключ, закодированный в WIF и WIF-сжатом форматах.

Table 4. Пример: один и тот же ключ в разных форматахФорматПриватный ключШестнадцатиричный

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

WIF

5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

Шестнадцатиричный и сжатый

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD_01_

Сжатый WIF

KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ


"Сжатые приватные ключи" не существуют! Они не сжаты; скорее, WIF-сжатый формат сигнализирует, что они должны быть использованы только для получения сжатых публичных ключей и соответствующих им адресов Биткоин. Парадоксально, но "WIF-сжатый" приватный ключ на один байт длиннее, потому что имеет дополнительный суффикс 01, отличающий его от "несжатого".

Реализация ключей и адресов на Python

Самая полная библиотека Bitcoin для Python написана Виталиком Бутериным и может быть найдена по адресу pybitcointools. В [key-to-address_script] мы используем библиотеку pybitcointools (импортирована как "bitcoin") для генерации и показа ключей и адресов в различных форматах.


Пример 4. Генерация ключа и адреса и форматирование при помощи библиотеки pybitcointools


В [key-to-address_script_run] показан вывод после запуска этого кода.


Пример 5. Запускаем key-to-address-ecc-example.py

$ python key-to-address-ecc-example.py Private Key (hex) is: 3aba4162c7251c891207b747840551a71939b0de081f85c4e44cf7c13e41daa6 Private Key (decimal) is: 26563230048437957592232553826663696440606756685920117476832299673293013768870 Private Key (WIF) is: 5JG9hT3beGTJuUAmCQEmNaxAuMacCTfXuw1R3FCXig23RQHMr4K Private Key Compressed (hex) is: 3aba4162c7251c891207b747840551a71939b0de081f85c4e44cf7c13e41daa601 Private Key (WIF-Compressed) is: KyBsPXxTuVD82av65KZkrGrWi5qLMah5SdNq6uftawDbgKa2wv6S Public Key (x,y) coordinates is: (41637322786646325214887832269588396900663353932545912953362782457239403430124L, 16388935128781238405526710466724741593761085120864331449066658622400339362166L) Public Key (hex) is: 045c0de3b9c8ab18dd04e3511243ec2952002dbfadc864b9628910169d9b9b00ec243bcefdd4347074d44bd7356d6a53c495737dd96295e2a9374bf5f02ebfc176 Compressed Public Key (hex) is: 025c0de3b9c8ab18dd04e3511243ec2952002dbfadc864b9628910169d9b9b00ec Bitcoin Address (b58check) is: 1thMirt546nngXqyPEz532S8fLwbozud8 Compressed Bitcoin Address (b58check) is: 14cxpo3MBCYYWCgF74SWTdcmxipnGUsPw3

[ec_math]  — это еще один пример применения библиотеки Python ECDSA для математики эллиптических кривых без использования каких-либо специализированных библиотек.


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


В [ec_math_run] показан вывод после запуска этого сценария.


Note

В приведенном выше примере используется функция os.urandom, которая вызывает криптографически безопасный генератор случайных чисел (CSRNG), предоставляемый операционной системой. В случае UNIX-подобной операционной системы, такой как Linux, он читает из /dev/urandom; а в случае Windows, происходит вызов CryptGenRandom(). Если подходящий источник случайности не найден, будет брошено исключение NotImplementedError. В то время как генератор случайных чисел, используемый здесь, в демонстрационных целях, это не подходит для генерации ключей Bitcoin, так как его безопасность недостаточна.

Пример 7. Установка библиотеки Python ECDSA и запуск сценария ec_math.py

$ # Устанавливаем PIP -- менеджер пакетов Python
$ sudo apt-get install python-pip
$ # Устанавливаем библиотеку ECDSA
$ sudo pip install ecdsa
# $ Запускаем сценарий
$ python ec-math.py
Secret:  38090835015954358862481132628887443905906204995912378278060168703580660294000
EC point: (70048853531867179489857750497606966272382583471322935454624595540007269312627, 105262206478686743191060800263479589329920209527285803935736021686045542353380)
BTC public key: 029ade3effb0a67d5c8609850d797366af428f4a0d5194cb221d807770a1522873



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


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

Report Page