#python #encoding #character-encoding #protocol-buffers #bitcoin
Вопрос:
Я использую скрипты BTCRecover python, чтобы попытаться сбросить содержимое старого (мультибитного классического) биткоин-кошелька. В частности, я пытаюсь восстановить закрытый ключ. Когда я запускаю скрипт, он идентифицирует кошелек как формат кошелька bitcoinj, который, по-видимому, сериализуется с использованием буферов протокола. Сценарий завершается с ошибкой "bitcoinj wallet is not encrypted"
. Все в порядке, я подозревал, что он не был зашифрован…Я просто хочу сбросить незашифрованные ключи.
Я изменил скрипт Python, чтобы распечатать кошелек после десериализации буфера протокола, и это вывод ( secret_bytes
опущен):
Starting btcrecover 1.10.0-Cryptoguide on Python 3.9.5 64-bit, 21-bit unicodes, 64-bit ints
network_identifier: "org.bitcoin.production"
last_seen_block_hash: "00000000000001917 j246336317251q277zL;302n23722r.32sM240S306"
key {
type: ORIGINAL
secret_bytes: "XXXXXXXX"
public_key: "03nJK303356121625027213366X374262E)1022215[%224~07K5346*372315231222"
creation_timestamp: 1365727360000
}
Похоже, что файл был десериализован правильно, но last_seen_block_hash
, public_key
, и secret_bytes
не имеет смысла (во всяком случае, для меня). Когда я печатаю просто public_key
, это результат:
b'x03nJKxc3xee1x8exa8x17x8bxf6Xxfcxb2E)x08x12x8d[%x94~x07K5xe6*xfaxcdx99x92'
Я пробовал работать .decode()
с байтовым литералом со многими различными кодировками (utf-8, utf-16, utf-16-be, utf-32, latin1, ascii и т. Д.). В каждом случае я либо получаю ошибку, либо тарабарщину.
Кто — нибудь знает, что это за кодировка? Или здесь есть более глубокая проблема?
Комментарии:
1.
In each case I either get an error or gibberish.
Чего именно вы ожидали? Необработанные двоичные данные-это не текст.2. @tkausl, верно, я надеялся преобразовать необработанные двоичные данные в строку. Я делаю это неправильно?
3. Какую кодировку вы хотите? Гекс? База 64? Выберите один из них и закодируйте.
4. Когда я бегу
>>> b'x03nJKxc3xee1x8exa8x17x8bxf6Xxfcxb2E)x08x12x8d[%x94~x07K5xe6*xfaxcdx99x92'.encode("utf-8")
, я получаю:Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'bytes' object has no attribute 'encode'
Ответ №1:
В строках используется latin1
кодировка.
public_key
Строка содержит 33-байтовый сжатый открытый ключ. Преобразование его в P2PKH
адрес 19eBSVoQiDdJMuMAWToZB4qvGPii5s6Eie
, который может показаться более знакомым.
Это last_seen_block_hash
относится к блоку 00000000000001390f2b6aa6decfa971bf7a4c3bc26e9f120d2e1a734da053c6
, который находится на высоте 230939
с 2013 года.