Я пытаюсь восстановить расширенный главный закрытый ключ BIP32 из его расширенного открытого ключа BIP32 (который я уже знаю) и закрытого ключа WIF (который я получил путем расшифровки начального числа BIP38 с помощью парольной фразы).
Я выполнил шаги, описанные в этой статье от Виталика Бутерина, но для использования crack_bip32_privkey
функции в pybitcointools
, мне нужен закрытый ключ в формате BIP32 (не WIF). Я вижу, как получить закрытый мастер-ключ BIP32 из начального числа BIP32 (с помощью bip32_master_key
), но не могу понять, как сделать то же самое из закрытого ключа в формате WIF.
Как преобразовать закрытый ключ WIF в закрытый ключ BIP 32 (с помощью Python, .NET или Javascript)?
Вы не можете. Формат расширенного закрытого ключа BIP 32 содержит информацию, которой нет в закрытом ключе WIF. Расширенный формат закрытого ключа содержит код цепочки закрытого ключа, индекс и родительский отпечаток. Эта информация исходит из самого закрытого ключа и не может быть найдена где-либо еще.
Чтобы получить родительский открытый ключ, единственная информация, которая вам нужна из расширенного открытого ключа, — это индекс дочернего элемента. Это можно легко найти, просто перебрав все возможные дочерние индексы (2 ^ 31 - 1 индексы), пока вы не получите главный закрытый ключ, у которого есть открытый ключ, соответствующий родительскому открытому ключу, или пока вы не получите правильный дочерний открытый ключ ключ из родительского открытого ключа.
Вот код, который найдет вам родительский закрытый ключ. Это первый метод циклического перебора возможных родительских закрытых ключей, пока не будет найден тот, у которого есть открытый ключ, соответствующий родительскому открытому ключу. Обратите внимание, что это может быть совершенно неэффективно и поиск ключа может занять много времени. Также обратите внимание, что это работает только в том случае, если дочерний ключ получен непосредственно от родителя, а не на какой-то глубине в дереве вывода.
from pybitcointools.deterministic import raw_crack_bip32_privkey, bip32_deserialize, bip32_serialize, bip32_privtopub
from pybitcointools.main import decode_privkey, encode_privkey
parent_pub = 'xpub661MyMwAqRbcEnKbXcCqD2GT1di5zQxVqoHPAgHNe8dv5JP8gWmDproS6kFHJnLZd23tWevhdn4urGJ6b264DfTGKr8zjmYDjyDTi9U7iyT'
wif_key = encode_privkey(decode_privkey('KyqcQVzcp7cHEMEDHQaz5eaE5azsRHaE4ukkeqwM2vdiQwBYtxeb'), 'bin_compressed')
for i in xrange(2**31 -1):
priv = (b'\x04\x88\xAD\xE4', 1, 0, i, b'', wif_key)
pkey = raw_crack_bip32_privkey(bip32_deserialize(parent_pub), priv)
final_key = bip32_serialize(pkey)
if bip32_privtopub(final_key) == parent_pub:
print final_key
break
m/14
.m/14
, который соответствует адресу, для которого мне нужно подтвердить право собственности, (3) закрытый ключ в WIF формат (предоставляется Coinbase при создании хранилища, я не знаю, защищено ли оно или глубина).priv = (b'\x04\x88\xAD\xE4', 1, 0, i, b'', wif_key)
, чтобы получить закрытый ключ BIP32, который будет иметь тот же адрес, что и производный публичный ключ.
Питер Уилле
Эндрю Чоу