ECDSA (Elliptic Curve Digital Signature Algorithm)
El algoritmo que permite demostrar propiedad de bitcoin sin revelar la clave privada. Usado en Bitcoin desde el día uno.
Qué es ECDSA
ECDSA (Elliptic Curve Digital Signature Algorithm) es el algoritmo de firma digital que Bitcoin usó desde su creación para todas las transacciones hasta la llegada de Taproot.
Una firma ECDSA permite demostrar que conoces la clave privada asociada a una clave pública, sin revelar la clave privada. Esta prueba es verificable por cualquiera que tenga la clave pública.
El proceso de firma
Para firmar un mensaje m (en Bitcoin, los datos de la transacción) con la clave privada d:
Paso 1: Hashear el mensaje
e = SHA256(SHA256(m))
El doble hash produce un número de 256 bits.
Paso 2: Generar el nonce
Elegir un número aleatorio k entre 1 y n-1 (donde n es el orden de la curva).
Este paso es crítico y volveremos a él.
Paso 3: Calcular el punto R
R = k · G
Donde G es el punto generador de secp256k1. R es un punto en la curva.
Paso 4: Calcular r
r = Rx mod n
Donde Rx es la coordenada x del punto R.
Paso 5: Calcular s
s = k⁻¹ · (e + r · d) mod n
Donde k⁻¹ es el inverso modular de k, e es el hash del mensaje, y d es la clave privada.
La firma
La firma es el par (r, s). Son dos números de 256 bits cada uno.
El proceso de verificación
Cualquiera con la clave pública Q puede verificar que (r, s) es una firma válida del mensaje m:
- Calcular e = SHA256(SHA256(m))
- Calcular u₁ = e · s⁻¹ mod n
- Calcular u₂ = r · s⁻¹ mod n
- Calcular el punto R' = u₁ · G + u₂ · Q
- Verificar que R'x mod n = r
Si la verificación pasa, la firma es válida. El firmante conoce la clave privada correspondiente a Q.
El peligro del nonce
El nonce k debe ser:
- Verdaderamente aleatorio
- Único para cada firma
- Secreto
Si k se reutiliza para dos firmas diferentes con la misma clave privada, la clave privada se puede calcular matemáticamente a partir de las dos firmas. Esto no es un ataque teórico: ha ocurrido en la práctica y ha causado pérdidas reales de bitcoin.
Si k es predecible o tiene baja entropía, también puede ser vulnerable.
La seguridad de ECDSA depende completamente de la calidad del nonce. Las hardware wallets y wallets de buena reputación implementan RFC 6979, que genera nonces de forma determinística a partir de la clave privada y el mensaje. Esto elimina el riesgo de nonces repetidos o de mala calidad.
Formato DER
En las transacciones Bitcoin, las firmas ECDSA se codifican en formato DER (Distinguished Encoding Rules): 30 [longitud total] 02 [longitud de r] [r] 02 [longitud de s] [s]
Ejemplo de firma DER (hexadecimal): 3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813
Desglosado:
30= inicio de secuencia45= 69 bytes de longitud total0221= entero de 33 bytes (r)00884d...= valor de r (con byte 00 de padding si el bit alto es 1)0220= entero de 32 bytes (s)4b9f...= valor de s
SIGHASH flags
Al final de la firma se añade un byte que indica qué partes de la transacción se firmaron:
SIGHASH_ALL (0x01): firma todos los inputs y outputs. El más común.SIGHASH_NONE (0x02): firma los inputs pero no los outputs.SIGHASH_SINGLE (0x03): firma los inputs y solo el output correspondiente.SIGHASH_ANYONECANPAY (0x80): puede combinarse con los anteriores. Firma solo el input propio.
Estos flags permiten casos de uso avanzados como transacciones colaborativas donde diferentes partes firman diferentes componentes.
Limitaciones de ECDSA
ECDSA funciona, pero tiene limitaciones que motivaron la introducción de firmas Schnorr con Taproot:
- No es lineal: no puedes combinar múltiples firmas en una sola
- La seguridad no tiene una reducción limpia al problema del logaritmo discreto
- Las firmas son más grandes que las de Schnorr para el mismo nivel de seguridad
- La verificación por lotes no es tan eficiente
La siguiente página explora Schnorr como alternativa moderna.