useless_shenanigans part 2:
import hashlib
import time
import sympy
import ecdsa
import base58
import random
# Given constants
var_hash160dec = 1282931445580409769159733555522242769745473092945
min_range = 242965459430942930354
max_range = 276313659744993920795
addr = '1MVDYgVaSN6iKKEsbzRUAYFrYJadLYZvvZ'
def match(pk):
pub_key = ecdsa.SigningKey.from_string(
pk.to_bytes(32, 'big'), curve=ecdsa.SECP256k1
).verifying_key.to_string('compressed')
return h160 == hashlib.new(
'ripemd160', hashlib.sha256(pub_key).digest()).digest()
def gen_subproducts(factors, seen: set, idx=0, prod=1):
if idx == len(factors):
if prod > 1 and prod not in seen:
seen.add(prod)
if match(prod):
print(f'Key found: {hex(prod)}')
with open("foundkey.txt", "w") as f:
f.write(f"Private key: {hex(prod)}")
exit()
return
factor, exp = factors[idx]
for i in range(exp + 1):
if gen_subproducts(factors, seen, idx + 1, prod * (factor ** i)):
return True
def generate_n():
rand_divisor = random.randint(min_range, max_range)
return (var_hash160dec // rand_divisor) * rand_divisor
# Decode target H160
h160 = base58.b58decode_check(addr)[1:]
print(f'Target H160: {h160.hex():>040s}')
while True:
n = generate_n()
print(f'Trying n = {n}')
factors = list(sympy.factorint(n).items())
seen = set()
if gen_subproducts(factors, seen):
break