Advertisement
joric

Bitcoin wallet.dat decryption and encryption

Jan 23rd, 2012
4,856
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.75 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. # Bitcoin wallet keys AES encryption / decryption (see http://github.com/joric/pywallet)
  4. # Uses pycrypto or libssl or libeay32.dll or aes.py from http://code.google.com/p/slowaes
  5.  
  6. crypter = None
  7.  
  8. try:
  9.     from Crypto.Cipher import AES
  10.     crypter = 'pycrypto'
  11. except:
  12.     pass
  13.  
  14. class Crypter_pycrypto( object ):
  15.     def SetKeyFromPassphrase(self, vKeyData, vSalt, nDerivIterations, nDerivationMethod):
  16.         data = vKeyData + vSalt
  17.         for i in range(nDerivIterations):
  18.             data = hashlib.sha512(data).digest()
  19.         self.SetKey(data[0:32])
  20.         self.SetIV(data[32:32+16])
  21.         return len(data)
  22.  
  23.     def SetKey(self, key):
  24.         self.chKey = key
  25.  
  26.     def SetIV(self, iv):
  27.         self.chIV = iv[0:16]
  28.  
  29.     def Encrypt(self, data):
  30.         return AES.new(self.chKey,AES.MODE_CBC,self.chIV).encrypt(data)[0:32]
  31.  
  32.     def Decrypt(self, data):
  33.         return AES.new(self.chKey,AES.MODE_CBC,self.chIV).decrypt(data)[0:32]
  34.  
  35. try:
  36.     if not crypter:
  37.         import ctypes
  38.         import ctypes.util
  39.         ssl = ctypes.cdll.LoadLibrary (ctypes.util.find_library ('ssl') or 'libeay32')
  40.         crypter = 'ssl'
  41. except:
  42.     pass
  43.  
  44. class Crypter_ssl(object):
  45.     def __init__(self):
  46.         self.chKey = ctypes.create_string_buffer (32)
  47.         self.chIV = ctypes.create_string_buffer (16)
  48.  
  49.     def SetKeyFromPassphrase(self, vKeyData, vSalt, nDerivIterations, nDerivationMethod):
  50.         strKeyData = ctypes.create_string_buffer (vKeyData)
  51.         chSalt = ctypes.create_string_buffer (vSalt)
  52.         return ssl.EVP_BytesToKey(ssl.EVP_aes_256_cbc(), ssl.EVP_sha512(), chSalt, strKeyData,
  53.             len(vKeyData), nDerivIterations, ctypes.byref(self.chKey), ctypes.byref(self.chIV))
  54.  
  55.     def SetKey(self, key):
  56.         self.chKey = ctypes.create_string_buffer(key)
  57.  
  58.     def SetIV(self, iv):
  59.         self.chIV = ctypes.create_string_buffer(iv)
  60.  
  61.     def Encrypt(self, data):
  62.         buf = ctypes.create_string_buffer(len(data) + 16)
  63.         written = ctypes.c_int(0)
  64.         final = ctypes.c_int(0)
  65.         ctx = ssl.EVP_CIPHER_CTX_new()
  66.         ssl.EVP_CIPHER_CTX_init(ctx)
  67.         ssl.EVP_EncryptInit_ex(ctx, ssl.EVP_aes_256_cbc(), None, self.chKey, self.chIV)
  68.         ssl.EVP_EncryptUpdate(ctx, buf, ctypes.byref(written), data, len(data))
  69.         output = buf.raw[:written.value]
  70.         ssl.EVP_EncryptFinal_ex(ctx, buf, ctypes.byref(final))
  71.         output += buf.raw[:final.value]
  72.         return output
  73.  
  74.     def Decrypt(self, data):
  75.         buf = ctypes.create_string_buffer(len(data) + 16)
  76.         written = ctypes.c_int(0)
  77.         final = ctypes.c_int(0)
  78.         ctx = ssl.EVP_CIPHER_CTX_new()
  79.         ssl.EVP_CIPHER_CTX_init(ctx)
  80.         ssl.EVP_DecryptInit_ex(ctx, ssl.EVP_aes_256_cbc(), None, self.chKey, self.chIV)
  81.         ssl.EVP_DecryptUpdate(ctx, buf, ctypes.byref(written), data, len(data))
  82.         output = buf.raw[:written.value]
  83.         ssl.EVP_DecryptFinal_ex(ctx, buf, ctypes.byref(final))
  84.         output += buf.raw[:final.value]
  85.         return output
  86.  
  87. try:
  88.     if not crypter:
  89.         from aes import *
  90.         crypter = 'pure'
  91. except:
  92.     pass
  93.  
  94. class Crypter_pure(object):
  95.     def __init__(self):
  96.         self.m = AESModeOfOperation()
  97.         self.cbc = self.m.modeOfOperation["CBC"]
  98.         self.sz = self.m.aes.keySize["SIZE_256"]
  99.  
  100.     def SetKeyFromPassphrase(self, vKeyData, vSalt, nDerivIterations, nDerivationMethod):
  101.         data = vKeyData + vSalt
  102.         for i in range(nDerivIterations):
  103.             data = hashlib.sha512(data).digest()
  104.         self.SetKey(data[0:32])
  105.         self.SetIV(data[32:32+16])
  106.         return len(data)
  107.  
  108.     def SetKey(self, key):
  109.         self.chKey = [ord(i) for i in key]
  110.  
  111.     def SetIV(self, iv):
  112.         self.chIV = [ord(i) for i in iv]
  113.  
  114.     def Encrypt(self, data):
  115.         mode, size, cypher = self.m.encrypt(data, self.cbc, self.chKey, self.sz, self.chIV)
  116.         return ''.join(map(chr, cypher))
  117.  
  118.     def Decrypt(self, data):
  119.         chData = [ord(i) for i in data]
  120.         return self.m.decrypt(chData, self.sz, self.cbc, self.chKey, self.sz, self.chIV)
  121.  
  122. import hashlib
  123.  
  124. def Hash(data):
  125.     return hashlib.sha256(hashlib.sha256(data).digest()).digest()
  126.  
  127. def main():
  128.  
  129.     #address
  130.     addr = '1AJ3vE2NNYW2Jzv3fLwyjKF1LYbZ65Ez64'
  131.     sec = '5JMhGPWc3pkdgPd9jqVZkRtEp3QB3Ze8ihv62TmmvzABmkNzBHw'
  132.     secret = '47510706d76bc74a5d57bdcffc68c9bbbc2d496bef87c91de7f616129ac62b5f'.decode('hex')
  133.     pubkey = '046211d9b7836892c8eef49c4d0cad7797815eff95108e1d30745c03577596c9c00d2cb1ab27c7f95c28771278f89b7ff40da49fe9b4ee834a3f6a88324db837d8'.decode('hex')
  134.     ckey = '0f8c75e4c6ab3c642dd06786af80ca3a93e391637d029f1da919dad77d3c8e477efd479814ddf4c459aeba042420868f'.decode('hex')
  135.  
  136.     #master key
  137.     crypted_key = '1e1d7ab34d8007f214eb528a1007c6721b9cd1d2c257adb25378ea8e47e3bdd22cfe93a8b6f18dcbe4206fe8c8178ff1'.decode('hex')
  138.     salt = '3f94e3c670b695dd'.decode('hex')
  139.     rounds = 47135
  140.     method = 0
  141.     password = '12345'
  142.  
  143.     global crypter
  144.  
  145.     if crypter == 'pycrypto':
  146.         crypter = Crypter_pycrypto()
  147.     elif crypter == 'ssl':
  148.         crypter = Crypter_ssl()
  149.         print "using ssl"
  150.     elif crypter == 'pure':
  151.         crypter = Crypter_pure()
  152.         print "using slowaes"
  153.     else:
  154.         print("Need pycrypto of libssl or libeay32.dll or http://code.google.com/p/slowaes")
  155.         exit(1)
  156.  
  157.     crypter.SetKeyFromPassphrase(password, salt, rounds, method)
  158.     masterkey = crypter.Decrypt(crypted_key)
  159.     crypter.SetKey(masterkey)
  160.     crypter.SetIV(Hash(pubkey))
  161.     d = crypter.Decrypt(ckey)
  162.     e = crypter.Encrypt(d)
  163.  
  164.     print "masterkey:", masterkey.encode('hex')
  165.     print 'c:', ckey.encode('hex')
  166.     print 'd:', d.encode('hex')
  167.     print 'e:', e.encode('hex')
  168.  
  169. if __name__ == '__main__':
  170.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement