a
a
Weather:
city not found
HomeBitcoinComment générer une adresse Bitcoin – étape par étape | par Jordan Baczuk | Coinmonks

Comment générer une adresse Bitcoin – étape par étape | par Jordan Baczuk | Coinmonks

Voici un script bash qui fait ce qui est décrit ci-dessous: https://bit.ly/2MIgeOD

Il s’agit d’un guide technique pratique sur la génération d’adresses Bitcoin, y compris les clés privées et publiques, et la cryptographie impliquée.

Ce guide vous guidera à travers toutes les étapes pour générer une adresse Bitcoin en utilisant la ligne de commande sur un Mac. Des étapes similaires devraient être possibles sur d’autres systèmes d’exploitation utilisant des outils cryptographiques similaires. Lignes commençant par $ désignent des commandes de terminal, que vous pouvez saisir et exécuter (sans le $ De toute évidence).

Terminal Mac (iTerm 2)

Addictions

  • brew – Installation: https://brew.sh/
  • pip – Installation: sudo easy_install pip
  • libressl – Installation: brew install libressl
  • base58 – Installation: pip install base58

Découvrez et passez en revue les meilleurs produits Bitcoin

Chiffrement à clé publique

Ou le cryptage asymétrique, est un type de cryptage qui utilise des paires de clés, dont chacune est unique. La paire de clés comprend une clé publique et une clé privée. C’est le type de cryptographie que Bitcoin utilise pour contrôler les fonds. Une clé publique peut être générée à partir d’une clé privée, mais pas l’inverse (trop difficile d’un point de vue informatique). En outre, quelque chose de chiffré avec une clé privée peut être déchiffré avec la clé publique et vice versa, de sorte qu’ils sont asymétriques.

Cryptage asymétrique

Cas d’utilisation

  • Cryptage: lorsqu’un utilisateur dispose d’une clé publique, un message peut être crypté à l’aide d’une clé publique, qui ne peut être lue que par la personne possédant la clé privée. Cela fonctionne également en sens inverse.
  • Signatures numériques: un utilisateur peut, avec sa clé privée et un hachage de certaines données, utiliser un algorithme de signature numérique tel que ECDSA, pour calculer une signature numérique. Ensuite, un autre utilisateur peut utiliser l’algorithme pour vérifier cette signature à l’aide de la clé publique et du hachage des mêmes données. S’il est passé, cela signifie que l’utilisateur a effectivement envoyé un message spécifique, qui n’a pas été falsifié.
  • Empreinte digitale: c’est un moyen de représenter un ensemble de données arbitrairement grand en le hachant pour générer une empreinte digitale de taille standard. Cette empreinte digitale serait si difficile à reproduire sans les mêmes données exactes, qu’on peut supposer qu’elle n’a pas été falsifiée.

Les clés privées sont ce qui prouve que vous pouvez envoyer du Bitcoin qui vous a été envoyé. C’est comme le mot de passe de votre compte bancaire. Si vous le perdez ou que quelqu’un d’autre le prend, vous portez un toast.

Les clés publiques aident les gens à savoir comment vous envoyer des Bitcoins.

Génération de clés privées

Les clés privées peuvent être n’importe quelle valeur de 256 bits (32 octets) à partir de 0x1 pour 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140

Le nombre total possible de clés privées est donc de 2²⁵⁶ ou 1,16 x 10⁷⁷. Imaginez le nombre total d’atomes dans votre corps, puis imaginez que chacun de ces atomes est une terre. Le nombre total d’atomes sur toutes ces terres est d’environ 7 x 10 ². Il n’y a pratiquement aucune chance que votre clé privée aléatoire soit jamais générée ou trouvée aléatoirement par quelqu’un d’autre.

Un moyen courant (mais pas le plus sûr) de créer une clé privée consiste à commencer par une graine, telle qu’un groupe de mots ou de phrases de passe choisis au hasard. Cette graine est ensuite passée à travers l’algorithme SHA256, qui générera toujours de manière pratique une valeur de 256 bits. Cela est possible car chaque caractère sur l’ordinateur est représenté par un entier (voir ASCII et Unicode).

La valeur de départ peut être utilisée pour générer la même clé privée si le même algorithme de hachage sera utilisé à l’avenir, il vous suffit donc d’enregistrer la valeur de départ.

$ echo "this is a group of words that should not be considered random anymore so never use this to generate a private key" | openssl sha256a966eb6058f8ec9f47074a2faadd3dab42e2c60ed05bc34d39d6c0e1d32b8bdf

Cette clé privée est soit hexadécimale soit en base 16. Chaque 2 chiffres représente 8 bits ou 1 octet. Donc, avec 64 caractères, il y a 256 bits au total.

Génération de clé publique

Les clés publiques sont générées à partir de clés privées dans Bitcoin en utilisant la courbe elliptique (secp256k1) multiplication à l’aide de la formule K = k * G, où est-ce K est la clé publique, k est la clé privée et G est une constante appelée Generator Point⁴, qui pour secp256k1 c’est la même chose que:

04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8

On ne semble pas savoir comment ce point a été choisi par les concepteurs de la courbe. De plus, cet algorithme est un algorithme unidirectionnel ou une fonction de «trappe» de sorte qu’une clé privée ne peut pas être dérivée de la clé publique. Il est important de noter que la multiplication de la courbe elliptique n’est pas la même chose que la multiplication scalaire, bien qu’elle partage des propriétés similaires.

Exemple de courbe elliptique

Pour ce faire dans le terminal à partir de notre clé privée plus tôt,

$ openssl ec -inform DER -text -noout -in <(cat <(echo -n "302e0201010420") <(echo -n "a966eb6058f8ec9f47074a2faadd3dab42e2c60ed05bc34d39d6c0e1d32b8bdf") <(echo -n "a00706052b8104000a") | xxd -r -p) 2>/dev/null | tail -6 | head -5 | sed 's/[ :]//g' | tr -d 'n' && echo043cba1f4d12d1ce0bced725373769b2262c6daa97be6a0588cfec8ce1a5f0bd092f56b5492adbfc570b15644c74cc8a4874ed20dfe47e5dce2e08601d6f11f5a4

Cette clé publique contient un préfixe 0x04 et les coordonnées x et y sur la courbe elliptique secp256k1, respectivement.

Clé publique compressée

La plupart des portefeuilles et des nœuds implémentent la clé publique compressée comme format par défaut car elle fait la moitié de la taille d’une clé non compressée, ce qui économise de l’espace sur la blockchain. Pour convertir une clé publique non compressée en une clé publique compressée, vous pouvez omettre la valeur y car la valeur y peut être résolue en utilisant l’équation de la courbe elliptique: y² = x³ + 7. Puisque l’équation résout pour y², le droit côté de l’équation peut être positif ou négatif. Donc, 0x02est précédé de valeurs y positives et 0x03est précédé des négatifs. Si le dernier chiffre binaire de la coordonnée y est 0, le nombre est pair, ce qui est positif. S’il vaut 1, il est négatif. La version compressée de la clé publique devient:

023cba1f4d12d1ce0bced725373769b2262c6daa97be6a0588cfec8ce1a5f0bd09

Le préfixe est 0x02car la coordonnée y se termine par 0xa4, ce qui est égal, donc positif.

Génération d’adresse

Il existe actuellement plusieurs types d’adresses Bitcoin P2SH o Le hachage pay-to-script est la valeur par défaut pour la plupart des portefeuilles. P2PKH c’était le prédécesseur et signifie Pay to Public Key Hash. Les scripts offrent plus de fonctionnalités, c’est pourquoi ils sont plus populaires. Nous allons d’abord générer un fichier P2PKH adresse au format d’origine, suivie de la norme actuelleP2SH .

Hacher

La clé publique de la sortie précédente est d’abord hachée à l’aide de sha256 puis hacher en utilisant ripemd160 . Cela réduit le nombre d’octets de sortie et garantit qu’en cas de relation inattendue entre la courbe elliptique et sha256, une autre fonction de hachage non liée augmenterait considérablement la difficulté d’inverser l’opération:

$ echo 023cba1f4d12d1ce0bced725373769b2262c6daa97be6a0588cfec8ce1a5f0bd09 | xxd -r -p | openssl sha256
(stdin)= 8eb001a42122826648e66005a549fc4b4511a7ad3fc378221aa1c73c5efe77ef
$ echo 8eb001a42122826648e66005a549fc4b4511a7ad3fc378221aa1c73c5efe77ef | xxd -r -p | openssl ripemd160
(stdin)= 3a38d44d6a0c8d0bb84e0232cc632b7e48c72e0e

Codage

Maintenant que nous avons haché la clé publique, exécutons maintenant base58check codage. Base58check vous permet d’afficher le hachage de manière plus compacte (en utilisant plusieurs lettres de l’alphabet) en évitant les caractères qui pourraient être confondus les uns avec les autres tels que 0 et O où une faute de frappe pourrait entraîner une perte de fonds. Une somme de contrôle est appliquée pour garantir que l’adresse a été transmise correctement sans aucune corruption de données telle que des erreurs de frappe.

Table de codage Base58

Format d’adresse

Bitcoin P2PKH les adresses commencent par la valeur d’octet de version 0x00 qui indique le type d’adresse et se termine par une somme de contrôle de 4 octets. Nous ajoutons d’abord l’octet de version (préfixe) à notre hachage de clé publique et calculons et ajoutons la somme de contrôle avant de l’encoder en utilisant base58 :

$ echo 003a38d44d6a0c8d0bb84e0232cc632b7e48c72e0e | xxd -p -r | base58 -c && echo
16JrGhLx5bcBSA34kew9V6Mufa4aXhFe9X

La valeur résultante est un P2PKH adresse qui peut être utilisée pour recevoir du Bitcoin: 16JrGhLx5bcBSA34kew9V6Mufa4aXhFe9X

Hash Pay-to-Script

Le nouveau type d’adresse par défaut est un hachage pay-to-script, où au lieu de payer pour un hachage pubKey, c’est un hachage de script. Bitcoin a un langage de script, vous pouvez en savoir plus ici. Cela permet essentiellement à des choses comme plusieurs exigences de signature d’envoyer des Bitcoins ou un délai avant que vous ne soyez autorisé à envoyer des fonds, etc. Un script couramment utilisé est un P2WPKH (Pay to Witness Public Key Hash): OP_0 0x14 <PubKey Hash> où le hachage PubKey est le fichier RIPEMD160 du SHA256 de la clé publique, comme précédemment, et 0x14 est le nombre d’octets dans le hachage PubKey. Donc, pour transformer ce script en adresse, il vous suffit de postuler BASE58CHECK à la RIPEMD160 du SHA256 du script OP_0 0x14 <PubKey Hash> sauf préfixer 0x05 au script de hachage au lieu de 0x00 pour indiquer le type d’adresse est un P2SH adresse.

$ echo 00143a38d44d6a0c8d0bb84e0232cc632b7e48c72e0e | xxd -r -p | openssl sha256
(stdin)= 1ae968057eaef06c3e13439695edd7a54982fc99f36c3aa41d8cc41340f30195
$ echo 1ae968057eaef06c3e13439695edd7a54982fc99f36c3aa41d8cc41340f30195 | xxd -r -p | openssl ripemd160
(stdin)= 1d521dcf4983772b3c1e6ef937103ebdfaa1ad77
$ echo 051d521dcf4983772b3c1e6ef937103ebdfaa1ad77 | xxd -p -r | base58 -c && echo
34N3tf5m5rdNhW5zpTXNEJucHviFEa8KEq

Si vous aimez l’article, consultez mon cours sur la façon de devenir un programmeur Bitcoin + Blockchain.

https://medium.com/coinmonks/how-to-generate-a-bitcoin-address-step-by-step-9d7fcbf1ad0b

No comments

leave a comment