【问题标题】:What is the encoding of this byte literal?这个字节文字的编码是什么?
【发布时间】:2021-06-03 20:18:13
【问题描述】:

我正在使用 BTCRecover python 脚本尝试转储旧(MultiBit Classic)比特币钱包的内容。具体来说,我正在尝试恢复私钥。当我运行脚本时,它会将钱包识别为 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: "\000\000\000\000\000\000\0019\017+j\246\336\317\251q\277zL;\302n\237\022\r.\032sM\240S\306"
key {
  type: ORIGINAL
  secret_bytes: "XXXXXXXX"
  public_key: "\003\nJK\303\3561\216\250\027\213\366X\374\262E)\010\022\215[%\224~\007K5\346*\372\315\231\222"
  creation_timestamp: 1365727360000
}

文件似乎已正确反序列化,但last_seen_block_hashpublic_keysecret_bytes 没有意义(无论如何对我来说)。当我只打印public_key 时,结果如下:

b'\x03\nJK\xc3\xee1\x8e\xa8\x17\x8b\xf6X\xfc\xb2E)\x08\x12\x8d[%\x94~\x07K5\xe6*\xfa\xcd\x99\x92'

我尝试在具有许多不同编码(utf-8、utf-16、utf-16-be、utf-32、latin1、ascii 等)的字节文字上运行 .decode()。在每种情况下,我都会收到错误或乱码。

有人知道这是什么编码吗?还是这里有更深层次的问题?

【问题讨论】:

  • In each case I either get an error or gibberish. 你到底期待什么?原始二进制数据不是文本。
  • @tkausl,对,我希望将原始二进制数据转换为字符串。我是不是搞错了?
  • 你想要什么编码?十六进制? Base64?选择一个并编码。
  • 当我运行>>> b'\x03\nJK\xc3\xee1\x8e\xa8\x17\x8b\xf6X\xfc\xb2E)\x08\x12\x8d[%\x94~\x07K5\xe6*\xfa\xcd\x99\x92'.encode("utf-8") 时,我得到:Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'bytes' object has no attribute 'encode'

标签: python encoding character-encoding protocol-buffers bitcoin


【解决方案1】:

字符串使用latin1 编码。

public_key 字符串包含一个 33 字节的压缩公钥。 将其转换为P2PKH 地址会得到19eBSVoQiDdJMuMAWToZB4qvGPii5s6Eie,这可能看起来更熟悉。

last_seen_block_hash 指的是块 00000000000001390f2b6aa6decfa971bf7a4c3bc26e9f120d2e1a734da053c6,从 2013 年起高度为 230939

【讨论】:

    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2017-06-14
    相关资源
    最近更新 更多