Guest User

Python script to brute force a brainwallet for an address

a guest
Jun 10th, 2015
3,434
0
Never
12
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.70 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # Joric/bitcoin-dev, june 2012, public domain
  3.  
  4. # Modified.  Added looping code and test to find brain wallets
  5. import hashlib
  6. import ctypes
  7. import ctypes.util
  8. import sys
  9.  
  10.  
  11. # Set the target output address to determine the brain wallet for
  12. target = "1F88jP4RM8cVhHTHxRGT4xpPmymqfy95tK"; # Brainwallet 'aaaaaabc' for testing.  
  13.  
  14. # The items to scan through to generate the brainwallet.  You can also use word lists like ['cat', 'dog', 'apple']
  15. alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"  
  16. #alphabet = ['cat', 'dog', 'apple']
  17.  
  18.    
  19. ssl = ctypes.cdll.LoadLibrary (ctypes.util.find_library ('ssl') or 'libeay32')
  20.  
  21. def check_result (val, func, args):
  22.     if val == 0: raise ValueError
  23.     else: return ctypes.c_void_p (val)
  24.  
  25. ssl.EC_KEY_new_by_curve_name.restype = ctypes.c_void_p
  26. ssl.EC_KEY_new_by_curve_name.errcheck = check_result
  27.  
  28. class KEY:
  29.     def __init__(self):
  30.         NID_secp256k1 = 714
  31.         self.k = ssl.EC_KEY_new_by_curve_name(NID_secp256k1)
  32.         self.compressed = False
  33.         self.POINT_CONVERSION_COMPRESSED = 2
  34.         self.POINT_CONVERSION_UNCOMPRESSED = 4
  35.  
  36.     def __del__(self):
  37.         if ssl:
  38.             ssl.EC_KEY_free(self.k)
  39.         self.k = None
  40.  
  41.     def generate(self, secret=None):
  42.         if secret:
  43.             self.prikey = secret
  44.             priv_key = ssl.BN_bin2bn(secret, 32, ssl.BN_new())
  45.             group = ssl.EC_KEY_get0_group(self.k)
  46.             pub_key = ssl.EC_POINT_new(group)
  47.             ctx = ssl.BN_CTX_new()
  48.             ssl.EC_POINT_mul(group, pub_key, priv_key, None, None, ctx)
  49.             ssl.EC_KEY_set_private_key(self.k, priv_key)
  50.             ssl.EC_KEY_set_public_key(self.k, pub_key)
  51.             ssl.EC_POINT_free(pub_key)
  52.             ssl.BN_CTX_free(ctx)
  53.             return self.k
  54.         else:
  55.             return ssl.EC_KEY_generate_key(self.k)
  56.  
  57.     def get_pubkey(self):
  58.         size = ssl.i2o_ECPublicKey(self.k, 0)
  59.         mb = ctypes.create_string_buffer(size)
  60.         ssl.i2o_ECPublicKey(self.k, ctypes.byref(ctypes.pointer(mb)))
  61.         return mb.raw
  62.  
  63.     def get_secret(self):
  64.         bn = ssl.EC_KEY_get0_private_key(self.k);
  65.         bytes = (ssl.BN_num_bits(bn) + 7) / 8
  66.         mb = ctypes.create_string_buffer(bytes)
  67.         n = ssl.BN_bn2bin(bn, mb);
  68.         return mb.raw.rjust(32, chr(0))
  69.  
  70.     def set_compressed(self, compressed):
  71.         self.compressed = compressed
  72.         if compressed:
  73.             form = self.POINT_CONVERSION_COMPRESSED
  74.         else:
  75.             form = self.POINT_CONVERSION_UNCOMPRESSED
  76.         ssl.EC_KEY_set_conv_form(self.k, form)
  77.  
  78. def dhash(s):
  79.     return hashlib.sha256(hashlib.sha256(s).digest()).digest()
  80.  
  81. def rhash(s):
  82.     h1 = hashlib.new('ripemd160')
  83.     h1.update(hashlib.sha256(s).digest())
  84.     return h1.digest()
  85.  
  86. b58_digits = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
  87.  
  88. def base58_encode(n):
  89.     l = []
  90.     while n > 0:
  91.         n, r = divmod(n, 58)
  92.         l.insert(0,(b58_digits[r]))
  93.     return ''.join(l)
  94.  
  95. def base58_decode(s):
  96.     n = 0
  97.     for ch in s:
  98.         n *= 58
  99.         digit = b58_digits.index(ch)
  100.         n += digit
  101.     return n
  102.  
  103. def base58_encode_padded(s):
  104.     res = base58_encode(int('0x' + s.encode('hex'), 16))
  105.     pad = 0
  106.     for c in s:
  107.         if c == chr(0):
  108.             pad += 1
  109.         else:
  110.             break
  111.     return b58_digits[0] * pad + res
  112.  
  113. def base58_decode_padded(s):
  114.     pad = 0
  115.     for c in s:
  116.         if c == b58_digits[0]:
  117.             pad += 1
  118.         else:
  119.             break
  120.     h = '%x' % base58_decode(s)
  121.     if len(h) % 2:
  122.         h = '0' + h
  123.     res = h.decode('hex')
  124.     return chr(0) * pad + res
  125.  
  126. def base58_check_encode(s, version=0):
  127.     vs = chr(version) + s
  128.     check = dhash(vs)[:4]
  129.     return base58_encode_padded(vs + check)
  130.  
  131. def base58_check_decode(s, version=0):
  132.     k = base58_decode_padded(s)
  133.     v0, data, check0 = k[0], k[1:-4], k[-4:]
  134.     check1 = dhash(v0 + data)[:4]
  135.     if check0 != check1:
  136.         raise BaseException('checksum error')
  137.     if version != ord(v0):
  138.         raise BaseException('version mismatch')
  139.     return data
  140.  
  141. def gen_eckey(passphrase=None, secret=None, pkey=None, compressed=False, rounds=1, version=0):
  142.     k = KEY()
  143.     if passphrase:
  144.         secret = passphrase.encode('utf8')
  145.         for i in xrange(rounds):
  146.             secret = hashlib.sha256(secret).digest()
  147.     if pkey:
  148.         secret = base58_check_decode(pkey, 128+version)
  149.         compressed = len(secret) == 33
  150.         secret = secret[0:32]
  151.     k.generate(secret)
  152.     k.set_compressed(compressed)
  153.     return k
  154.  
  155. def get_addr(k,version=0):
  156.     pubkey = k.get_pubkey()
  157.     secret = k.get_secret()
  158.     hash160 = rhash(pubkey)
  159.     addr = base58_check_encode(hash160,version)
  160.     payload = secret
  161.     if k.compressed:
  162.         payload = secret + chr(1)
  163.     pkey = base58_check_encode(payload, 128+version)
  164.     return addr, pkey
  165.  
  166. def reencode(pkey,version=0):
  167.     payload = base58_check_decode(pkey,128+version)
  168.     secret = payload[:-1]
  169.     payload = secret + chr(1)
  170.     pkey = base58_check_encode(payload, 128+version)
  171.     print get_addr(gen_eckey(pkey))
  172.  
  173. def test(otherversion):
  174.     strings = [ alphabet, alphabet, alphabet ]
  175.     for a in alphabet:
  176.         for b in alphabet:
  177.             for c in alphabet:
  178.                 for d in alphabet:
  179.                     for e in alphabet:
  180.                         for f in alphabet:
  181.                             for g in alphabet:
  182.                                 for h in alphabet:
  183.                                     all = a + b + c + d + e + f + g + h
  184.                                     address = get_addr(gen_eckey(passphrase=all))
  185.                                     if address[0] == target:
  186.                                         print "Found for key:"+all
  187.                                         print "Keys:",address
  188.                                         sys.exit()
  189.                                         raise SystemExit
  190.                                    
  191.                                     print all
  192.     # random compressed
  193.     #print get_addr(gen_eckey(compressed=True,version=otherversion),version=otherversion)
  194.     # uncomment these to create addresses via a different method
  195.     # random uncompressed
  196.     #print get_addr(gen_eckey())
  197.     # by secret
  198.     #print get_addr(gen_eckey(secret=('%064x' % 0xdeadbabe).decode('hex')))
  199.     # by passphrase
  200.     #print get_addr(gen_eckey(passphrase='Satoshi Nakamoto'))
  201.     # by private key
  202.     #print get_addr(gen_eckey(pkey='5K1HkbYffstTZDuV4riUWMbAMkQh57b8798uoy9pXYUDYeUHe7F'))
  203.     #print get_addr(gen_eckey(pkey='L3ATL5R9Exe1ubuAnHVgNgTKZEUKkDvWYAWkLUCyyvzzxRjtgyFe'))
  204.  
  205.     # uncomment this to reencode the private keys created by early versions of this script
  206.     #reencode(sys.argv[1])
  207.  
  208. if __name__ == '__main__':
  209.     import optparse
  210.     parser = optparse.OptionParser(usage="%prog [options]")
  211.     parser.add_option("--otherversion", dest="otherversion", default=0,
  212.                     help="Generate address with different version number")
  213.     (options, args) = parser.parse_args()
  214.  
  215.  
  216.  
  217.     test(int(options.otherversion))
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
Add Comment
Please, Sign In to add comment