Blockchain/Nivel II · Mecánica/2.1 Criptografía/Lección 5
Entropía y aleatoriedad
La base invisible: por qué una clave solo es tan fuerte como el ruido que la creó
MaterialesUn conjunto de dados (opcional, para observar la entropía física)Un cuaderno
Curiosidad
- ¿Qué distingue la verdadera aleatoriedad de la intuición humana?
- ¿Cómo un error de software en una distribución de Linux expuso miles de claves a ataques por fuerza bruta?
- ¿Por qué una frase de doce palabras representa exactamente 128 bits de entropía más un checksum?
Explorar
- Una clave privada de Bitcoin es un número entero aleatorio entre 1 y n-1, donde n es el orden del generador de la curva secp256k1. Este rango contiene aproximadamente 1.158 × 10^77 valores posibles. Para lograr una seguridad de 128 bits contra ataques de logaritmo discreto, la clave debe seleccionarse de manera uniforme dentro de este intervalo. Si el proceso de selección es predecible o sesgado, la entropía efectiva disminuye, reduciendo el factor de trabajo para un atacante a una fracción del máximo teórico.
- La entropía mide la incertidumbre en bits. Un mnemónico de doce palabras de BIP39 codifica 128 bits de verdadera aleatoriedad más una suma de verificación de cuatro bits derivada de SHA-256. Una frase de veinticuatro palabras contiene 256 bits. La palabra final sirve en parte como detector de errores; las palabras aleatorias rara vez forman una frase válida, ya que la suma de verificación fallará. Esta estructura reduce los errores de transcripción silenciosa, siempre y cuando la entropía de origen sea genuina.
- La aleatoriedad generada por los seres humanos es notoriamente débil. Las frases que las personas eligen tienen mucha menos entropía de la que parecen tener, ya que prefieren palabras, citas y patrones familiares. Los atacantes explotan esto realizando ataques de diccionario contra claves derivadas de frases memorables, conocidas como “billeteras cerebrales”. Vasek, Bonneau y otros (2016) documentaron cómo tales billeteras se vaciaban rutinariamente, a menudo muy poco después de ser financiadas, porque los atacantes podían probar enormes listas de frases probables.
- Las deficiencias en la implementación del software han comprometido repetidamente la generación de claves. Un cambio realizado por Debian en OpenSSL (utilizado entre 2006 y 2008, revelado en DSA-1571) dejó que el ID del proceso fuera casi la única fuente de variabilidad; por lo tanto, cada tipo y tamaño de clave solo tenía alrededor de 32.768 claves posibles. En agosto de 2013, un defecto en SecureRandom de Android hizo que algunas billeteras de Bitcoin reutilizaran nonces de firma, lo que expuso las claves privadas y permitió robos. Estos incidentes demuestran que las fuentes de entropía deben ser criptográficamente seguras e independientes del estado del sistema.
- ‘Randstorm’, revelado en 2023 por Unciphered, mostró que las billeteras web de la era BitcoinJS (aproximadamente 2011-2015) utilizaban generadores de aleatoriedad débiles, exponiendo a los usuarios a ataques para recuperar las claves. Las billeteras hardware modernas recogen entropía de múltiples fuentes internas durante la inicialización, mostrando la palabra mnemónica resultante una por una. Una vez anotadas, estas palabras se convierten en la única autoridad sobre los fondos; perderlas significa una pérdida permanente del acceso.
- Una buena entropía proviene de los generadores de números aleatorios criptográficos del sistema operativo (CSPRNG), de los generadores de números aleatorios hardware o de procesos físicos como el lanzamiento de dados (con ciertas reservas en cuanto a sesgos). Los CSPRNG mezclan ruido proveniente de eventos del sistema y sensores hardware para generar bits impredecibles. Si el resultado está entre 1 y n−1, se convierte en una clave privada válida; de lo contrario, el generador vuelve a intentarlo con nuevos datos aleatorios. Este bucle asegura una distribución uniforme en todo el orden de la curva.
Datos clave
- Una clave privada de Bitcoin apunta a una seguridad de 128 bits, lo que requiere una selección uniforme entre aproximadamente 1.158 × 10^77 valores posibles.
- Una frase de BIP39 de doce palabras codifica 128 bits de entropía más una suma de verificación de cuatro bits; veinticuatro palabras codifican 256 bits.
- El error de OpenSSL en Debian (2006-2008, DSA-1571) redujo el espacio de claves a unas 32,768 posibilidades por tipo y tamaño de clave.
- Un defecto en SecureRandom de Android revelado en agosto de 2013 hizo que algunas billeteras reutilizaran nonces de firma, exponiendo las claves al robo.
- ‘Randstorm’ (revelado en 2023) identificó una falta de aleatoriedad en las billeteras web de la era BitcoinJS, del período aproximado 2011-2015.
- Las claves derivadas de frases memorables («billeteras cerebrales») eran encontradas y vaciadas rutinariamente por los atacantes.
Ejercicio nueve, seis, tres, uno
9ReunirEnumera 9 fuentes de aleatoriedad digital o física. Indica el mecanismo (por ejemplo, fluctuaciones del reloj del sistema, ruido térmico) y cualquier vulnerabilidad histórica conocida asociada a cada una.
6AgruparAgrupa los 9 según su calidad de entropía en 6 categorías: CSPRNG criptográficamente seguros, RNG de hardware, procesos físicos, generados por humanos, implementaciones de software defectuosas o otros.
3DestilarReduce los 6 criterios a 3 para evaluar si una fuente de aleatoriedad es adecuada para generar una clave privada de Bitcoin.
1CristalizarEscribe una oración sobre por qué la distribución uniforme en todo el orden n de la curva es innegociable para la seguridad de la clave.
Verificación de hechos
Fechas, cifras y afirmaciones verificadas con las fuentes publicadas que se enumeran a continuación.
- Debian Security Advisory DSA-1571: openssl - insufficient randomness in key generation (2008)
- Bitcoin.org, 'Android Security Vulnerability' (11 August 2013)
- Unciphered, 'Randstorm: You Can't Patch a House of Cards' (2023)
- M. Vasek, J. Bonneau et al., 'The Bitcoin Brain Drain: Examining the Use and Abuse of Bitcoin Brain Wallets' (2016)
- M. Palatinus, P. Rusnak, A. Voisine & S. Bowe, 'BIP-0039: Mnemonic code for generating deterministic keys' (2013)