Cómo se produce una firma.
RSA PSS, ECDSA y EdDSA paso a paso: qué se calcula, qué se verifica y dónde está el riesgo.
Los artículos anteriores presentaron las piezas: una función resumen que condensa el documento, y un problema matemático difícil, la factorización o el logaritmo discreto, que separa la clave privada de la pública. Este artículo las ensambla. Recorre, ecuación por ecuación, los tres esquemas de firma que dominan la práctica (RSA PSS, ECDSA y EdDSA) y se detiene donde suelen fallar, que casi nunca es en la matemática.
El esqueleto común
- Resumir. Se calcula H(m) sobre los bytes exactos que se van a firmar. A partir de aquí, el documento sólo existe a través de su resumen.
- Transformar con la clave privada. Cada esquema convierte el resumen en una firma mediante una operación que sólo puede hacer quien tiene la clave privada.
- Distribuir. El documento viaja con la firma y, normalmente, con el certificado que vincula la clave pública con una identidad.
- Verificar. El receptor recalcula el resumen y comprueba, con la clave pública, que la firma corresponde a ese resumen. Un solo bit distinto en el documento o en la firma hace fallar la comprobación.
En RSA, como se vio en el artículo dedicado a ese algoritmo, la transformación es directa: el resumen, con relleno PSS, se eleva al exponente privado. Las firmas de logaritmo discreto funcionan de otra manera, y vale la pena verlas en detalle.
ECDSA, ecuación por ecuación
ECDSA tiene una genealogía larga. Taher ElGamal propuso en 1985 la primera firma basada en el logaritmo discreto. Claus Schnorr publicó en 1989 una variante más simple y elegante, pero la patentó. NIST, buscando un esquema libre, adoptó en 1991 una variante de ElGamal, el DSA, normalizado en FIPS 186 en 1994. Scott Vanstone propuso en 1992 llevarlo a curvas elípticas, y ECDSA quedó estandarizado a fines de esa década. Hoy lo especifican FIPS 186 5 y SEC 1.
Los parámetros son una curva, un punto generador G de orden primo n, la clave privada d y la pública Q = d · G. Sea z el resumen del mensaje, tomado como número y truncado al tamaño de n.
¿Por qué funciona? Porque, si todo es legítimo, u1 · G + u2 · Q = w(z + r · d) · G, y w(z + r · d) = k por la forma en que se construyó s. El verificador reconstruye el punto R sin conocer ni k ni d. Con la curva de juguete de 19 puntos del artículo anterior se puede seguir a mano: con d = 7, k = 10 y z = 3, sale r = 7 y s = 9; el verificador calcula u1 = 13, u2 = 5 y obtiene 13 · G + 5 · Q = 48 · G = 10 · G, cuya coordenada x es 7. Coincide.
El laboratorio siguiente hace lo mismo con números reales: genera un par de claves sobre P 256 en el navegador, usando la criptografía integrada de la plataforma, y firma y verifica el texto que se escriba.
La clave privada nunca sale de este navegador ni se muestra. Firme dos veces el mismo texto: r y s cambian cada vez, porque ECDSA usa un número aleatorio nuevo en cada firma, y ambas verifican.
El nonce: una pieza minúscula con todo el riesgo
En ECDSA, el número k es tan secreto como la clave privada. Si se filtra, la ecuación de s tiene una sola incógnita, d, y se despeja. Pero el error más famoso no es filtrarlo sino repetirlo. Si dos mensajes distintos se firman con el mismo k, las dos firmas comparten r, y basta restar:
Esto no es una curiosidad académica. En 2010 se mostró que una consola de videojuegos muy difundida firmaba su software con un k constante, y su clave maestra quedó expuesta. En 2013, un defecto del generador aleatorio en una plataforma móvil hizo que monederos de criptomonedas repitieran nonces, y hubo robos. El artículo de esta serie dedicado a fallas reales vuelve sobre ambos casos.
Ni siquiera hace falta repetir. Si los nonces tienen un sesgo pequeño, por ejemplo si los primeros bits suelen ser cero porque la implementación filtra su longitud a través del tiempo de cálculo, unas cientos o miles de firmas permiten reconstruir la clave mediante técnicas de retículos. Por eso existe el RFC 6979, que define cómo derivar k de forma determinista a partir de la clave privada y el mensaje, con HMAC. Las firmas siguen siendo ECDSA estándar, verificables por cualquiera, pero dejan de depender de un buen generador aleatorio en el momento de firmar.
EdDSA: Schnorr, determinista y completo
La patente de Schnorr venció en 2008, y en 2011 Daniel Bernstein y un equipo de cuatro coautores publicaron Ed25519, una firma de tipo Schnorr sobre la curva de Edwards equivalente a Curve25519. Fue diseñada para eliminar de raíz los errores de ECDSA.
- Nonce determinista por diseño. r se deriva del secreto y del mensaje. Firmar dos veces lo mismo da la misma firma; firmar mensajes distintos da nonces independientes. No hay generador aleatorio que pueda fallar en el momento crítico.
- Sin inversiones modulares. La ecuación de Schnorr es lineal, más simple de implementar en tiempo constante.
- Fórmulas completas. La suma en la curva de Edwards no tiene casos especiales, así que el código no se ramifica según los datos.
- Reducción de seguridad clara. Las firmas de Schnorr tienen pruebas de seguridad en el modelo de oráculo aleatorio más limpias que las de ECDSA.
Hay un detalle que importa para documentos grandes. EdDSA puro resume el mensaje completo dos veces, una para el nonce y otra para el desafío, lo que obliga a recorrerlo dos veces. Para los casos en que eso es un problema existe la variante con resumen previo, Ed25519ph, a costa de que la seguridad pase a depender también de que esa función resumen previa resista colisiones, algo que la versión pura no necesita.
Los tres, lado a lado
| RSA PSS 3072 | ECDSA P 256 | Ed25519 | |
|---|---|---|---|
| Seguridad | 128 bits | 128 bits | unos 128 bits |
| Clave pública | 384 bytes | 64 bytes (33 comprimida) | 32 bytes |
| Firma | 384 bytes | 64 bytes (unos 72 en DER) | 64 bytes |
| Aleatoriedad al firmar | sal; si falla, la seguridad se degrada sin exponer la clave | nonce crítico, salvo RFC 6979 | ninguna |
| Firmar | lento | rápido | muy rápido |
| Verificar | muy rápido | moderado | rápido |
| Normas | RFC 8017, FIPS 186 5 | FIPS 186 5, SEC 1 | RFC 8032, FIPS 186 5 |
En firma de documentos con valor legal conviven los tres. RSA domina por herencia y porque los dispositivos seguros de creación de firma lo soportan desde hace décadas; ECDSA crece con los documentos de identidad y los certificados nuevos; EdDSA, aceptado por NIST desde 2023, es la opción natural para sistemas que se diseñan desde cero. Para quien verifica, lo importante es que el esquema y sus parámetros estén identificados sin ambigüedad en la firma, de modo que pueda reproducirse la comprobación dentro de veinte años.
Toda firma resume el documento y transforma el resumen con la clave privada; verificar es rehacer el resumen y comprobar la relación con la clave pública. ECDSA firma con s = k1(z + r · d) y su punto débil es el nonce k: repetirlo, filtrarlo o sesgarlo entrega la clave. EdDSA deriva el nonce del mensaje y usa fórmulas completas, cerrando esa puerta por diseño.
Fuentes
- NIST, FIPS 186 5, Digital Signature Standard, 2023
- IETF, RFC 8017, PKCS #1: especificación criptográfica de RSA, versión 2.2, 2016
- Bellare y Rogaway, «The Exact Security of Digital Signatures: How to Sign with RSA and Rabin», Eurocrypt 1996
- SECG, SEC 1: Elliptic Curve Cryptography, versión 2.0, 2009
- IETF, RFC 6979, uso determinista de DSA y ECDSA, 2013
- Bernstein, Duif, Lange, Schwabe y Yang, «High speed high security signatures», CHES 2011
- IETF, RFC 8032, algoritmo de firma digital sobre curvas de Edwards (EdDSA), 2017