Dans cet article nous allons vous expliquer en quoi consistent les clés privées, les clés publiques et les adresses sur le réseau monétaire Bitcoin. Nous allons voir quels sont leurs rôles et comment elles sont générées par votre portefeuille.
Dans un précédent article, nous expliquions comment générer une mnémonique, une graine et des clés étendues. Vous pouvez le découvrir en cliquant ici : Création d'un portefeuille Bitcoin : entropie, phrase, graine et clés étendues.
Le rôle des clés.
Pour rappel, les bitcoins sont représentés sur le réseau éponyme par des UTXOs. Des sortes de petits morceaux de bitcoins attachés à un propriétaire. Ces fractions de bitcoins, représentés par des UTXOs, sont liés à une clé publique Bitcoin sur le réseau. Souvent, ils seront liés à une adresse qui n'est qu'une représentation d'une clé publique, nous le verrons plus tard.
Pour que le réseau accepte de débloquer ces UTXOs afin de les envoyer vers une nouvelle clé publique, le détenteur de la clé publique actuelle doit pouvoir prouver qu'il en est bien le propriétaire légitime. Pour ce faire, il va générer une signature à partir de la clé privée associée à la clé publique qui détient des bitcoins.
Cette signature est infalsifiable. Elle permet au propriétaire de prouver à tout le monde qu'il possède bien la clé privée associée aux bitcoins, sans dévoiler ladite clé.
La clé publique et la clé privée sont liées mathématiquement grâce à l'algorithme de signature numérique ECDSA (Elliptic Curve Digital Signature Algorithm) et plus récemment Schnorr depuis la mise à jour Taproot. La courbe elliptique utilisée dans le cas de Bitcoin pour ces deux algorithmes est secp256k1 définie par :
y² = x³ + 7
Les clés privées et publiques.
Un portefeuille Bitcoin HD dispose d'une clé privée étendue et d'une clé publique étendue. Ce sont ces clés parents qui vont permettre de dériver des paires de clés enfants.
Pour rappel, la clé privée étendue (xprv) est obtenue en regroupant la clé privée maîtresse et le code de chaîne maître. La clé publique étendue (xpub) est obtenue en regroupant la clé publique dérivée de la clé privée étendue (ECDSA) et le code de chaîne maître.
Pour dériver une paire de clés enfants, le portefeuille va passer la clé publique étendue (xpub) dans la fonction HMAC-SHA512 avec un index de 32 bits. Cet index représente la numérotation des clés enfants. C'est ce qui permet d'obtenir à chaque fois une clé enfant différente des précédentes.
Le condensat de 512 bits qui est obtenu est alors séparé en 2 parties. Les premiers 256 bits seront additionnés à la clé privée étendue (xprv) et remodulés dans un format de 256 bits afin d'obtenir une clé privée enfant utilisable sur secp256k1 (courbe elliptique utilisée pour ECDSA et Schnorr sur Bitcoin).
Les 256 bits de droite du condensat représenteront le code de chaine enfant #0.
A partir de ces informations, l'utilisateur pourra soit utiliser directement la clé enfant générée, soit utiliser cette paire de clé enfant pour générer d'autres paires de clés petit-enfants. C'est la particularité du portefeuille déterministe hiérarchique : on peut dériver beaucoup de clés enfants en arbre et reconstruire l'intégralité de cet arbre en ayant seulement connaissance de la graine.
Les adresses.
A partir de ces informations, l'utilisateur peut donc donner sa clé publique enfant à un expéditeur qui souhaite lui envoyer des fonds.
Il peut également choisir d'utiliser une adresse de réception. Une adresse de réception est un hash d'une clé publique auquel on va appliquer un format compact spécifique.
Tout comme une clé publique, une adresse peut recevoir des UTXOs. En revanche, lors de la dépense des bitcoins associés à une adresse, il faudra dévoiler sa clé publique associée.
Les adresses permettent donc de compacter une clé publique. Les avantages sont de pouvoir économiser de la place dans les transactions de réception, d'ajouter une couche cryptographique et d'utiliser des formats plus jolis et plus courts. Une adresse inclut également une somme de contrôle permettant d'éviter les erreurs de frappes.
Pour obtenir une adresse Bitcoin, il va falloir premièrement hacher une clé publique enfant. Bitcoin utilise deux fonctions pour réaliser cela : d'abord SHA256 puis RIPEMD160. Pour comprendre plus en détails le fonctionnement des fonctions de hachage cryptographiques, nous vous conseillons de lire cet article : Le hachage cryptographique et Bitcoin.
Il sera ensuite appliqué un format au condensat obtenu. Il existe différents formats en fonction des scripts utilisés. Par exemple, une adresse Segwit est obtenue en appliquant le format Bech32, également connu sous le nom de "bc1 adresse" à cause de ses premiers caractères.
Ces Adresses Bitcoin ne doivent être utilisées qu'une fois. Elles ne sont pas à usage unique, puisque si vous renvoyez 2 fois des fonds vers une même adresse vous recevrez tout de même les fonds. Mais vous devez les utiliser comme si elles étaient à usage unique. En effet, la réutilisation d'adresses implique une forte perte de confidentialité, à la fois pour l'utilisateur, mais également pour tous ceux qui font des transactions avec l'utilisateur qui a cette mauvaise pratique.
Aujourd'hui, les portefeuilles HD vous permettent de générer facilement un très grand nombre d'adresses. Utilisez cette fonctionnalité afin de respecter cette bonne pratique.