Aller au contenu principal
Cryptographie

Clé publique compressée

Une clé publique compressée stocke uniquement la coordonnée x et un préfixe indiquant la parité de y. Elle fait 33 octets au lieu de 65. Standard depuis 2014, elle réduit la taille des transactions. Toutes les clés modernes sont compressées.

Le contexte historique

Aux premiers jours de Bitcoin, les clés publiques étaient stockées au format non compressé : préfixe 0x04 suivi des deux coordonnées x et y de 32 octets chacune, soit 65 octets au total. C'est le format SEC1 standard. Mais Bitcoin n'a pas besoin de stocker y : à partir de x et de la courbe secp256k1, il n'y a que deux valeurs possibles pour y (positive ou négative modulo p).

Principe de compression

| Élément | Valeur | |---------|--------| | x | 32 octets (coordonnée abscisse) | | Préfixe | 1 octet | | → 0x02 | y est pair | | → 0x03 | y est impair | | Total | 33 octets |

Avec un seul bit (la parité de y), on retrouve y unique à partir de x via l'équation de la courbe y² = x³ + 7. L'économie est de 32 octets par clé, soit ~50 % de taille.

Gains réels en transaction

Une signature ECDSA sur Bitcoin inclut la clé publique. Une transaction P2PKH classique « payée à l'adresse » consomme ~110 vBytes avec clé compressée vs ~140 vBytes en non compressé. Sur une blockchain limitée par MB par bloc, cela permet plus de transactions par bloc et réduit les frais de chaque transaction.

| Type d'adresse | Pubkey embarquée | Taille | |----------------|-------------------|--------| | 1... (legacy non compressé) | 65 octets | + | | 1... (legacy compressé) | 33 octets | − 32 | | bc1q... (SegWit) | 33 octets | + segwit discount | | bc1p... (Taproot) | 32 octets (x-only) | − 33 % vs SegWit |

Adoption et standardisation

Les clés compressées existent depuis 2009 (le format est standard SEC1) mais le wallet de Satoshi utilisait du non compressé. Bitcoin Core 0.6 (mars 2012) introduit le support, et Bitcoin Core 0.7 (sept 2012) fait des clés compressées le défaut pour les nouvelles adresses. Depuis 2014, l'écosystème entier les utilise. Les wallets qui ne supportent que des clés non compressées sont aujourd'hui de pures curiosités.

Calcul de y à partir de x

# Pseudocode
y_squared = (x**3 + 7) mod p
y = modular_sqrt(y_squared, p)
if y is even:
    use y if prefix == 0x02 else use p - y
else:
    use y if prefix == 0x03 else use p - y

Le calcul de la racine carrée modulaire utilise l'algorithme Tonelli-Shanks, mais comme p ≡ 3 mod 4 pour secp256k1, on peut prendre y = y_squared^((p+1)/4) mod p directement.

Taproot va plus loin : x-only

Taproot (BIP-340/341, activé en novembre 2021) introduit le format x-only : on ne stocke même plus le bit de parité, on suppose y pair par convention. La clé fait alors 32 octets exactement, et la signature Schnorr accompagnante 64 octets. C'est l'étape suivante de la compression, qui économise encore un octet partout dans le protocole.

À retenir

Les clés publiques compressées sont l'optimisation invisible qui a doublé l'efficacité de Bitcoin en 2012. Avec Taproot et les pubkeys x-only, on a presque atteint le minimum théorique. Quand vous lisez une clé moderne commençant par 02 ou 03, vous savez désormais ce que ce préfixe signifie.

Termes lies

← Retour au glossaire complet

Glossaire inspire du dictionnaire de Loic Morel sur Pandul.fr.