ForgotWalletPassword.com

Technical guide · cryptography in plain terms

Why some wallet passwords can be cracked and others can’t.

Every encrypted wallet does the same thing: turn your password into a key (with a key-derivation function, or KDF), then encrypt your private keys with that key. The KDF and its parameters decide how fast a computer can try passwords — and therefore whether your case is recoverable at all.

By Robbert Bink · ~5 min read · Published 6 August 2026 · Last reviewed: 14 August 2026

The one sentence that explains everything

Recovery is a race between your password’s “search space” (length × randomness × pattern) and the cracking speed the wallet’s KDF settings allow. Weak KDF + weak password = recoverable. Strong KDF + random password = impossible, for anyone, including the biggest service in the world.

The key-derivation players: PBKDF2, scrypt, Argon2 and SHA-512

Almost every wallet uses one of these key-derivation approaches:

  • PBKDF2 — repeatedly hashes the password with a salt. Costs are controlled by an iteration count (for Ethereum keystores the exact count is stored in the file’s kdfparams.c). Simple, but runs fast on GPUs.
  • Repeated SHA-512 (wallet.dat) — Bitcoin Core’s own scheme, modelled on OpenSSL’s EVP_BytesToKey: the password and salt are hashed with SHA-512 over and over, with a rounds count chosen when the wallet was encrypted. The original baseline was ~25,000 rounds; btcrecover’s reference wallets measure ~68k to ~267k rounds. It also runs fast on GPUs.
  • scrypt — memory-hard: it also forces a large block of memory, which makes GPUs and ASICs dramatically less efficient. BIP38 and Ethereum keystores use scrypt.
  • Argon2 — the modern memory-hard KDF, used by newer password managers (KeePass 2 can use it) and some wallets. It is designed to be hostile to GPUs and ASICs; a strong Argon2-protected password is effectively unrecoverable by brute force.

All the parameters below are the real defaults of each format. You can verify a wallet file’s own parameters by reading its header — the wallet identifier shows how.

Your passworde.g. Markus2019!
Key derivation (KDF)PBKDF2 · scrypt · iterated SHA-512
Encryption key128–256 bits
Encrypted wallet filewallet.dat · keystore · vault

Encryption: the KDF turns the password into the key that locks the file. Recovery: each candidate password goes through the same KDF and is checked against the locked file — so a wrong password always produces a key that doesn’t fit.

Version differences change the KDF

The same wallet name can hide very different encryption depending on the version — this is why “which version” matters before “which tool”:

WalletVersion / eraKey derivationWhat it means for recovery
Bitcoin Core wallet.datLegacy BDB vs SQLite-backed descriptor wallets — 0.21 introduced descriptor/SQLite; legacy BDB wallets remained commonSame iterated SHA-512; rounds are machine-tuned at encryption timeOld files often have fewer rounds — but only because the encrypting machine was slower, not because of the format.
Electrum1.x–2.7 vs 2.8+Double SHA-256 (old) vs PBKDF2-HMAC-SHA512 1,024 iterations + ECIES/BIE1 key check (2.8+)Older files can test dramatically faster; the hash salt type picks the hashcat mode (16600 vs 21700/21800).
MultiBit Classic.key backup vs .wallet file3×MD5 (.key) vs scrypt N=16,384 (.wallet)The .key backup is ~1,000× faster per guess — the single biggest version trap in legacy recovery.
Ethereum keystore v3scrypt vs PBKDF2 variantscrypt (commonly N=262,144 in geth) or PBKDF2-HMAC-SHA256 (iteration count stored in kdfparams.c)Both are slow; the JSON header names the KDF (mode 15600 vs 15700) — read the actual parameters before estimating speed.
MetaMaskextension vs mobilePBKDF2-SHA256 10,000 (classic); dynamic iterations in newer vaultsDifferent vault layout and hashcat modes (26600 vs 31900; newer vaults 26610, with 26620 only in newer/development builds) — the guide covers both.

Version claims above are verified against the wallet sources and the benchmark suite; see the master list for the per-wallet database.

What each wallet format actually does

FormatCipherKey derivationCost parameters
wallet.dat AES-256-CBC iterated SHA-512 (EVP_BytesToKey) dynamic — reference wallets measure 67,908–267,488 rounds; original baseline ~25,000
Electrum 1.x–2.7 Legacy keystore double-SHA-256 family (weaker) fast per guess — hashcat 16600 depending on salt type
Electrum 2.8+ Encrypted keystore / ECIES-BIE1 PBKDF2-HMAC-SHA512 + ECC measured at 1,024 iterations + ECC — hashcat 21700/21800 depending on salt type
Ethereum keystore JSON AES-128-CTR scrypt or PBKDF2-HMAC-SHA256 scrypt N=262,144 (geth common) · PBKDF2 c stored in kdfparams
BIP38 private keys AES-256 (per BIP38 spec) scrypt N=16,384 r=8 p=8

Numbers matter: a low-round wallet.dat (~68k rounds, typical of old machines) runs about 4× faster per guess than a high-round one (~267k) — the count is machine-tuned, not a BDB-vs-SQLite rule. A BIP38 key (scrypt, heavy memory) is far slower per guess than a wallet with GPU-friendly key stretching — a single modern CPU checks only tens of BIP38 guesses per second, versus hundreds to low thousands of wallet.dat guesses.

What “crack speed” really means (measured)

These are measured figures from the btcrecover benchmark suite (Ryzen 9 9950X CPU, RTX 5090 GPU, 2026) — actual guesses per second on reference hardware, not marketing numbers:

TargetGuesses/sec (CPU)Guesses/sec (GPU)Consequence
wallet.dat, low-round (~68k)47211,950the classic success story — fast to search with clues
wallet.dat, high-round (~267k)1223,210~4× slower per guess at 4× the rounds
Ethereum keystore (scrypt)96memory-hard: GPU barely helps
BIP38 (scrypt 16k)72memory-hard: GPU barely helps
MetaMask vault5,1605,590fast per guess — but see the MetaMask guide

Low-round wallet.dat rows are extrapolated from the 67,908-iteration measurement and marked as estimates; all other rows are published measurements. Want your own case modelled? Use the interactive strength calculator, which runs these same rates.

Reading the verdict from these numbers

  • 8 characters of real randomness (say, a password-manager style string): effectively impossible for anyone, regardless of KDF.
  • 8–12 characters you chose yourself (with a word, a date, a pattern): in principle recoverable if you can reconstruct the pattern — this is where memory reconstruction becomes the whole game.
  • Short passwords are not automatically easy to brute-force. Feasibility depends on both the candidate space and the wallet’s per-guess cost — memory-hard formats such as BIP38 can make even short random passwords expensive to exhaust.
  • A PIN (4–8 digits): trivially fast to brute-force if the encrypted file is in your hands — which is why hardware wallets wipe after a few wrong tries instead.

The full framework — including honest limits — is on when recovery is possible.

What the tools actually crack: the hash line

Cracking tools don’t attack the wallet file itself — they work on a small hash line extracted from it. That one line carries three things: the salt, the KDF parameters (which algorithm and how many iterations), and a verification value that only matches when the password is right. A wallet.dat hash line looks like $bitcoin$96$…; an Ethereum keystore is converted with ethereum2john.py, which produces the $ethereum$p*…/$ethereum$s*… hash line.

Two things follow from this. First, the hash line is not the wallet: it is not normally a plaintext private key, but for some formats it contains sensitive encrypted wallet material — treat it as sensitive as the wallet file itself. That is why extraction scripts like bitcoin2john.py or wallet2hashcat.py should run on a copy, and why recovery always happens offline. Second, the line’s format decides your tool: hashcat needs the converted line plus a mode number (11300, 12700, 15600…), John uses the *2john scripts, and btcrecover reads most wallets directly and does the extraction internally.

What this means for your case

  • Do not delete the wallet file. Its KDF parameters and salt are the only reason cracking is possible at all.
  • Gather memory clues, not guesses. A wordlist built from your patterns and habits beats blind brute force by orders of magnitude.
  • Use offline tools on a copy. See offline recovery tools for btcrecover and hashcat — and why you should never upload the file to a public checker or unknown website.
  • If the math says no, believe the math. A random 16-character password on a modern keystore is beyond every computer on Earth combined. No tool can change that.

Sources & references

  1. Bitcoin Wiki — wallet encryption
  2. hashcat — example hashes (wallet formats & modes)
Missing something, or spot an error? Tell us — every correction is checked and applied.
Was this guide helpful?

Keep going — it’s all free

Not sure what you lost or what’s possible?

Take the quick diagnosis for a first verdict — it stops early when the answer is already clear — then work the search checklist. Everything here is informative, runs offline, and is free to use.