BTCRECOVER / TESTED LABORATORY

BTCRecover candidate lab: 10 reproducible exercises

Download synthetic tokenlists and passwordlists, inspect expected candidates, and reproduce ten checks against a pinned BTCRecover revision.

What we tested

Ten small candidate-generation exercises were run with BTCRecover using invented inputs. All ten produced exactly the expected candidate sets. No wallet file, real password, seed phrase or private key was used. These results validate these examples only; they are not wallet-recovery, GPU or performance benchmarks.

10 / 10 candidate-set checks passedPython 3.11.15 Windows test environment19 Sep 2026 test date

Pinned upstream commit: 1457088acf17630eb12a5b53989982ac34e55f2a. The tool reported 1.13.0-Cryptoguide. Optional native secp256k1 libraries were absent; that warning is not a wallet-speed measurement.

Download and reproduce

Download all practice files ↓

Install the maintained BTCRecover project in an appropriate local environment. For matching revision results, use the commit linked above. Extract the practice ZIP, then copy the ten input .txt files into your BTCRecover directory and run the commands below from there. Files ending in -expected.txt contain sorted expected candidates, not input rules.

The ZIP also includes verify.py and results.json. To run all checks automatically from the extracted candidate-lab folder, pass the path to your BTCRecover checkout:

Terminal
python verify.py "PATH/TO/btcrecover"

The verification script runs only --listpass, checks the checkout commit, and compares candidate sets rather than their order. It stops if the pinned tool’s output format changes. BTCRecover may print warning and file-loading messages around the candidate stream; those diagnostic messages are not candidates.

Required lines and fixed ends

Three required lines; two year choices; fixed beginning and end. Two candidates are included.

anchored.txt
+ ^River
+ 2021 2022
+ !$
Terminal
python btcrecover.py --listpass --tokenlist anchored.txt

Observed: 2 candidates; exact expected set matched.

Expected set (sorted)
River2021!
River2022!

Input file · Full expected set

An optional suffix

Only the suffix becomes optional. Each of the two years appears both with and without the exclamation mark.

optional.txt
+ ^River
+ 2021 2022
!$
Terminal
python btcrecover.py --listpass --tokenlist optional.txt

Observed: 4 candidates; exact expected set matched.

Expected set (sorted)
River2021
River2021!
River2022
River2022!

Input file · Full expected set

Removing the ordering anchors

All lines remain required, but the three pieces can occupy six different orders for each year choice.

order.txt
+ River
+ 2021 2022
+ !
Terminal
python btcrecover.py --listpass --tokenlist order.txt

Observed: 12 candidates; exact expected set matched.

Expected set (sorted)
!2021River
!2022River
!River2021
!River2022
2021!River
2021River!
2022!River
2022River!
River!2021
River!2022
River2021!
River2022!

Input file · Full expected set

One unknown decimal digit

One decimal position provides ten choices. The letter prefix is fixed.

digit.txt
+ ^River
+ %d$
Terminal
python btcrecover.py --listpass --tokenlist digit.txt

Observed: 10 candidates; exact expected set matched.

Expected set (sorted)
River0
River1
River2
River3
River4
River5
River6
River7
River8
River9

Input file · Full expected set

Two unknown decimal digits

Two decimal positions provide 10 × 10 choices, including leading zeros.

two-digits.txt
+ ^River
+ %2d$
Terminal
python btcrecover.py --listpass --tokenlist two-digits.txt

Observed: 100 candidates; exact expected set matched.

Expected set (sorted) — abbreviated here
River00
River01
River02
River03
River04
…
River99

Input file · Full expected set

A restricted character set

Restricting the character set to 2 or 7 leaves only two choices.

narrow.txt
+ ^River
+ %[27]$
Terminal
python btcrecover.py --listpass --tokenlist narrow.txt

Observed: 2 candidates; exact expected set matched.

Expected set (sorted)
River2
River7

Input file · Full expected set

A literal space within one token

The %s wildcard inserts a space within one required token. The token has no beginning or ending anchor.

space.txt
+ River%sStone
Terminal
python btcrecover.py --listpass --tokenlist space.txt

Observed: 1 candidates; exact expected set matched.

Expected set (sorted)
River Stone

Input file · Full expected set

Whole passwords preserve spaces

Each passwordlist line is a complete guess; the internal space stays part of the first guess.

literal.txt
River Stone!
River2022!
Terminal
python btcrecover.py --listpass --passwordlist literal.txt

Observed: 2 candidates; exact expected set matched.

Expected set (sorted)
River Stone!
River2022!

Input file · Full expected set

At most one letter-case change

Each original remains included, plus five variants with exactly one alphabetic character’s case flipped.

case-typo.txt
River2021!
River2022!
Terminal
python btcrecover.py --listpass --passwordlist case-typo.txt --typos 1 --typos-case

Observed: 12 candidates; exact expected set matched.

Expected set (sorted)
RIver2021!
RIver2022!
RiVer2021!
RiVer2022!
RivEr2021!
RivEr2022!
RiveR2021!
RiveR2022!
River2021!
River2022!
river2021!
river2022!

Input file · Full expected set

A token-count limit excludes combinations

Three optional one-token lines are restricted to exactly one token per candidate. Multi-token combinations are excluded.

token-limit.txt
River
Stone
2022
Terminal
python btcrecover.py --listpass --tokenlist token-limit.txt --min-tokens 1 --max-tokens 1

Observed: 3 candidates; exact expected set matched.

Expected set (sorted)
2022
River
Stone

Input file · Full expected set

Interpret the results carefully

A larger candidate count is not automatically a better search. The optional-suffix fixture covers more possibilities because it relaxes a specific assumption. The unanchored fixture covers more orders, but that matters only if order is actually uncertain. None of these results estimates the probability that an unknown wallet password is among the candidates.

The downloadable results manifest records input hashes and sorted candidate-set hashes. Candidate hashes use UTF-8, LF line endings and a final newline. These hashes identify reproducible test artifacts; they are not an independent security audit.

Sources and evidence

How this material was prepared and tested. Upstream instructions can change; check your installed revision.

WALLET RECOVERY HELP · KEYCHAINX

Stuck? Talk to KeychainX.

Tell us the wallet application, the type of backup you have, and where you are stuck.

For the first message, leave out seed phrases, private keys and passwords.

Email KeychainX for recovery helpVisit keychainx.io ↗