
What Is This?
In 2015, someone created the "Bitcoin Puzzle" — 160 Bitcoin addresses, each holding a little more BTC than the last. The first ones got cracked quickly. Then more. Today, 69 puzzles have been solved, and Puzzle #71 still holds 7.1 BTC (over $580,000).
This repository is my attempt to find the key. I didn't succeed — but I learned things most people never discover about how wallets work under the hood.
Everything here runs on a standard laptop. No GPU farms. No rented cloud servers. Just an i5 with 8 GB of RAM and a lot of patience.
The Puzzle, Explained Simply
The creator left one big clue:
"It is just consecutive keys from a deterministic wallet (masked with leading 000…0001 to set difficulty)."
What does that mean?
Imagine you have a wallet that spits out private keys one after another — like a really fancy random number generator that always gives the same sequence if you start it with the same seed.
For each puzzle number n, the creator took the n-th key from that wallet, then applied a simple mask: set the first (n‑1) bits to 000...0001, and keep the lower bits from the wallet key. This made early puzzles easy (few bits to guess) and later puzzles hard (many bits).
The formula is: Private Key = 2^(n-1) + (wallet_key_n & (2^(n-1) – 1))
| Puzzle | Range Start | Private Key (example) |
|---|---|---|
| #1 | 1 (1 bit) |
1 |
| #5 | 16 (5 bits) |
21 |
| #33 | 2^32 (33 bits) |
7137437912 |
| #71 | 2^70 (71 bits) |
??? |
The wallet key is the same for all puzzles — only the mask changes. So if I could find the master seed that generates the wallet, I would get every remaining key at once.
How I Tried to Find the Seed
I took the 69 already-solved puzzles and used them as a "truth test." If I guessed a seed (or passphrase, or random generator setting), I could generate all 69 keys and check: do they match the known ones? If yes, I found the seed.
This turns an impossible search (2^70 possible keys for puzzle #71) into "just" finding the seed.
The Tools I Built
link to repo ; https://github.com/mlartab/bitcoin-puzzle-systematic-analysis
Here is every tool in this repo, and what it does.
| Tool | Language | What It Does |
|---|---|---|
seed_hunt_all.py |
Python | Tests passphrases against BIP32 wallets (4 different derivation paths) |
seed_hunt_sha256.py |
Python | Tests passphrases against old-school SHA256 brainwallets |
z3_crack.py |
Python | Uses Z3 SAT solver to try to reverse-engineer the Mersenne Twister state |
gen_observed.py |
Python | Generates partial output lists for the untwister state-recovery tool |
mt_brute.cpp |
C++ | Scans ALL 4 billion possible 32-bit seeds for Python's random module |
rand_brute.cpp |
C++ | Scans ALL 4 billion possible seeds for C's rand() |
java_crack.cpp |
C++ | Tries to recover Java's Random seed using modular arithmetic (no brute force!) |
scanner.py |
Python | A custom range scanner I built to sweep through key ranges |
A real story of one laptop, some curiosity, and a deep dive into how Bitcoin private keys are born
byu/Gain-Fluffy inBitcoin
Posted by Gain-Fluffy