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.
Apprenez-en plus et rejoignez des personnes dans 22 pays à travers le monde dans mon cours sur la façon de devenir un programmeur Bitcoin + Blockchain.
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).
Addictions
brew
– Installation: https://brew.sh/pip
– Installation:sudo easy_install pip
libressl
– Installation:brew install libressl
base58
– Installation:pip install base58
Remarque: pour lire le contenu
openssl
commandes cli, j’ai installélibressl
de sorte que certaines des commandes de courbe elliptique fonctionnent car la version actuelle de openssl cli sur mac a un bogue.
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.
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.
Lisez aussi: Un guide ultime du portefeuille papier Bitcoin
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).
Remarque: SHA256 est une fonction déterministe à sens unique, ce qui signifie qu’elle est facile à calculer dans une direction, mais ne peut pas être inversée. Pour trouver une sortie spécifique, vous devez essayer toutes les entrées possibles jusqu’à obtenir la sortie souhaitée (forçage brutal) et elle produira toujours la même sortie respectivement avec la même entrée.
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.
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, 0x02
est précédé de valeurs y positives et 0x03
est 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 0x02
car 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
Notez que puisque l’entrée est une chaîne, le
xxd -r -p
convertira la chaîne hexadécimale en binaire, puis la générera dans le style hexdump (ascii), ce que les fonctions de hachage d’OpenSl attendent en entrée.
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.
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
Remarque:
-c
indique qu’une somme de contrôle doit être appliquée. La somme de contrôle est calculée comme checksum = SHA256 (SHA256 (préfixe + données)) et seuls les 4 premiers octets du hachage sont ajoutés à la fin des données.
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