Saltar al contenido
ecdsa.com

Recuperación de la clave pública ECDSA

El cálculo de la clave pública del firmante a partir de una firma ECDSA y el hash del mensaje (SEC 1 §4.1.6), que la firma de mensajes de Ethereum y Bitcoin usa en lugar de transmitir la clave.
También se escribekey recoveryrecovery idrecid

A partir de r, el verificador reconstruye los puntos candidatos R con coordenada x igual a r (con dos valores posibles de y; en raras ocasiones, también con r + n) y calcula Q = r⁻¹·(s·R − z·G). Un ID de recuperación selecciona el candidato: normalmente 0 o 1, según la paridad de la coordenada y de R. Ethereum lo pone en v: 27 o 28 para personal_sign y los mensajes heredados, chainId × 2 + 35 o + 36 para las transacciones EIP-155, y 0 o 1 en las transacciones tipadas. El formato de mensaje firmado de Bitcoin lo pone en un byte de encabezado (de 27 a 42 según el tipo de dirección, BIP-137).

El contrato precompilado ecrecover en la dirección 0x01 devuelve la dirección de 20 bytes de la clave recuperada; así comprueban los contratos las firmas personal_sign, EIP-712 y permit sin almacenar claves públicas. La recuperación siempre produce alguna clave a partir de una firma bien formada, así que no demuestra nada hasta que el resultado se compara con la dirección esperada; además, si falla, ecrecover devuelve la dirección cero, que los contratos deben rechazar.

La recuperación funciona con ECDSA en cualquier curva, incluida P-256. Las firmas Schnorr (BIP-340) y EdDSA no la permiten, porque la clave pública forma parte de su hash de desafío.

Estándares y referencias

Todos los términos