dice-seed
Descarga Scripts ↓ Download Scripts ↓

50 tiradas de dado. 12 palabras. Cero confianza.

50 dice rolls. 12 words. Zero trust.

Cuando generas una semilla en una cartera, confías en que su generador de números aleatorios es bueno y honesto. No puedes comprobarlo. Con un dado sí: la aleatoriedad la produces tú, delante de ti, y cada paso del cálculo se puede verificar a mano.

When a wallet generates a seed for you, you're trusting that its random number generator is both sound and honest. You can't check either. With a die you can: you produce the randomness yourself, in front of you, and every step of the calculation can be verified by hand.

50 × d6base 6base 6128 bitsSHA-256132 bitsbase 2048base 204812 palabras12 words
Esta página no genera semillasThis page does not generate seeds

Aquí solo se explica el método y se distribuyen los scripts. Una semilla real se genera en un ordenador sin conexión a internet, ejecutando el script en tu propia máquina. Ningún navegador es un sitio seguro para esto, incluido este.

This page only explains the method and hosts the scripts. A real seed is generated on a computer with no internet connection, by running the script on your own machine. No browser is a safe place for this — including this one.

Cómo funcionaHow it works

El método, en pocas palabras

The method, in short

BIP-39 es el estándar que convierte aleatoriedad en 12 palabras memorizables. Aquí esa aleatoriedad la produces tú, con un dado en la mano. Así es todo el proceso, de principio a fin:

BIP-39 is the standard that turns randomness into 12 memorable words. Here you produce that randomness yourself, die in hand. Here's the whole process, start to finish:

Descarga uno de los dos scripts —o los dos, para comparar— y guárdalos en un USB en el que confíes. Ese USB se va a un ordenador sin conexión: wifi apagado, cable de red desconectado y, si puedes, arrancado desde un sistema «live» que se olvide de todo al apagarse. Para esto recomendamos Tails: no es obligatorio, pero está diseñado precisamente para no dejar rastro y viene ya bastante asegurado por defecto. Fuera de eso no hace falta nada especial: vale cualquier portátil viejo, siempre que en ese momento esté completamente aislado. A partir de aquí, todo ocurre en esa máquina y no sale de ella.

Download one of the two scripts — or both, to cross-check — and save them to a USB drive you trust. That drive goes to a computer with no connection: wifi off, network cable unplugged, and ideally booted from a live system that forgets everything on shutdown. We recommend Tails for this: it's not required, but it's built specifically to leave no trace and comes reasonably secure by default. Beyond that, nothing special is required — any old laptop works, as long as it's fully isolated at that moment. From here on, everything happens on that machine and stays there.

Descarga y guía oficial para crear el USB de arranque de Tails: tails.net/install
Official download and guide to build the Tails boot USB: tails.net/install

Tira un dado de verdad 50 veces y apunta cada número en un papel cualquiera. Ese papel es solo un borrador de trabajo: en cuanto tengas tus 12 palabras, lo destruyes. Esas 50 tiradas por sí solas no abren ninguna cartera —son la materia prima, no la semilla— así que no hay ningún motivo para conservarlas.

Roll a real die 50 times and jot down each number on any scrap of paper. That paper is just a working draft: as soon as you have your 12 words, destroy it. Those 50 rolls on their own don't open any wallet — they're the raw material, not the seed — so there's no reason to keep them.

Ejemplo de tiradas (no las reutilices): 3 1 6 4 2 5 6 1 4 3 2 6 5 1 3 4 6 2 1 5 3 6 4 2 1 5 6 3 4 1 2 6 5 3 1 4 6 2 5 3 1 6 4 2 5 3 1 6 4 2
Example rolls (don't reuse them): 3 1 6 4 2 5 6 1 4 3 2 6 5 1 3 4 6 2 1 5 3 6 4 2 1 5 6 3 4 1 2 6 5 3 1 4 6 2 5 3 1 6 4 2 5 3 1 6 4 2

Lanza el script en ese ordenador desconectado e introduce las 50 tiradas cuando te las pida. Antes de continuar, repasa dos veces lo que has escrito contra tu papel: un solo número cambiado da una semilla completamente distinta, y el script no tiene forma de avisarte de un despiste.

Run the script on that offline computer and enter the 50 rolls when it asks for them. Before moving on, check what you typed against your paper twice: a single wrong digit produces a completely different seed, and the script has no way of warning you about a slip.

python3 bip39_dados.py node bip39_dados.js

El script te devuelve 12 palabras en inglés, en un orden concreto. Anótalas a mano, en ese mismo orden, en un papel que esta vez sí vas a conservar. Ese papel es tu semilla.

The script gives you back 12 words in English, in a specific order. Write them down by hand, in that same order, on paper you will actually keep this time. That paper is your seed.

Ejemplo de palabras (demo pública, nunca las uses): surge maze purity misery seed suspect because camp moment sea foil hybrid
Example words (public demo, never use them): surge maze purity misery seed suspect because camp moment sea foil hybrid

Extra muy recomendable: añade a tu semilla una passphrase propia de al menos 22 caracteres, mezclando mayúsculas, minúsculas, números y algún símbolo. Es una clave adicional que memorizas y que nunca escribes junto a las 12 palabras: si alguien encuentra tu papel, sin la passphrase no tiene nada. A cambio, si la olvidas, la semilla queda inservible para siempre, así que cuídala tanto como las palabras.

A highly recommended extra: add your own passphrase to the seed, at least 22 characters long, mixing upper and lower case, numbers and a symbol or two. It's an additional key you memorise and never write down next to the 12 words: if someone finds your paper, without the passphrase they have nothing. The trade-off is that if you forget it, the seed is gone for good — so guard it as carefully as the words themselves.

Ejemplo de passphrase (no la reutilices): Tr4ct0r!Naranja_87#Luna
Example passphrase (don't reuse it): Tr4ct0r!Naranja_87#Luna
¿Por qué funciona? Ver las matemáticas del método (manual detallado) Why does it work? See the method's math (detailed manual)

Las tiradas forman un número en base 6

The rolls form a number in base 6

Un dado de 6 caras aporta log₂(6) = 2,585 bits por tirada, así que 50 tiradas dan 129,25 bits: suficiente para los 128 que necesitamos. El dado no tiene cara 0, así que a cada tirada se le resta 1.

A six-sided die yields log₂(6) = 2.585 bits per roll, so 50 rolls give 129.25 bits — enough for the 128 we need. A die has no zero face, so each roll has 1 subtracted from it.

3 1 6 4 → 2 0 5 3 N = 2·6³ + 0·6² + 5·6¹ + 3·6⁰ = 465

La primera tirada es el dígito más significativo. Cambiar el orden de las tiradas produce una semilla completamente distinta, así que la secuencia importa tanto como los números.

The first roll is the most significant digit. Reordering the rolls produces a completely different seed, so the sequence matters as much as the numbers.

Recortar a 128 bits exactos

Trim to exactly 128 bits

Sobran 1,25 bits, así que nos quedamos con los 128 más bajos. Eso introduce un sesgo mínimo: la entropía efectiva baja a 127,97 bits en vez de 128.

There's a 1.25-bit surplus, so we keep the lowest 128. That introduces a tiny bias: effective entropy drops to 127.97 bits instead of 128.

6⁵⁰ / 2¹²⁸ = 2,375 → se pierden 0,03 bits0.03 bits lost

Los scripts incluyen un bloque comentado que elimina el sesgo por completo mediante rechazo, a cambio de repetir las 50 tiradas el 15,8 % de las veces.

The scripts include a commented-out block that removes the bias entirely by rejection, at the cost of re-rolling all 50 dice 15.8% of the time.

Añadir 4 bits de checksum

Add 4 checksum bits

Se calcula SHA-256 de la entropía y se toman los 4 primeros bits del resultado. No aportan seguridad: sirven para que, si copias mal una palabra, la cartera rechace la frase en vez de abrir en silencio una cuenta vacía que no es la tuya.

Take SHA-256 of the entropy and keep the first 4 bits of the result. They add no security — they exist so that if you mis-copy a word, your wallet rejects the phrase instead of silently opening an empty account that isn't yours.

SHA-256(entropíaentropy) = 05fda87a… byte 0x05 = 0000 0101 ^^^^ ← checksum

Partir los 132 bits en 12 grupos de 11

Split the 132 bits into 12 groups of 11

La lista oficial tiene 2048 = 2¹¹ palabras, así que cada palabra codifica exactamente 11 bits. Y 128 + 4 = 132 = 12 × 11, sin que sobre ni falte un bit. Todo el diseño de BIP-39 gira en torno a esa división limpia.

The official list has 2048 = 2¹¹ words, so each word encodes exactly 11 bits. And 128 + 4 = 132 = 12 × 11, with not a single bit left over. BIP-39's whole design turns on that clean division.

Pasa el ratón por un grupo o una palabra
Hover a group or a word

Los 4 últimos bits (recuadro rojo) son el checksum. Ejemplo público de demostración: nunca uses esta semilla.

The last 4 bits (red outline) are the checksum. Public demo example: never use this seed.

Cada número es una posición en la lista

Each number is a position in the list

El índice se busca tal cual en la lista oficial de 2048 palabras. Un detalle útil: las 4 primeras letras de cada palabra son únicas, así que puedes apuntar solo cuatro letras sin perder información — práctico si grabas la semilla en metal.

The index is looked up directly in the official 2048-word list. A useful detail: the first 4 letters of every word are unique, so you can write down just four letters without losing information — handy when stamping a seed into metal.

La idea que lo explica todoThe idea that ties it together

Los pasos 1 y 4 son la misma operación en sentidos opuestos: una conversión de base. Primero leemos los dados en base 6 para construir un número; después escribimos ese número en base 2048 para obtener las palabras.

Steps 1 and 4 are the same operation in opposite directions: a base conversion. First we read the dice in base 6 to build a number; then we write that number in base 2048 to get the words.

Descarga y auditoríaDownload and audit

Descarga de los scripts

Download the scripts

La misma lógica en dos lenguajes, sin dependencias externas. Antes de decidirte, esto es lo que ganas y lo que pierdes frente a otras opciones.

The same logic in two languages, no external dependencies. Before you decide, here's what you gain and what you give up compared with other options.

Ventajas y desventajas

Advantages and drawbacks

A favor

In favour

  • Aleatoriedad auditable. No dependes del generador de nadie. La ves caer sobre la mesa.
  • Verificable paso a paso. Cualquiera puede repetir el cálculo con lápiz y papel y llegar al mismo resultado.
  • Sin dependencias. Los dos scripts usan solo la biblioteca estándar de su lenguaje. Nada que descargar, nada que pueda estar comprometido.
  • Protege de un fallo concreto. Ha habido dispositivos con generadores rotos. Un dado no tiene firmware.
  • Se enseña. Al terminar entiendes de verdad qué es tu semilla, no solo que la tienes.
  • Auditable randomness. You don't depend on anyone's generator. You watch it land on the table.
  • Verifiable step by step. Anyone can redo the calculation with pen and paper and reach the same result.
  • No dependencies. Both scripts use only their language's standard library. Nothing to download, nothing that can be compromised.
  • Guards against a real failure. Devices have shipped with broken generators. A die has no firmware.
  • It teaches. When you're done you actually understand what your seed is, not just that you have one.

En contra

Against

  • La semilla pasa por un ordenador de propósito general. Una cartera hardware nunca deja salir la clave del dispositivo. Aquí sí aparece en pantalla y en memoria.
  • Es fácil equivocarse. Anotar mal una de las 50 tiradas, o una palabra, y el resultado es otro. El checksum ayuda, pero no lo cubre todo.
  • Requiere disciplina. Sin red, sin fotos, sin copiar y pegar, sin dejar rastro en el historial. Un solo descuido lo invalida.
  • Un dado sesgado te arruina el trabajo. Un dado barato con esquinas desgastadas no es uniforme.
  • No es para todo el mundo. Si no vas a seguir el proceso con cuidado, una cartera hardware reputada te protege más que un método manual mal ejecutado.
  • The seed passes through a general-purpose computer. A hardware wallet never lets the key leave the device. Here it does appear on screen and in memory.
  • Mistakes are easy. Mis-record one of the 50 rolls, or one word, and you get a different result. The checksum helps, but it doesn't catch everything.
  • It demands discipline. No network, no photos, no copy-paste, no shell history. One lapse undoes it.
  • A biased die ruins the work. A cheap die with worn corners isn't uniform.
  • It isn't for everyone. If you won't follow the process carefully, a reputable hardware wallet protects you better than a manual method done badly.

Los dos scripts

The two scripts

Elige el que ya tengas instalado, o el que sepas leer mejor: los dos están comentados paso a paso y producen resultados idénticos. Cada uno incluye --test, que comprueba los vectores oficiales de BIP-39, y --detalle, que imprime todos los valores intermedios.

Pick whichever you already have installed, or whichever you can read best: both are commented step by step and produce identical results. Each includes --test, which checks the official BIP-39 vectors, and --detalle, which prints every intermediate value.

Cómo introducir las tiradasHow to enter the rolls

Puedes escribirlas de una en una o varias juntas, separadas por espacios (3 1 6 4 2 5 6 1 ...). Cualquier carácter que no sea del 1 al 6 se ignora, con un aviso en pantalla salvo para espacios, comas, puntos y guiones.

You can type them one at a time or several at once, separated by spaces (3 1 6 4 2 5 6 1 ...). Any character outside 1-6 is ignored, with an on-screen warning except for spaces, commas, periods and dashes.

Python

La opción por defecto: ya viene instalado en macOS y en cualquier Linux. Es el más corto y el más fácil de leer sin saber programar.

The default choice: already installed on macOS and any Linux. It's the shortest and the easiest to read without programming experience.

RequisitosRequirements
  • Python 3.2 o superior
  • Preinstalado en macOS y Linux
  • Sin dependencias: solo hashlib
  • En Windows: instálalo desde python.org, o usa WSL
  • Python 3.2 or later
  • Preinstalled on macOS and Linux
  • No dependencies: just hashlib
  • On Windows: install it from python.org, or use WSL
Cómo se lanzaHow to run it
# comprueba los vectores python3 bip39_dados.py --test # pide las 50 tiradas python3 bip39_dados.py # imprime cada paso python3 bip39_dados.py --detalle
# checks the vectors python3 bip39_dados.py --test # prompts for the rolls python3 bip39_dados.py # prints every step python3 bip39_dados.py --detalle
66d9f0b42288760e7f228e59ffa4e51f1fc9fa509b36f5f1900aedb1fab02d20

JavaScript

Para quien ya trabaja con Node. Usa BigInt, así que el propio lenguaje impide perder precisión por accidente.

For anyone already working with Node. It uses BigInt, so the language itself prevents accidental loss of precision.

RequisitosRequirements
  • Node.js 10.4 o superior
  • Necesita BigInt, nativo desde esa versión
  • Sin npm install: solo crypto y readline
  • Descarga: nodejs.org, se recomienda la versión LTS
  • Node.js 10.4 or later
  • Needs BigInt, native since that version
  • No npm install: just crypto and readline
  • Download: nodejs.org, the LTS version is recommended
Cómo se lanzaHow to run it
# comprueba los vectores node bip39_dados.js --test # pide las 50 tiradas node bip39_dados.js # imprime cada paso node bip39_dados.js --detalle
# checks the vectors node bip39_dados.js --test # prompts for the rolls node bip39_dados.js # prints every step node bip39_dados.js --detalle
19e9e544ecee03b3e216ff8244bb726cdf5b0a34209a6565ee0f9dc3663551a9

  
Esta página se verifica a sí mismaThis page verifies itself

Los dos scripts de esta página van dentro de este fichero HTML, y al abrir el visor el navegador calcula su SHA-256 y lo compara con el hash publicado. Si algo no cuadrara, lo verías en rojo. Es el paso 3 del método funcionando delante de ti.

Both scripts on this page live inside this HTML file, and when you open the viewer your browser computes their SHA-256 and compares it with the published hash. If anything didn't match, you'd see it in red. It's step 3 of the method working in front of you.

Guarda esta página (Ctrl-S / Cmd-S) y llévatela al ordenador sin red: funciona entera sin conexión, scripts incluidos. Aun así, la verificación que de verdad cuenta es la firma GPG de abajo.

Save this page (Ctrl-S / Cmd-S) and take it to your offline computer: it works completely without a connection, scripts included. Even so, the verification that really counts is the GPG signature below.

No te fíes de esta páginaDon't trust this page

Verificar antes de usar

Verify before you use it

Si alguien comprometiera este servidor podría cambiar los scripts y los hashes que aparecen arriba. Por eso la verificación real ocurre en tu terminal, contra una identidad publicada en varios sitios a la vez.

If someone compromised this server they could change both the scripts and the hashes shown above. That's why real verification happens in your terminal, against an identity published in several places at once.

Una vez: confiar en la clave

Once: trust the key

gpg --import ADN-clave-publica.asc gpg --fingerprint D37CBA46955B9F95

Debe salir exactamente esta huella. Compárala con los otros canales (repositorio, servidor de claves, Nostr). Este es el único paso que de verdad importa, y el que todo el mundo se salta:

It must print exactly this fingerprint. Compare it against the other channels (repository, key server, Nostr). This is the one step that really matters, and the one everybody skips:

05E6 6020 81F7 AFD7 2957 36B4 D37C BA46 955B 9F95

En cada descarga

On every download

gpg --verify SHA256SUMS.asc SHA256SUMS # ¿la firma es de ADN? shasum -a 256 -c SHA256SUMS # macOS sha256sum -c SHA256SUMS # Linux
gpg --verify SHA256SUMS.asc SHA256SUMS # is the signature ADN's? shasum -a 256 -c SHA256SUMS # macOS sha256sum -c SHA256SUMS # Linux

En Windows con PowerShell no existe la comprobación automática, hay que comparar a mano con Get-FileHash bip39_dados.py -Algorithm SHA256.

Windows PowerShell has no automatic check; compare by hand with Get-FileHash bip39_dados.py -Algorithm SHA256.

El aviso que asusta y no deberíaThe warning that scares people, and shouldn't

GPG dirá Good signature from "ADN" y justo debajo:

GPG will say Good signature from "ADN" and right below it:

gpg: WARNING: This key is not certified with a trusted signature!

Ese aviso es normal. Solo significa que no has marcado la clave como de confianza en tu llavero, algo que casi nadie hace. Lo que importa es que ponga Good signature y que la huella coincida. La identidad debe ser exactamente ADN <fotoshi@protonmail.com>; cualquier otra es motivo para detenerse.

That warning is normal. It only means you haven't marked the key as trusted in your keyring, which almost nobody does. What matters is that it says Good signature and that the fingerprint matches. The identity must be exactly ADN <fotoshi@protonmail.com>; anything else is a reason to stop.

Antes de usarlo con dinero real

Before using this with real money

Sin garantíasNo warranty

Este material se publica bajo licencia MIT, tal cual y sin garantía de ningún tipo. Eres responsable de auditar el código que ejecutas y de custodiar tu propia semilla. Nadie puede recuperarla por ti.

This material is published under the MIT licence, as is and without warranty of any kind. You are responsible for auditing the code you run and for safeguarding your own seed. Nobody can recover it for you.