Blockchain/Niveau II · Mécanismes/2.1 Cryptographie/Leçon 3
Clés privées, clés publiques et secp256k1
L’entier, la courbe et la porte à sens unique
MatérielUn explorateur de blocs qui affiche les données de témoin (witness)A. M. Antonopoulos & D. A. Harding, Mastering Bitcoin, 3e éd. (2023), chap. 4
Curiosité
- Pourquoi la multiplication d’un point par un nombre prend-elle quelques millisecondes, alors que l’inversion de cette opération prendrait plus de temps que l’âge de l’univers ?
- Qu’est-ce qui différencie structurellement secp256k1 des courbes NIST utilisées dans la plupart des autres signatures numériques ?
- Comment une valeur de 32 octets peut-elle contrôler des actifs valant des milliards sans révéler qui les contrôle ?
Explorer
- Une clé privée bitcoin est un entier aléatoire compris entre 1 et n−1, où n est l’ordre du point générateur de la courbe. Ce nombre n vaut environ 1,158 × 10^77, soit un nombre à 78 chiffres, pas très loin en deçà du nombre estimé d’atomes dans l’univers observable (environ 10^80). La clé publique est obtenue par multiplication scalaire : on multiplie cet entier k par le point générateur fixe G de la courbe elliptique. Comme G est le même pour tous les utilisateurs de bitcoin, chaque valeur unique de k produit un point K unique et déterministe sur la courbe.
- La courbe secp256k1 est définie par l’équation y² = x³ + 7 sur un corps premier où p = 2^256 − 2^32 − 977. Ce jeu de paramètres a été établi dans la norme SEC 2 de Certicom. Le choix de secp256k1 en 2009 était inhabituel ; il s’agit d’une courbe de Koblitz, nommée d’après Neal Koblitz, dont la structure particulière (un endomorphisme efficacement calculable) permet une multiplication scalaire plus rapide, et dont les paramètres laissent peu de place à des choix cachés, contrairement aux courbes générées à partir de graines aléatoires inexpliquées. Satoshi Nakamoto n’a jamais expliqué ce choix.
- La multiplication scalaire est rapide car les implémentations utilisent l’algorithme double-and-add (doublement et addition), qui traite la représentation binaire de la clé privée bit par bit. Doubler un point et additionner un autre point sont des opérations de base sur la courbe que les ordinateurs exécutent en quelques microsecondes. En revanche, inverser cette opération — retrouver k à partir de K et G — constitue le problème du logarithme discret sur courbe elliptique (ECDLP). Aucun algorithme classique efficace n’est connu pour résoudre l’ECDLP sur secp256k1 ; une recherche par force brute dans l’espace des clés est irréalisable en pratique, ce qui offre une sécurité d’environ 128 bits face aux attaques classiques.
- Les clés publiques sont sérialisées dans des formats spécifiques pour le stockage et la transmission. Une clé publique non compressée fait 65 octets de long et commence par le préfixe 04 suivi des coordonnées x et y. Une clé publique compressée fait 33 octets et utilise les préfixes 02 ou 03 pour indiquer la parité de la coordonnée y, ce qui permet sa reconstruction à partir uniquement de la coordonnée x. Taproot, activé en novembre 2021, intègre une optimisation supplémentaire appelée clés x-only, qui font 32 octets et omettent complètement le préfixe, en s’appuyant sur les propriétés du schéma de signature Schnorr.
- La relation entre clé privée et clé publique est strictement à sens unique. Partager une clé publique ne révèle rien de la clé privée, car le problème du logarithme discret reste non résolu pour cette taille de courbe. À l’inverse, détenir la clé privée permet de calculer immédiatement la clé publique correspondante. Cette asymétrie constitue le fondement du modèle de propriété de bitcoin : n’importe qui peut vérifier qu’une signature a été créée par une clé privée donnée sans jamais voir la clé elle-même.
- Pour vérifier ces mécanismes, ouvrez n’importe quel explorateur de blocs et repérez une entrée de transaction. Pour une dépense SegWit native (P2WPKH), le témoin (witness) contient la signature et la clé publique compressée de 33 octets ; pour une dépense Taproot par chemin de clé, la clé de 32 octets se trouve dans la sortie elle-même et le témoin ne contient que la signature. Comparez avec l’adresse de la sortie précédente : si l’adresse est un hash de la clé publique, la clé brute apparaît ici au moment de la dépense. Notez que les coordonnées de la clé publique sont des chaînes hexadécimales représentant des points sur la courbe, à distinguer des hash de 20 et 32 octets utilisés dans les adresses SegWit version 0.
Faits clés
- La clé privée est un entier aléatoire compris entre 1 et n−1, où n ≈ 1,158 × 10^77.
- secp256k1 est défini par y² = x³ + 7 sur le corps premier p = 2^256 − 2^32 − 977.
- La multiplication scalaire k·G produit la clé publique ; son inversion (ECDLP) est irréalisable en pratique.
- Les clés publiques non compressées font 65 octets (préfixe 04) ; les clés compressées font 33 octets (préfixe 02/03).
- Taproot utilise des clés x-only de 32 octets, omettant complètement la coordonnée y et le préfixe.
- secp256k1 est une courbe de Koblitz ayant peu de paramètres non expliqués, choisie par Satoshi en 2009.
Exercice neuf, six, trois, un
9RassemblerListez 9 propriétés de secp256k1 : son équation, le nombre premier définissant son corps, l’ordre du point générateur, les tailles de clé (non compressée/compressée/x-only), le niveau de sécurité, la norme d’origine, le type de courbe, et deux faits historiques sur son adoption.
6RegrouperRegroupez les 9 en 6 : équation et corps, générateur et ordre, formats de clé, niveau de sécurité, historique des normes, et adoption.
3DistillerRéduisez les 6 à 3 raisons pour lesquelles secp256k1 convient au modèle de propriété de Bitcoin.
1CristalliserÉcrivez une phrase indiquant l’opération mathématique précise qui transforme un entier privé en un point public, et nommez le problème qui empêche de l’inverser.
Vérification des faits
Les dates, les chiffres et les affirmations ont été vérifiés à l’aide des sources publiées listées ci-dessous.