Wallet

如何在本地恢復 MyWallet 備份?

  • January 7, 2021

網站 blockchain.info 有一個線上錢包系統MyWallet,它創建帶有 .aes.json 副檔名的備份。雖然我知道它是一個使用我的密碼用 AES 加密的 json 文件,但我仍然對我應該如何解密它並將其載入到本地客戶端感到困惑。

我有 OSX 10.6,但為了便攜性,讓我們只談談命令行,希望至少在多個平台上保持相同。

我寫了一個小 Python 腳本,可以用來解密你加密的 MyWallet。它與MyWallet JavaScript的作用相同,只是在 Python 中。

編輯:下面的程式碼似乎已經過時,這是截至 2012 年 5 月的工作版本

將以下內容複製到文件中,使其可執行,然後執行它:

#!/usr/bin/env python
import base64, hashlib, hmac, json, sys, getpass
from Crypto.Cipher import AES
from Crypto.Hash import RIPEMD, SHA256

base58_chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'

def prompt(p):
   return getpass.getpass(p + ": ")

def decrypt(encrypted, password):
   encrypted = base64.b64decode(encrypted)
   iv, encrypted = encrypted[:16], encrypted[16:]
   length = len(encrypted)
   encrypted += ' ' * (15 - (length-1)%16)
   hash = (hmac.new(password, iv + "\x00\x00\x00\x01", hashlib.sha1).digest() +
           hmac.new(password, iv + "\x00\x00\x00\x02", hashlib.sha1).digest())[:32]
   clear = AES.new(hash, AES.MODE_OFB, iv).decrypt(encrypted)[:length]
   return clear

def base58_decode(v):
 value = 0; ret = ''
 for c in v: value = value*58 + base58_chars.find(c)
 for i in range(32):
     ret = "%c"%(value%256) + ret; value /= 256
 return ret

def base58_encode(v):
   value = 0; ret = ''
   for c in v: value = value*256 + ord(c)
   while value > 0:
       ret = base58_chars[value%58] + ret; value /= 58
   return ret

def to_sipa(s):
   version = 128 # or 239 for testnet
   key = chr(version) + base58_decode(s)
   return base58_encode(key + SHA256.new(SHA256.new(key).digest()).digest()[:4])

clear = decrypt(prompt("encrypted wallet"), prompt("password"))
obj = json.loads(clear)

if (obj.has_key('double_encryption')):
   print("wallet uses double encryption")
   password = obj['sharedKey'].encode('ascii') + prompt("2nd password")
   for key in obj['keys']: key['priv'] = decrypt(key['priv'], password)
for key in obj['keys']: key['priv_sipa'] = to_sipa(key['priv'])
print(json.dumps(obj, indent=4, sort_keys = True))

它將提示錢包備份和一兩個密碼,具體取決於錢包是單加密還是雙加密。粘貼錢包備份而不是將其保存到文件中。

您可能需要 Python 2.x。我一直無法找到 Python 3 的 pycrypto 包。顯然它將在即將發布的“精確”Ubuntu 版本中提供。

編輯:似乎備份格式已更改,因此此腳本不適用於最近的備份。

引用自:https://bitcoin.stackexchange.com/questions/3034