Какова кодировка этого байтового литерала?

#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'

5. docs.python.org/3/library/base64.html

Ответ №1:

В строках используется latin1 кодировка.

public_key Строка содержит 33-байтовый сжатый открытый ключ. Преобразование его в P2PKH адрес 19eBSVoQiDdJMuMAWToZB4qvGPii5s6Eie , который может показаться более знакомым.

Это last_seen_block_hash относится к блоку 00000000000001390f2b6aa6decfa971bf7a4c3bc26e9f120d2e1a734da053c6 , который находится на высоте 230939 с 2013 года.