Как преобразовать закрытый ключ WIF в расширенный закрытый ключ BIP32

Я пытаюсь восстановить расширенный главный закрытый ключ BIP32 из его расширенного открытого ключа BIP32 (который я уже знаю) и закрытого ключа WIF (который я получил путем расшифровки начального числа BIP38 с помощью парольной фразы).

Я выполнил шаги, описанные в этой статье от Виталика Бутерина, но для использования crack_bip32_privkeyфункции в pybitcointools, мне нужен закрытый ключ в формате BIP32 (не WIF). Я вижу, как получить закрытый мастер-ключ BIP32 из начального числа BIP32 (с помощью bip32_master_key), но не могу понять, как сделать то же самое из закрытого ключа в формате WIF.

Как преобразовать закрытый ключ WIF в закрытый ключ BIP 32 (с помощью Python, .NET или Javascript)?

Вы уже задавали этот вопрос, и он был закрыт как дубликат bitcoin.stackexchange.com/questions/56916/… .
Я отредактировал вопрос, указав, о чем он на самом деле хотел спросить: bitcoin.stackexchange.com/questions/56916/…

Ответы (1)

Вы не можете. Формат расширенного закрытого ключа 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
Отлично, это именно то, что мне было нужно. Любая идея о том, как сделать это быстрее (например, дней)? Прямо сейчас это займет годы :(. Я изучал Cython, но мне пришлось бы cythonize все зависимости, на которые уходит время. Если бы вы знали, как сделать это напрямую со стандартной библиотекой Bitcoin C++ вместо Python, это было бы здорово. .
Это не должно занять более пары секунд, если только ваш ключ не имеет действительно высокого индекса. Однако, если ключ находится на глубине более 1 (т. е. ключ получен из публичного ключа, полученного из родительского публичного ключа и т. д.) или он усилен, то процесс будет зацикливаться до тех пор, пока не будут исчерпаны все возможные индексы, и он выходит без ключа. Подозреваю, что здесь именно так. Чтобы справиться с этим, вы должны убедиться, что ключ не закален, и убедиться, что вы находитесь на нужной глубине. Если нет, вам придется получать открытые ключи, пока вы их не получите.
Хорошо, большое спасибо за совет. На самом деле я использую два семени и публичные ключи (с глубиной 0 и «Главный открытый ключ биткойна» в соответствии с bip32.org , предоставленным Coinbase при создании хранилища с несколькими подписями. Для каждого семени я смог получить закрытый ключ WIF , но связанный с ним адрес не совпадает с адресом, полученным из публичного ключа (с путем вывода "Simple: m/i" и правильным индексом i, который я знаю). Таким образом, кажется, что у меня есть закрытый ключ, это не "главный частный key", который мне понадобится для получения закрытого ключа с точно таким же адресом, как и у pubKey.
Без правильного закрытого ключа я не могу подписать сообщение, подтверждающее, что я владею адресом, связанным с открытым ключом.
О чем вы говорите и как это связано с этим вопросом?
Извините за путаницу. Я просто пытаюсь предоставить некоторую справочную информацию о том, как ключи были сгенерированы изначально. Цель моего вопроса - получить закрытый ключ, адрес которого совпадает с адресом производного открытого ключа по индексу m/14.
Прямо сейчас у меня есть: (1) главный публичный ключ в расширенном формате BIP32 (предоставленный Coinbase), (2) производный публичный ключ с индексом m/14, который соответствует адресу, для которого мне нужно подтвердить право собственности, (3) закрытый ключ в WIF формат (предоставляется Coinbase при создании хранилища, я не знаю, защищено ли оно или глубина).
Я не уверен, как ввести их в ваш скрипт и какие параметры изменить в строке priv = (b'\x04\x88\xAD\xE4', 1, 0, i, b'', wif_key), чтобы получить закрытый ключ BIP32, который будет иметь тот же адрес, что и производный публичный ключ.
Это похоже на проблему XY: xyproblem.info . Наличие двух открытых ключей и закрытого ключа пользователя coinbase должно позволить вам получить необходимую информацию, но не тем методом, который вы хотите использовать. Поскольку сейчас это немного не по теме, я предлагаю вам задать новый вопрос, задавая именно то, что вы хотите сделать, а не то, что, по вашему мнению, сработает, чтобы получить то, что вы хотели сделать.
В любом случае, я предполагаю (не уверен, что сейчас у меня нет доступа к моей учетной записи coinbase, чтобы проверить), что пользовательский ключ, который они вам дают, является закрытым ключом, который затем используется для получения закрытого ключа, соответствующего мастеру. открытый ключ, который они вам дали. Это производное, вероятно, является усиленным производным и, вероятно, использует путь деривации BIP 44. Таким образом, вы должны иметь возможность просто получить закрытый ключ, соответствующий открытому ключу, используя путь вывода BIP 44, а оттуда просто получить нужный вам закрытый ключ.
Вы совершенно правы. Я попытался обобщить свою проблему, но, вероятно, не должен был этого делать. Я разместил более подходящий вопрос здесь: bitcoin.stackexchange.com/questions/57207/… . Большое спасибо за твою помощь.