Nonce en criptografía: ataque de canal encubierto usando nonce
Aunque algunos creen que "nonce" significa "number used once" (número usado una vez), su origen es más probable en el inglés medio, donde "nonse" se refería a una ocasión o instancia única.
El nonce juega un papel fundamental para garantizar la unicidad del hash de cada bloque, que actúa como huella digital criptográfica e identificador del bloque. Este hash es esencial para el crecimiento de la blockchain. Los mineros pueden modificar los valores del hash y resolver problemas matemáticos para crear nuevos bloques ajustando el nonce.
El valor de los nonces en la minería cripto
La minería de blockchain basada en el algoritmo de consenso proof-of-work implica que los nodos de la red resuelvan problemas matemáticos para añadir nuevos bloques a la cadena.
Si "miramos dentro" de un bloque para ver su contenido, encontraremos un encabezado de bloque y una lista de transacciones. El encabezado del bloque contiene:
- el hash del bloque anterior;
- la raíz Merkle (hash de las transacciones);
- una marca de tiempo;
- la dificultad de minería (un número objetivo que se ajusta regularmente para que el valor hash del encabezado del bloque sea igual o inferior a ese objetivo);
- el nonce.
Para agregar un bloque a la cadena, los mineros no solo deben calcular su hash, sino hacerlo de manera que el resultado cumpla con el criterio de dificultad determinado por la red. Sin esto, los bloques se agregarían demasiado rápido (el cálculo del hash es una operación bastante sencilla), y la red no podría alcanzar consenso a tiempo.
El nonce se utiliza para evitar este "exceso de velocidad". Al recibir un bloque, el minero lo agrega al hash y calcula el hash del "conjunto" resultante. Si el resultado no coincide con el valor establecido por la dificultad, el minero cambia el valor del nonce y vuelve a calcular el hash.
Este método exige que los nodos de la red cuenten con una gran capacidad de cómputo, ya que los mineros deben probar literalmente miles de millones de nonces hasta encontrar el correcto.
Cuando se encuentra el nonce correcto, se obtiene la suma hash requerida y se crea el bloque. Luego se comparte con la red para que otros mineros lo verifiquen y, si no hay errores, se agregue a la blockchain. El minero que creó el nuevo bloque recibe una recompensa.
El objetivo principal de los nonces es evitar la generación de hashes idénticos al cifrar el mismo texto plano varias veces con la misma clave privada. Esto reduce el riesgo de que un tercero obtenga información mediante análisis de frecuencia. Pero ¿qué sucede si este nonce no es aleatorio? Veamos cómo se calcula el nonce.
Ataque de canal encubierto usando nonce
La principal tecnología detrás de las dos criptomonedas más importantes, Bitcoin y Ethereum, es el algoritmo de firma digital de curva elíptica (ECDSA).
ECDSA es un método para crear firmas digitales que demuestran la propiedad de tus activos cripto. Cada firma prueba dos cosas:
- Que posees una clave privada. Cada clave privada está vinculada a una clave pública. Tu "dirección" cripto es, en esencia, una versión corta de esa clave pública.
- Que usaste tu clave privada para firmar un mensaje específico (transacción).
ECDSA se basa en el principio de que es sencillo generar una clave pública a partir de una privada, pero prácticamente imposible derivar la clave privada desde la pública. Sin embargo, existen ciertas condiciones limitadas bajo las cuales se puede usar la firma de una transacción para descifrar la clave privada. Puede sonar técnico, pero lo explicamos.
Para generar firmas, ECDSA utiliza una clave privada (d), un número aleatorio (k) y el hash de un mensaje (h). Estos se combinan con Q, la clave pública vinculada a la clave privada (d), y dos números estandarizados en el algoritmo ECDSA, G y n. Todos estos elementos trabajan juntos en un algoritmo específico para calcular una firma digital.
r = k * G mod n
s = {h + d * r}/{k} mod n
The Nonce value
El número aleatorio k en las firmas ECDSA es fundamental y debe mantenerse confidencial y usarse solo una vez. Por eso también se le llama nonce. Si un atacante descubre el nonce usado en una firma específica, puede obtener la clave privada utilizada para firmar ese mensaje. Mediante álgebra, se puede deducir la siguiente fórmula.
d = (s*k-h)*r^(-1) mod n
Asimismo, si un nonce se reutiliza en dos firmas distintas, la clave privada utilizada para firmarlas queda expuesta. Nuevamente, aplicando álgebra, se puede deducir el nonce usado con la siguiente ecuación.
k = (h1-h2)*(s1-s2)^(-1) mod n
How can you detect nonce reuse?
Recuerda la fórmula para generar r en el algoritmo ECDSA: r = k * G mod n. Como G y n son constantes, la única variable que cambia entre firmas es k, el número aleatorio. Por lo tanto, si k se reutiliza para dos mensajes, sus firmas compartirán el mismo r. Por eso k nunca debe reutilizarse.
Sabiendo esto, es posible identificar nonces ECDSA reutilizados en transacciones de Ethereum buscando dos transacciones del mismo usuario con el mismo r pero valores s diferentes.
Cómo Tangem Wallet te protege del ataque de canal encubierto usando nonce
El nonce para ECDSA se genera en una biblioteca certificada (CC EAL5+) de Samsung usando un generador de números verdaderamente aleatorios en hardware certificado; no podemos influir en el nonce de ninguna forma — ni siquiera podemos reconocerlo.
Si una billetera se crea sin frase semilla, el mismo módulo TRNG y las mismas bibliotecas certificadas se utilizan para generar las claves privadas. Esto aplica para todos los tipos de Tangem Wallet cuando no hay frase semilla (la opción recomendada). En este caso, todo ocurre dentro de la tarjeta (el módulo TRNG es parte del chip) y no se utiliza ningún dato externo. ECDSA nonce never leaves the Tangem card and is kept secret.
Nonce en el explorador de blockchain
El nonce en una transacción es solo una coincidencia de nombre. Es el número de secuencia de la transacción (visible en cualquier explorador de blockchain), y se utiliza para proteger contra ataques de repetición (la posibilidad de repetir la misma transacción) en la blockchain. Es parte de los datos que se firman en la transacción. Por lo tanto, simplemente depende de la cantidad de transacciones previas y se deriva del estado actual de la blockchain, sin relación con el TRNG ni con la tarjeta Tangem.
Direcciones únicas en Tangem Wallet
Aunque no reutilizar direcciones puede hacer que el problema del nonce no sea relevante para Bitcoin y otras blockchains basadas en UTXO, esto no resuelve el problema en general. Las blockchains basadas en cuentas como Ethereum están diseñadas para usarse con un solo par de claves, y aún mantienen el mismo nonce en las firmas ECDSA, mientras que el nonce utilizado para proteger contra la repetición de transacciones es completamente diferente. Así que este tipo de blockchains requieren una generación adecuada de nonces de todas formas.
Con el TRNG adecuado de Tangem Wallet, no tienes que preocuparte por generar accidentalmente el mismo nonce dos veces. La probabilidad es similar a que alguien genere por casualidad la misma clave privada que la tuya: es prácticamente imposible.