Wallet
如何在本地恢復 MyWallet 備份?
網站 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 版本中提供。
編輯:似乎備份格式已更改,因此此腳本不適用於最近的備份。