Следуйте за нами

Последние новости

Больше новостей

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

Что такое закрытый ключ?

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

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

Закрытый несжатый ключ всегда начинается с 5 и выглядит так:

5Hwgr3u458GLafKBgxtssHSPqJnYoGrSzgQsPwLFhLNYskDPyyA

Что такое открытый ключ?

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

Хеш открытого ключа всегда равен 1:

1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2

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

Читать также:   Что такое проект Monacoin? Введение в криптовалюту MONA

Создание открытого ключа с помощью ECDSA

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

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

Ниже приведен код, который вам потребуется на языке Python:

private_key_bytes = codecs.decode (private_key, ‘hex’)

# Получить открытый ключ ECDSA

key = ecdsa.SigningKey.from_string (private_key_bytes, curve = ecdsa.SECP256k1) .verifying_key

key_bytes = key.to_string ()

key_hex = codecs.encode (key_bytes, ‘hex’)

В представленном выше коде закрытые ключи были декодированы с помощью кодеков. Как и в Python, есть как минимум два класса, которые могут хранить закрытый и открытый ключи, «str», строковый массив и «bytes» — байтовый массив, все может немного запутаться.

Это потому, что массив строк X не равен массиву байтов X, но он равен массиву байтов с двумя элементами, O <. Метод codecs.decode преобразует строку в байтовый массив.

После применения ECDSA нам нужно будет добавить байты 0x04 (04 в качестве префикса) к полученному общедоступному ключу. Это сгенерирует полный открытый ключ Биткоин.

Сжатие открытого ключа

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

Это делается путем взятия X из открытого ключа ECDSA и добавления 0x02, если последний байт Y четный, и байта 0x03, если последний байт нечетный.

Читать также:   Анализ рынка криптовалют на 26 января 2018

Ключ шифрования с помощью SHA-256 и RIPEMD-160

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

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

В конце этого процесса у вас будет 160-разрядное целое число, представляющее зашифрованный открытый ключ.

Ниже приведен код, необходимый для шифрования открытого ключа в Python:

public_key_bytes = codecs.decode (public_key, ‘hex’)

# Запустите SHA-256 для открытого ключа

sha256_bpk = hashlib.sha256 (public_key_bytes)

sha256_bpk_digest = sha256_bpk.digest ()

# Запустите RIPEMD-160 для SHA-256

palemd160_bpk = hashlib.new (‘maturemd160’)

ripemd160_bpk.update (sha256_bpk_digest)

зрелый160_bpk_digest = зрелый160_bpk.digest ()

зрелый160_bpk_hex = codecs.encode (зрелый160_bpk_digest, «hex»)

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

Поскольку у Биткоин есть две сети: основная и тестовая, нам нужно создать адрес, который будет использоваться в сети. Это означает, что нам нужно будет добавить 0x00 байтов к зашифрованному открытому ключу. Для использования testnet вам нужно будет добавить 0x6f байт.

Расчет контрольной суммы  

Следующим шагом является вычисление контрольной суммы полученного ключа mainnet. Контрольная сумма гарантирует, что ключ все еще сохраняет свою целостность во время процесса. Если контрольная сумма не совпадает, адрес будет помечен как недействительный.

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

Код, необходимый для расчета контрольной суммы адреса:

# Двойной SHA256, чтобы получить контрольную сумму

sha256_nbpk = hashlib.sha256 (network_bitcoin_public_key_bytes)

sha256_nbpk_digest = sha256_nbpk.digest ()

sha256_2_nbpk = hashlib.sha256 (sha256_nbpk_digest)

sha256_2_nbpk_digest = sha256_2_nbpk.digest ()

sha256_2_hex = codecs.encode (sha256_2_nbpk_digest, ‘hex’)

контрольная сумма = sha256_2_hex [: 8]

Теперь последний шаг, необходимый для создания адреса, — это объединение ключа основной сети и контрольной суммы.

Кодирование ключа с помощью Base58

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

Ниже приведен алгоритм, необходимый для преобразования шестнадцатеричного адреса в адрес Base58:

def base58 (address_hex):

alphabet = ‘123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz’

b58_string = »

# Получить количество ведущих нулей

lead_zeros = len (address_hex) — len (address_hex.lstrip (‘0’))

# Конвертировать шестнадцатеричное в десятичное

address_int = int (address_hex, 16)

# Добавлять цифры к началу строки

пока address_int> 0:

    цифра = адрес_инт% 58

    digit_char = алфавит [цифра]

    b58_string = digit_char + b58_string

    address_int // = 58

# Добавить ‘1’ для каждых 2 ведущих нулей

ones = lead_zeros // 2

для одного в диапазоне (те):

    b58_string = ‘1’ + b58_string

вернуть b58_string

Полученная строка будет представлять сжатый адрес кошелька Биткоин.

Заключение

Процесс генерирования адреса кошелька Биткоин из личного ключа не так уж и сложен, если внимательно следить за вышеупомянутыми шагами.

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

Не забудьте оставить свой комментарий!

Войти
Отправить
wpDiscuz

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: