«Потерян» пароль к закрытому ключу, зашифрованному BIP38, возможно, шифратор неисправен (Bippy)

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

Я еще раз проверил эту программу Bippy и начинаю подозревать, что она как-то неисправна. Кажется, что закрытые ключи, начинающиеся с «5», зашифрованные с помощью Bippy, не будут расшифрованы с тем же паролем. Другие префиксы работают нормально.

Теперь это приложение Bippy с открытым исходным кодом и написано на Python, и я взял его отсюда . Я попытался в качестве теста зашифровать закрытый ключ 5Ka1Bv4RpKayZygPhZbBcREejqeYwq2iSRzWPKsg49SPgVRTnpW паролем testingOneTwo (это свежий pk, биткойнов там нет ;)). В Bippy это шифруется до 6PYMN8WT4CW7xLYczLvYfXZCtQWND7XEesk32QbXujMgKhf2v5A2ZQANpL , однако с помощью вышеуказанного пароля не удается расшифровать его до исходного... Я пробовал несколько других «5»-закрытых ключей и паролей, и то же самое происходит каждый раз.

К счастью, программа с открытым исходным кодом; к сожалению, проект кажется заброшенным несколько лет назад, и мои знания Python и шифрования недостаточно хороши, чтобы точно определить здесь ошибку, и надеюсь на некоторую помощь здесь :)

Что вы использовали, чтобы попытаться расшифровать зашифрованный закрытый ключ? Биппи?
Следует отметить, что изначально этот вопрос был задан на Reddit , и кто-то там даже разместил некоторый код.

Ответы (2)

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

Биппи определенно делает что-то не так.

Техническое объяснение

Зашифрованные ключи BIP38 состоят из 4 компонентов (в простейшем случае).

Первые две буквы ключа, 6P, являются маркером, указывающим, что это зашифрованный ключ BIP38.

Следующая буква, в данном случае Y, указывает некоторые атрибуты ключа. В этом случае он говорит: «Это простой ключ BIP38, и открытый ключ должен быть сжат».

Следующие пара букв (4 байта в шестнадцатеричном представлении) определяют «контрольную сумму». Мы вернемся к этому.

Остальная часть ключа - настоящее мясо. Это зашифрованный закрытый ключ. Это то, о чем мы заботимся больше всего.

Теперь вернемся к контрольной сумме. Контрольная сумма составляет 4 байта, полученных из биткойн-адреса, связанного с исходным закрытым ключом. Большое предостережение здесь заключается в том, что на самом деле есть два биткойн-адреса, связанные с простым закрытым ключом биткойн. Один основан на сжатом открытом ключе, а другой — на несжатом открытом ключе.

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

В этом случае Bippy выдал Y, что означает, что он использовал сжатый адрес. На твоих скринах даже об этом сказано. НО вот в чем проблема.

Когда мы проверяем контрольную сумму, которую выдает Биппи, она не совпадает со сжатым адресом. Но если мы используем несжатый адрес, он совпадает! Итак, Bippy говорит, что использует сжатый адрес, но на самом деле использует несжатый адрес.

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

Это не так уж и важно. Я обсужу это после нетехнического объяснения.

Нетехническое объяснение

Bippy шифрует правильно, но искажает кодировку зашифрованного ключа. Он говорит, что использовал сжатие открытого ключа, хотя на самом деле это не так. Это не так уж важно.

Решение

Итак, хорошая новость заключается в том, что, если не считать этой незначительной ошибки, Bippy правильно шифрует важные вещи. Должна быть возможность взять ваш «потерянный» ключ Bippy и восстановить из него закрытый ключ. Предполагая, что ваш пароль правильный.

Я должен быть в состоянии взломать свой сценарий, чтобы позаботиться об этом для вас. Я поработаю над этим и вернусь к вам. (Мне нужно добавить немного кодировки/декодирования Base58 в скрипт и сделать его немного удобным для вас;)). Код будет довольно простым кодом Python, поэтому вы можете бегло просмотреть его, чтобы убедиться, что он не делает ничего плохого.

Также был предоставлен скрипт восстановления Python, доступный на github — все кредиты fpgaminer

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

Мне не удалось заставить Bippy собраться на моей машине, поэтому я не смог протестировать. Но я использовал bitcoinpaperwallet.com , чтобы проверить указанные выше ключи, и когда я использую кодовую фразу testingOneTwoдля шифрования 5Ka1Bv4RpKayZygPhZbBcREejqeYwq2iSRzWPKsg49SPgVRTnpW, результатом является зашифрованный закрытый ключ 6PRLKpRdHRsMJcjuMYoE4wpKYUZEX11oB9LejdU8JuDLxynpDZFZWMNkDv.

Я не смог найти кого-то еще, кто сталкивался с этой проблемой. Я бы посоветовал попробовать расшифровать ваш закрытый ключ с помощью другого инструмента BIP38, такого как раздел «Проверить или расшифровать» на сайте bitcoinpaperwallet.com.

Если это не сработает, может помочь, если вы действительно шаг за шагом (со снимками экрана) объясните нам, как вы создаете зашифрованный закрытый ключ и как вы его расшифровываете.