Skip to main content
Skip to main content
Keys & Seeds

Generate Your Own Bitcoin Seed Phrase with Dice

Most wallets generate seed phrases for you, but that requires trust: you are trusting that the wallet's random number generator is actually random, hasn't been backdoored, and wasn't compromised somewhere in the supply chain. This guide shows you how to generate a 24-word BIP39 seed phrase from dice rolls, entirely offline, with randomness you can verify yourself.

Fund Loss Warning

Mistakes in seed generation can result in permanent, irreversible loss of all Bitcoin.

Common fatal errors:

  • Using a compromised computer — If your "air-gapped" machine was ever connected to the internet, it may have malware that captures your seed.
  • Insufficient randomness — Using weak entropy (like mental "random" numbers) makes your seed guessable.
  • Transcription errors — A single wrong word means a completely different (empty) wallet.
  • Improper backup storage — Paper burns, fades, and water-damages easily.

There is no recovery. No customer support. No password reset. If you lose access to your seed or generate it insecurely, your Bitcoin is gone forever.

Do not proceed unless you fully understand these risks.

What You'll Do

In this guide you will:

  • Generate true randomness using physical dice rolls
  • Convert binary entropy to BIP39 seed words
  • Calculate and verify your checksum
  • Securely back up your seed phrase on metal

Time required: 2–4 hours Difficulty: Intermediate Estimated cost: $10–30 (casino dice) + $20–50 (metal backup plate) Requirements: Air-gapped computer or Raspberry Pi Zero, casino dice

Prerequisites

Before starting, make sure you understand:

Why Generate Your Own Seed?

When a wallet generates a seed phrase for you, you are trusting three things at once:

RiskDescription
Weak randomnessSoftware may not use proper entropy
BackdoorsWallets could have security flaws or intentional vulnerabilities
Supply chain attacksPre-generated seeds have been found in compromised hardware wallets

By generating your own seed with physical dice, you:

  • Verify the randomness yourself — no trust required
  • Eliminate software vulnerabilities — dice can't be hacked
  • Understand what you're protecting — knowledge is security

Who Is This Guide For?

SituationRecommendation
Learning with small amountsNot recommended — Use a hardware wallet's built-in seed generation
Moderate holdings, want to learnMaybe — Practice on testnet first and understand the risks
Significant holdings, high security needsYes — Verifiable entropy is worth the effort
Don't trust hardware wallet RNGYes — This eliminates that trust requirement
Not comfortable with technical processesNo — A mistake here loses everything

Most people should use their hardware wallet's seed generation. This guide is for users who want verifiable randomness and understand the additional risks of a manual process.

Critical Environment Requirements

Before You Begin

Your seed generation environment must meet ALL of these requirements:

  • Air-gapped computer — A machine that has NEVER connected to the internet and NEVER will
  • Fresh operating system — Booted from a verified, read-only medium (like a Tails USB)
  • No wireless hardware — Wi-Fi and Bluetooth physically removed or disabled in BIOS
  • No cameras or microphones — Cover or disconnect them
  • Private location — No one can see your screen or your seed words
  • No electronic devices nearby — Phones, smartwatches, etc. can capture keystrokes or screens

If any of these are not met, your seed may be compromised before you even finish generating it.

What You'll Need

Casino dice

Casino-grade dice are ideal for generating true randomness. You don't strictly need expensive dice — any standard six-sided dice will work, even with small biases, as long as you use several at a time. Using 5–10 dice per roll speeds the process up dramatically.

Dice

Air-gapped computer

An air-gapped computer is a device that has never been connected to the internet and is physically incapable of doing so. This is crucial for securely generating and handling your private key. Suitable options:

  • Raspberry Pi Zero 1.3 — Highly recommended because it lacks built-in Wi-Fi and Bluetooth, reducing attack surfaces. Harder to find these days, but worth the hunt.
  • Laptop or PC — A machine with the Wi-Fi and Bluetooth modules physically removed and the Ethernet port permanently disabled. Even if stolen, an attacker cannot put it back online to extract the private key.

Raspberry Pi Zero

Paper and pen

Used only as a temporary record of the process. Must be destroyed (burned) after you have transferred the seed phrase to a durable medium.

Metal seed storage

Once your seed phrase is created, it should be permanently stored on a fireproof, waterproof, tamper-resistant metal plate. This protects your seed from fire, water, and the slow degradation of paper over time.

Metal seed backup

Step 1: Roll Dice for Entropy

Our goal is to generate a large, truly random binary number by rolling the dice.

Assign binary values

Before rolling, decide how each roll is converted into a binary value. This mapping gives an equal probability of 0 or 1:

  • If the die lands on 1, 2, or 3, it is assigned a value of 0.
  • If the die lands on 4, 5, or 6, it is assigned a value of 1.

Roll and record

Roll the dice and record the results from left to right. Consistency is key — always read in the same order. If it is unclear which die is further to the left, re-roll those dice.

warning

It is crucial that the data is truly random. If it lacks randomness, there is a risk that someone else could reproduce the exact same sequence. This would allow them to regenerate your private key and potentially access all of your Bitcoin.

Format the output

Create 23 rows of 11 binary digits each, plus a final 24th row containing only 3 digits (the remaining 8 bits of the 24th row will be filled in later by the checksum).

  • For readability, separate each row into three groups: 4-4-3 (e.g., 1011 1000 101).
  • Keep the numbers aligned in columns and leave space between rows for manual calculations later.
#
1)10111000101
2)11011100100
3)10111100111
4)01101000101
5)11111010101
6)11111001000
7)00100000101
8)10111000101
9)10101010100
10)10111011101
11)11111000101
12)01111001110
13)10111010100
14)10011000111
15)10111000111
16)11111011101
17)00011000101
18)10101000110
19)11111010100
20)11111000100
21)00101000101
22)10111010101
23)10011000101
24)001

You have now generated 256 bits of entropy (23 full rows of 11 bits + 3 bits on the 24th row). Each 11-bit segment will be converted into one BIP39 seed word later.

Dividing 256 bits by 11 gives 23.27 words, which is not a whole number. To get a clean 24-word seed, we need eight more bits — bringing the total to 264 bits (24 × 11). Those final 8 bits come from the checksum calculated in Step 3.

Step 2: Convert Binary to Decimal

Each of the 24 rows of 11 binary digits must be converted to a decimal number manually on your air-gapped computer or by using paper and pen. Never use an online tool — copying your binary string into a web calculator could expose your seed.

With 11 binary digits, the smallest number is 0 (00000000000) and the largest is 2047 (11111111111). Each decimal result will therefore fall in the range 0–2047.

You can convert in either of two ways.

Method A — air-gapped shell

For example, to convert the first line, 10111000101, type:

echo $((2#10111000101))

This will output 1477. Replace the binary digits in the command with each 11-digit row and run the calculation.

Method B — paper and pen

At the top-left of your page, write the powers of two from left to right, aligned with the binary digits below: 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1.

For each binary digit in the row:

  • If the digit is 1, write down the power of two above it.
  • If the digit is 0, skip it.

Add up all the numbers you wrote down. The sum is the decimal equivalent of the binary number.

For example, to convert the first row, 10111000101:

1024 + 0 + 256 + 128 + 64 + 0 + 0 + 0 + 4 + 0 + 1 = 1477

Repeat this process for all 24 rows. You will now have 24 decimal numbers, each in the range 0–2047.

#10245122561286432168421TOT
1)101110001011477
2)110111001001764
3)101111001111511
4)01101000101837
5)111110101012005
6)111110010001992
7)00100000101261
8)101110001011477
9)101010101001364
10)101110111011501
11)111110001011989
12)01111001110974
13)101110101001492
14)100110001111223
15)101110001111479
16)111110111012013
17)00011000101197
18)101010001101350
19)111110101002004
20)111110001001988
21)00101000101325
22)101110101011493
23)100110001011221
24)00101010010338

Step 3: Calculate the Checksum

The last eight missing digits are calculated from the 256 bits you have so far, creating what is called a checksum. A checksum is a short verification code that lets your wallet detect if you have made a typo when entering the seed. If the checksum doesn't match, the wallet will warn you that something is wrong.

Generate the hash output

On your air-gapped Linux machine, open a terminal and feed your 256-bit binary string into SHA-256. Replace the example digits with your own binary string — it must be one continuous line:

echo 1011100010111011100100101111001110110100010111111010101111110010000010000010110111000101101010101001011101110111111000101011110011101011101010010011000111101110001111111101110100011000101101010001101111101010011111000100001010001011011101010110011000101001 | shasum -a 256 -0

This command takes your binary sequence, applies the SHA-256 hash function, and produces a unique hexadecimal output. Our example output:

52831c8346d7423d26648b51490f2d7ae0ddf172956f241a6bb8bdc0d887c292

The checksum is the first 8 bits of that hash, which means we only care about the first two hexadecimal characters: 52.

Convert the first two hex characters to binary

We need to convert the two hexadecimal digits 5 and 2 into their 4-bit binary equivalents. Hexadecimal is a number system that uses 0–9 plus a–f to represent values 0–15.

HEXDecimalBinary
000000
110001
220010
330011
440100
550101
660110
770111
881000
991001
a101010
b111011
c121100
d131101
e141110
f151111

From the table:

  • 5 in binary is 0101 (4 bits)
  • 2 in binary is 0010 (4 bits)

Concatenated, the checksum is 01010010 (8 bits). Append it to the 24th row so the row now has 11 bits, completing the 264-bit sequence.

#
1)10111000101
2)11011100100
3)10111100111
4)01101000101
5)11111010101
6)11111001000
7)00100000101
8)10111000101
9)10101010100
10)10111011101
11)11111000101
12)01111001110
13)10111010100
14)10011000111
15)10111000111
16)11111011101
17)00011000101
18)10101000110
19)11111010100
20)11111000100
21)00101000101
22)10111010101
23)10011000101
24)00101010010

Now convert row 24 from binary to decimal using the same method as Step 2. That gives the final decimal value of row 24 — in our example, 338.

Step 4: Look Up BIP39 Words

BIP39 (Bitcoin Improvement Proposal 39) defines a list of 2048 words, arranged alphabetically. Each word corresponds to a specific position. Your 24 decimal numbers (from Step 2 and the checksum row in Step 3) are used to look up your 24 seed words.

  • The smallest possible value is 0 (binary 00000000000), which corresponds to the word "abandon" — the first word on the list.
  • The largest possible value is 2047 (binary 11111111111), which corresponds to the word "zoo" — the last word on the list.
Zero-indexed list, one-indexed GitHub

Computers count from 0. The BIP39 position of "abandon" is 0, not 1. However, the official BIP39 word list on GitHub displays line numbers starting from 1. So a BIP39 position of 1477 maps to GitHub line 1478. Always add 1 to your decimal when searching the GitHub file.

For example, the first 11-bit binary number we calculated equals 1477 in decimal. On GitHub you will find it on line 1478 — the word is "reward".

Look up each decimal value below (remembering to add 1 when searching GitHub) and record the corresponding word for all 24 rows.

#BIP39GitHubWord
1)14771478reward
2)17641765symptom
3)15111512rude
4)837838hamster
5)20052006wide
6)19921993weekend
7)261262camera
8)14771478reward
9)13641365pride
10)15011502roof
11)19891990weather
12)974975keep
13)14921493ritual
14)12231224ocean
15)14791480rib
16)20132014wing
17)197198board
18)13501351potato
19)20042005whisper
20)19881989weasel
21)325326chunk
22)14931494rival
23)12211222obvious
24)338339clean

Congratulations — you have now created a valid 24-word Bitcoin mnemonic seed.

Verify the seed in Sparrow Wallet

As a final sanity check, install a software wallet such as Sparrow on your air-gapped computer and enter the 24 words. If Sparrow accepts the seed, your checksum matched and the whole chain of calculations is correct. If it rejects the seed, the checksum is wrong — double-check every step, especially the SHA-256 output and the final row of binary.

Importing the seed into Sparrow Wallet for verification

Step 5: Back Up on Metal

Your Bitcoin seed phrase is the key to your funds. If it is lost or compromised, your Bitcoin is gone forever. Paper and digital backups can degrade, get lost, or be destroyed. A metal seed plate is a durable, fireproof, waterproof backup that can last decades.

Why metal

  • Fire and water resistance — Unlike paper, metal plates withstand extreme temperatures and flooding.
  • Durability — Metal does not degrade over time the way paper and electronic storage do.
  • Tamper resistance — A sealed metal backup makes unauthorized access visible.
  • Longevity — A well-engraved or stamped metal seed plate can last a lifetime, keeping your Bitcoin recoverable for decades.

How to store your metal backup safely

  • Keep it in a secure location — a safe, hidden vault, or safety deposit box.
  • Consider splitting your seed into multiple secure locations.
  • Avoid storing it digitally or in places prone to theft or destruction.
  • Once the seed is stamped into metal, destroy the paper copy (burn it).

Your Bitcoin is only as safe as your seed backup. Protect it wisely.


Related Topics

Next Steps