Reutilización de nonce
Un error de firma en el que dos firmas ECDSA de la misma clave privada comparten el mismo número secreto, visible en la cadena como el mismo valor r. Cualquiera puede entonces calcular la clave privada a partir de las dos firmas. No es lo mismo que la reutilización de direcciones, pero la reutilización de direcciones es lo que le da a una clave una segunda firma con la que comparar.
Traducción hecha con ayuda de IA, pendiente de revisión humana. Lee el original (en inglés).
Toda firma ECDSA necesita un número secreto nuevo, usado una vez y nunca más. Ese número comparte nombre con el nonce del encabezado del bloque que los mineros van variando, y significa lo mismo: un número que se usa una sola vez. Es el que produce el valor r en la cadena. Firma dos mensajes con la misma clave privada y el mismo número, y las dos firmas comparten la r; unas pocas líneas de álgebra sobre sus valores s recuperan entonces la clave.
Nils Schneider lo demostró en la cadena real el 28 de enero de 2013: una transacción con dos entradas cuyas firmas compartían la r. Derivó la clave y, con permiso del dueño, gastó los fondos. Su explicación: "This transaction was generated by a hardware bitcoin wallet using a pseudo-random number generator that was returning the same 'random' number every time" (la transacción la generó una billetera de hardware de bitcoin con un generador de números pseudoaleatorios que devolvía el mismo número "aleatorio" cada vez).
En agosto de 2013 el problema se generalizó: el generador de números aleatorios de Android estaba mal inicializado, lo que puso en riesgo todas las billeteras que habían creado claves en un dispositivo Android. La alerta de bitcoin.org del 11 de agosto de 2013 decía "key rotation is necessary" (la rotación de claves es necesaria): mover todo a direcciones nuevas y no devolver monedas a las antiguas. Mike Hearn le dijo ese mismo día a bitcoin-dev que "some signatures have been observed to have colliding R values" (se han observado firmas con valores R que colisionan); Google confirmó la falla en su Android Developers Blog el 14 de agosto de 2013.
La solución que volvió rara esta clase de error es dejar de confiar en el generador de números aleatorios para esta tarea. El RFC 6979 deriva el número de la clave privada y del mensaje, y libsecp256k1, la biblioteca de firma de Bitcoin Core, lo usa. El BIP 340 les da a las firmas Schnorr un nonce sintético, una derivación determinista mezclada con aleatoriedad fresca, y advierte que una derivación copiada podría dejar un nonce "accidentally reused in the other scheme leaking the secret key" (reutilizado por accidente en el otro esquema, con lo que se filtra la clave secreta).
La relación con la reutilización de direcciones exige cuidado. La reutilización de nonce es un error de firma; la reutilización de direcciones es un hábito. El error necesita dos firmas de la misma clave, y una clave que firma una sola vez no puede filtrarse así. Reutilizar una dirección es lo que le da a una clave una segunda, una tercera y una centésima firma. Y también al revés: una dirección nunca reutilizada puede firmar dos veces de todos modos, si guarda dos monedas que se gastan juntas o si vuelve a firmar bajo RBF. Bitcoin Optech, sobre los ataques con retículos (lattice attacks) de Breitner y Heninger, en enero de 2019: "The fast analysis method employed by the authors of the paper took advantage of users who engaged in address reuse, but even keys for addresses that have not been reused are vulnerable to attack if the nonce generation is biased or too small" (el método rápido de análisis que emplearon los autores del artículo se aprovechó de los usuarios que reutilizaban direcciones, pero incluso las claves de direcciones que no se han reutilizado son vulnerables a un ataque si los nonces se generan con sesgo o son demasiado pequeños).
Reutilizar una dirección con una billetera que deriva sus nonces no te expone al ataque de 2013. Sí pone todas las monedas que recibes ahí detrás de una sola clave, y eso ya es razón suficiente.
Ideas clave
- Nils Schneider recuperó así una clave privada de la cadena en enero de 2013; la falla de SecureRandom en Android de agosto de 2013 puso en riesgo todas las claves generadas en Android, con valores R que colisionaban a la vista en la cadena, y llevó a bitcoin.org a decirles a los usuarios que 'la rotación de claves es necesaria'
- Los nonces deterministas volvieron rara esta clase de error: el RFC 6979 en libsecp256k1 para ECDSA, y el nonce sintético del BIP 340 para Schnorr, derivan el número de la clave y del mensaje en vez de confiar en un generador de números aleatorios
- Una clave que firma una sola vez no puede filtrarse así; reutilizar una dirección es lo que le da a una clave muchas firmas, aunque una dirección nunca reutilizada también puede firmar dos veces
Capítulos relacionados
Fuentes (6)
- Nils Schneider - Recovering Bitcoin private keys using weak signatures from the blockchain (28 January 2013, archived copy)
- bitcoin.org alert - Android security vulnerability and key rotation (11 August 2013)
- Mike Hearn, bitcoin-dev - Android key rotation (11 August 2013)
- Android Developers Blog - Some SecureRandom Thoughts (14 August 2013)
- Bitcoin Optech Newsletter, 15 January 2019 (Breitner and Heninger, weak nonces and address reuse)
- BIP-340 - Schnorr Signatures for secp256k1 (synthetic nonce)
Términos relacionados (9)
Publicado el . No hay correcciones registradas para esta página.
Editar esta página en GitHub