Les petits secrets de Bitcoin : Le SHA-256 expliqué
Bitcoin utilise beaucoup de petites astuces pour rendre sa blockchain sécurisée et ses données infalsifiables. Aujourd'hui nous allons nous pencher sur l'algorithme SHA-256 et son fonctionnement.
La blockchain Bitcoin est un petit bijou, que ce soit au niveau de la technologie, ou dans sa philosophie de manière générale. Aujourd’hui nous vous proposons de continuer à la décortiquer pour mieux comprendre son fonctionnement. Après avoir vu le fonctionnement du minage, de la difficulté et des seed phrases, nous allons plonger dans le monde merveilleux du SHA-256.
Qu’est-ce que le SHA-256 ?
Avant de nous pencher sur son fonctionnement, voyons d’abord ce qu’est le SHA-256 et surtout à quoi il sert.
Définition
SHA veut dire « Secure Hash Algorithm », soit « Algorithme de Hachage Sécurisé » en français. Le chiffre 256 indique que l’algorithme génère une chaine (le hachage ou hash en anglais) de 256 bits, soit 64 caractères hexadécimaux.
Si je passe la chaine de caractères « Graou à tous les amis » dans une fonction de SHA-256 j’obtiens « 84beb53acbb7c6d9ca136a844096a3fe73e523a6e9a122926f1c26d06e5dc199 ».
Si j’ajoute un très léger changement, comme un « ! » à la fin de la phrase, mon hash se transforme alors en « 7145c2a8df9f52923cc5ef90c8d9c416fe3a9fc36b39ccf3de12f69eb2897024 »
Comme vous le voyez, le résultat n’a plus rien à voir… le SHA-256 est magique !
Pourquoi ? Comment ? Nous allons voir cela en détail un petit peu plus bas !
D’où vient le SHA-256 ?
Cet algorithme a été inventé par la NSA aux États-Unis. Sa publication remonte alors à 2001, et le SHA-2, un algorithme incluant SHA-256 a été standardisé par la suite par le NIST (National Institute of Standards and Technology).
Depuis sa sortie en 2001, le SHA-256 n’a jamais été mis en défaut, c’est pourquoi Satoshi Nakamoto a décidé de l’intégrer à son protocole.
SHA-256 et Bitcoin
Cet algorithme est utilisé de plusieurs façons dans la blockchain Bitcoin.
Les transactions
Tout d’abord, pour vérifier l’intégrité des transactions. En effet, il est primordial de s’assurer qu’une transaction ne puisse pas être modifiée, c’est la base de la blockchain.
Comme nous l’avons vu, modifier un simple « ! » dans une phrase change complètement le hash. Il est donc impossible de pouvoir modifier la moindre virgule dans une transaction sans que le hash ne soit totalement différent.
Si quelqu’un voulait changer le montant d’une transaction effectuée, l’adresse de l’expéditeur, ou du wallet destinataire, le hash serait complètement modifié.
Et comme les blocs sont reliés entre eux avec les informations du bloc précédent, il serait impossible de modifier du contenu en chaine pour avoir quelque chose de cohérent.
Les blocs
Comme nous venons de le voir, les blocs sont organisés de manière très précise. Toutes les transactions d’un bloc sont liées aux autres dans une structure que l’on appelle « Arbre de Merkle » ou « Merkle Root » en anglais.
Chacune des transactions est hachée, via le SHA-256, puis est combinée avec une autre transaction, et hachée de nouveau. Le résultat est ensuite combiné à son tour, et ainsi de suite via un système d’entonnoir.
Nous ne nous attarderons pas ici sur l’arbre de Merkel, car c’est un élément qui demande un article à lui tout seul, nous aurons l’occasion d’en reparler.
Mais gardez en tête que cet arbre est la « mémoire » des transactions d’un bloc, et que le SHA-256 permet de condenser et sécuriser cette mémoire.
La preuve de travail
Vous savez que le consensus utilisé sur la blockchain bitcoin est le « Proof of Work » ou « preuve de travail » en français.
Chaque mineur, qui souhaite valider un bloc, doit trouver un hash valide, suivant les règles émises au moment de la transaction. La difficulté rentre en jeu dans cette partie du travail, comme nous l’avons vu dans cet article dédié.
En jouant sur un paramètre qui s’appelle le « nonce », le mineur va, via un hashage en SHA-256, tenter de trouver un hash qui correspond à l’attendu.
Mais alors, le SHA-256, comment ça marche ?
Pour calculer un hash, l’algorithme va additionner toute une série d’étapes, qui vont servir à transformer la chaine d’entrée, en un résultat qui sera unique.
Caractère vers Binaire
La première étape consiste à convertir notre chaine de caractère d’entrée en code binaire. Vous savez peut-être que chaque lettre a une traduction dans un code qui s’appelle ASCII.
Par exemple si on prend le mot « Bitcoin » (la majuscule est importante), voici la traduction en ASCII.
Lettre | B | i | t | c | o | i | n |
Transcription en ASCII | 66 | 105 | 116 | 99 | 111 | 105 | 110 |
Le code ASCII est donc converti en binaire. En effet chaque caractère ASCII est codé sur 8 bits, ce que l’on appelle un octet.
Voici ce que donne la traduction.
Lettre (ASCII) | B (66) | i (105) | t (116) | c (99) | o (111) | i (105) | n (110) |
Binaire | 01000010 | 01101001 | 01110100 | 01100011 | 01101111 | 01101001 | 01101110 |
Si on assemble la totalité de ces représentations binaires, nous obtenons donc le résultat :
« Bitcoin » = 01000010011010010111010001100011011011110110100101101110
C’est la première étape ! Voyons la suite maintenant !
Codage sur 512 bits
L’algorithme a besoin d’avoir en entrée une chaine codée sur 512 bits. Dans notre exemple avec le mot « Bitcoin » notre chaine fait seulement 56 bits (si si, vous pouvez compter, c’est bien ça !).
Nous allons donc commencer par ajouter un bit à 1 à la fin de la chaine. Ce bit permet d’indiquer que c’est la fin de notre chaine.
01000010011010010111010001100011011011110110100101101110 devient alors 010000100110100101110100011000110110111101101001011011101
Notre chaine fait maintenant 57 bits. Il en manque encore…
SHA-256 va alors ajouter des bits à 0, jusqu’à ce que la longueur totale de la chaine soit de 448 caractères.
Pourquoi 448 ? Car 448 + 64 = 512 ! Vous allez comprendre d’où vient le 64 juste après !
Nous allons donc ajouter 448-57 (longueur de la chaine actuelle) soit 391 zéros.
Voici notre chaine après ce nouvel ajout.
010000100110100101110100011000110110111101101001011011101000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
Et maintenant nous allons nous occuper des 64 derniers bits restant pour atteindre 512. Ces 64 bits vont contenir la longueur de notre chaine d’origine, le tout converti en binaire. Qu’est-ce que ça veut dire ? Voyons ça !
Notre mot « Bitcoin » avait une longueur de 56 bits, ce qui en binaire est traduit par 111000. Nous allons rajouter des 0 afin d’obtenir un codage sur 64 bits, car notre chaine une fois converti n’en fait que 6. Ça donnera donc
0000000000000000000000000000000000000000000000000000000000111000
Et maintenant si on rajoute cette partie à notre chaine précédente, on obtient donc
010000100110100101110100011000110110111101101001011011101000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000111000
Et voilà… nous avons nos 512 bits ! Et maintenant ?
Diviser si besoin
Si notre donnée d’entrée donnait un résultat supérieur à 512 bits, l’algorithme l’aurait alors divisé en plusieurs blocs, toujours de taille de 512 bits.
Et il traiterait chacun de ses blocs un par un, de manière indépendante avec les étapes qui vont suivre.
Et ensuite diviser pour mieux régner
Maintenant que nous avons notre chaine de 512 bits, l’algorithme va diviser la chaine en 16 blocs de 32 bits (16×32 = 512).
Il va ensuite prendre chacun de ces blocs, et les travailler pour en faire 64 mots de 32 bits. Cette partie est très compliquée et difficile à résumer en mots simples. Gardez à l’esprit que le but est de créer de l’entropie, c’est-à-dire introduire de l’imprévisibilité dans la donnée. En effectuant cette opération, on s’assure que le résultat final, le hash, sera unique et imprévisible même avec des données très similaires (exemple Bitcoin et bitcoin).
Si par exemple je mélange de la peinture bleue et de la peinture jaune, j’obtiens du vert. Mais si je rajoute une toute petite goutte de peinture bleue en plus, alors le résultat sera toujours vert, mais d’une teinte différente de la précédente. J’ai changé une infime partie de ma donnée d’entrée, mais le résultat final, lui, est totalement différent du précédent.
Ainsi « Bitcoin » donne en résultat final b4056df6691f8dc72e56302ddad345d65fead3ead9299609a826e2344eb63aa4
quand « bitcoin » donne 6b88c087247aa2f07ee1c5956b8e1a9f4c7f892a70e324f1bb3d161e05ca107bLa petite touche de peinture ajoutée est juste le passage du B de majuscule à minuscule.
64 étapes de transformation
Maintenant que nous avons nos 64 mots de 32 bits, l’algorithme va procéder à 64 étapes pour mélanger et transformer les données afin, encore une fois, d’ajouter une couche d’imprévisibilité.
Vous comprendrez que nous ne pouvons pas détailler ici ces 64 étapes de manière simple et compréhensible. Mais gardez en tête que chacun des 64 mots subira les 64 étapes qui consistent à mélanger, ajouter des données d’entrées, des constantes (appelées registres, au nombre de 8), et appliquer des transformations mathématiques complexes.
Pour imager le principe, imaginez que vous avez devant vous 8 petits bols (les registres) remplis de peintures de couleurs différentes.
Vous ajouter une goutte de peinture dans certains bols. Pas tous, juste ceux qui vous plaisent le plus.
Vous mélangez ensuite vos couleurs dans chacun des bols avec un pinceau. Certains gardent la teinte d’origine, d’autres auront changé, car vous avez ajouté une goutte supplémentaire d’une autre couleur.Maintenant, avec une cuillère, vous prenez un peu de la peinture du bol 1, pour la mettre dans le 2. Vous mélangez avec votre pinceau. La couleur du bol 2 a changé.
Ensuite vous prenez de la peinture du bol 2, que vous versez dans le bol 3, et vous mélangez le contenu du bol 3. Puis, vous prenez de la peinture du bol 3, pour la mettre dans le bol 4. Et ainsi de suite jusqu’à faire 64 fois cette opération.Maintenant, essayez de revenir à la teinte initiale de la peinture dans chacun des bols. C’est totalement impossible… Tout est mélangé. Alors, imaginez le résultat avec des bits…
Une fois que toutes ces opérations de cette étape sont faites, les valeurs hexadécimales des résultats sont concaténées (mises à la suite) et c’est ainsi que l’on obtient notre hash 6b9f759f7257d1c2e6b5045f785fc5f525dad1f2186363b2f7fb5b68b343e028 en sortie pour notre entrée qui était « Bitcoin ».
SHA-256 et sécurité
Maintenant que vous avez en tête les opérations effectuées par l’algorithme, vous comprenez pourquoi Satoshi a décidé de l’utiliser.
En effet, deux entrées différentes, même via une simple virgule, génèreront deux hash complètement différents. La moindre modification est immédiatement visible. De cette manière il est quasiment impossible de trouver l’entrée nécessaire à donner à l’algorithme pour retrouver un hash que l’on connait déjà. Par contre, la même entrée donnera toujours le même hash, ce qui permet de vérifier chacune des informations qui transitent, que ce soit dans un bloc ou dans un arbre de Merkle.
SHA-256 est donc un algorithme de hachage unidirectionnel. Il est impossible de retrouver la donnée d’entrée à partir de son hash si on ne la connait pas.
Il est important de préciser que SHA-256 n’est pas utilisé ici pour chiffrer / crypter les données, mais pour garantir leur intégrité. La moindre modification engendrera » un effet boule de neige » qui sera immédiatement visible.
L’algorithme sera donc utilisé en combinaison avec d’autres pour des taches comme la signature ou la validation des blocs. Mais ça… C’est une autre histoire !
Nous espérons que cet article vous aura permis de mieux comprendre le fonctionnement global de Bitcoin, en complément des autres articles déjà publiés sur le sujet. Si vous souhaitez découvrir le fonctionnement du SHA-256 de manière plus technique et complète, n’hésitez pas à consulter la page Wikipédia qui lui est dédié. Attention des connaissances pointues en informatique et en mathématique sont nécessaires pour tout comprendre.
Nous nous retrouverons bientôt pour continuer cette série, avec le fonctionnement de l’arbre de Merkel que nous avons évoqué rapidement aujourd’hui.