Aller au contenu
ecdsa.com

Récupération de la clé publique ECDSA

Le calcul de la clé publique du signataire à partir d’une signature ECDSA et du condensat du message (SEC 1 §4.1.6), que la signature de messages Ethereum et Bitcoin utilise au lieu de transmettre la clé.
Autres graphieskey recoveryrecovery idrecid

À partir de r, le vérificateur reconstruit les points candidats R de coordonnée x égale à r (deux valeurs de y et, rarement, r + n) et calcule Q = r⁻¹·(s·R − z·G). Un identifiant de récupération sélectionne le candidat, généralement 0 ou 1 selon la parité de la coordonnée y de R. Ethereum le place dans v : 27 ou 28 pour personal_sign et les messages au format historique, chainId × 2 + 35 ou + 36 pour les transactions EIP-155, et 0 ou 1 dans les transactions typées. Le format de message signé de Bitcoin le place dans un octet d’en-tête (de 27 à 42 selon le type d’adresse, BIP-137).

Le contrat précompilé ecrecover, à l’adresse 0x01, renvoie l’adresse de 20 octets de la clé récupérée ; c’est ainsi que les contrats vérifient les signatures personal_sign, EIP-712 et permit sans stocker de clés publiques. Pour une signature bien formée, la récupération donne toujours une clé : elle ne prouve donc rien tant que le résultat n’a pas été comparé à l’adresse attendue, et en cas d’échec ecrecover renvoie l’adresse zéro, que les contrats doivent rejeter.

La récupération fonctionne pour ECDSA sur n’importe quelle courbe, P-256 comprise. Les signatures Schnorr (BIP-340) et EdDSA ne la permettent pas, car leur challenge est un condensat qui inclut la clé publique.

Normes et références

Tous les termes