Comment obtenir une adresse en partant d’une clé privée Bitcoin ?

La clé publique s’obtient en dérivant un nombre aléatoire qui nous sert de clé privée, et non l’inverse. Mais alors, comment retrouver sa clé publique lorsque l’on a seulement sa clé privée ?

Cet article est une traduction d’un billet posté sur Medium par Antoine Poinsot, enthousiaste Bitcoin et membre de Crypto Lyon

procedure-obtenir-une-adresse
Crédits : Andreas Antonopoulos : https://github.com/bitcoinbook/bitcoinbook

Il existe une autre méthode

Pour votre information, ce n’est pas la seule façon d’obtenir une adresse Bitcoin. D’ailleurs, je suis à peu près certain que votre wallet favori n’utilise pas cette méthode afin de produire une adresse compatible avec Segwit : une adresse qui n’est pas créée à partir d’une clé publique, mais à partir d’un script (un ensemble d’opérations décrivant la manière dont vos bitcoins peuvent être dépensés, un smart contract)

Comment obtenir une clé privée ?

On « n’obtient » pas une clé privée, on la « génère ». Vous demandez le droit d’avoir un compte bancaire, vous vous l’octroyez vous-même pour un compte Bitcoin. La clé privée n’est rien de plus qu’un nombre aléatoire : pour générer une clé privée, vous avez « juste » à générer un nombre aléatoire. Je mets « juste » entre guillemets puisqu’il est impossible de générer un nombre aléatoire en informatique : vous avez besoin d’une source d’entropie (une source de hasard), par exemple, bitadress utilise vos mouvements de souris en tant que source d’entropie.

Comment obtenir une clé publique ?

Une clé publique est dérivée d’une clé privée. Pour dériver la clé publique, vous avez besoin d’une courbe elliptique, Bitcoin utilise secp256k1. Votre clé publique est votre clé privée multipliée par le point générateur (qui est une constante définie dans la norme secp256k1), qui est donc un point sur cette fameuse courbe elliptique.

La sécurité de cette opération se base sur le fait que, pour une courbe elliptique, vous pouvez « multiplier », mais vous ne pouvez pas diviser : vous ne pouvez pas retrouver la clé privée en divisant votre clé publique par le point générateur. Vous pouvez trouver plus d’information sur ce processus ici.

Comment obtenir l’adresse ?

L’adresse est une portion encodée d’un hash de votre clé publique. Prenons, cette fois, un exemple concret :

  • Générez une clé privée aléatoire.

EDCC6224FEE390A57C76C13A9BECC9502A6F3B1BF6F72B6ED11B83A0F0E3E9FC

  • Dérivez la clé publique à partir de cette dernière :

04F3DF70315E569BBF9FB427DA65E60CE2E3660EA83EC8A8523DA4DE6901F7988E9E460CD594F27C9F6007A277820F3C1D8BB8485E1FCA38F37BCF9DC1A2DFA2A0

  • Passez-la au travers de la fonction sha256, puis la fonction ripemd160 :

C0CBEC6E4B3F537A68F64F65B68998158E211B92

  • Ajoutez 00 au début. “Ce sont les « network bytes ». Ce sont les octets indiquant le réseau, on évite de cette manière les confusions lors du paiement à une adresse : une adresse d’un réseau différent commencera différemment.

00C0CBEC6E4B3F537A68F64F65B68998158E211B92

  • Puis, prenez les 4 premiers bytes (octets) du hash sha256 de ce mot, et ajoutez-les à la fin.

Le hash avec, en gras, les quatre premiers octets :
B4AE3A0DCF1AAD584327FDB0974BBCBE3E19C2A6A2F9A29D7303C3A0D526910F

Le résultat :
00C0CBEC6E4B3F537A68F64F65B68998158E211B92B4AE3A0D

  • Puis, encodez-le avec la fonction base58check :

1JaR2gwbg2vFvgHvshaL61HmCitaCGaBgQ

Comment coder tout ça ?

Si vous êtes un développeur qui s’intéresse à la manière dont ces fonctions sont codées, vous pouvez aller voir l’implémentation Python que j’ai faite pour ma bibliothèque Bitcoin sur github, voici des liens vers des fonctions spécifiques :

Sources : Medium || Image from Shutterstock

Antoine Poinsot

Yet another Bitcoin promoter. [email protected] ~ github.com/darosior ~ crypto-lyon.fr