Outils de développement · Calculateur de hachage SHA
SHA-256 Étape par étape : remplissage, planification des messages et 64 tours
· Comment ça marche
sha-256 cryptographie API du navigateur javascript
SHA-256 complète votre entrée, la divise en blocs de 512 bits et exécute chacun 64 tours de mixage. Cet article explique chaque étape dans un langage simple sans nécessiter de connaissances en cryptographie.
Qu'arrive-t-il réellement à vos octets : la boîte noire que la plupart des développeurs n'ouvrent jamais
SHA-256 est un algorithme déterministe qui transforme toute entrée en une empreinte digitale 256-bit (32-byte). Ce qui ressemble de l’extérieur à une boîte noire est en réalité une séquence d’étapes bien définies. Comprendre ces étapes supprime le mystère et vous permet de vérifier l'exactitude, de tracer les bogues et de comprendre pourquoi le résultat est ce qu'il est. Chaque élément de l'algorithme est public ; la force vient du design, pas du secret.
L'algorithme fonctionne sur des blocs 512 bits. Si votre entrée est plus courte, elle est complétée. S'il est plus long, il est divisé en plusieurs blocs, chacun traité en séquence, la sortie de chaque bloc alimentant le suivant. Une fois tous les blocs traités, vous disposez de huit nombres 32 bits qui, concaténés ensemble, forment le résumé final 256 bits.
Remplissage : ajout d'un bit 1, de zéros et de la longueur du message 64 bits pour atteindre un multiple de 512 bits
L'étape de remplissage est déterministe et formalisée. Après votre entrée réelle, ajoutez un seul bit 1 (en pratique, l'octet 0x80 si votre entrée se termine sur une limite d'octet). Ajoutez ensuite zéro bit jusqu'à ce qu'il vous manque 64 bits d'un multiple de 512 bits. Enfin, ajoutez un codage big-endian 64-bit de la longueur d'entrée en bits. Ce remplissage garantit que chaque message est un multiple de 512 bits et code la longueur d'origine afin que des entrées identiques de longueurs différentes ne puissent pas produire le même résumé.
Pour l'entrée abc (3 octets = 24 bits), le message complété est de 512 bits (un bloc) : les trois octets 61 62 63, suivis de 0x80, suivis de zéros, suivis du Codage 64 bits de 24 (qui est 0x00...0x18 dans un champ big-endian 64 bits). Le message remplit désormais exactement un bloc 512 bits. Pour une chaîne vide, le remplissage ajoute 0x80, suivi de zéros, suivi de 0x00...0x00 (indiquant 0 bits d'entrée). Pour une entrée plus longue comme un fichier 100 octets, le remplissage remplirait le dernier bloc à 512 bits et indiquerait 800 bits de longueur d'origine.
Les valeurs initiales et les constantes sont fixées par l'algorithme ; leur origine historique est en dehors des preuves du dépôt
L'algorithme commence avec huit variables de travail 32 bits, initialisées aux premiers 32 bits des parties fractionnaires des racines carrées des huit premiers nombres premiers. Ce sont des constantes codées en dur, visibles dans toute implémentation de référence et dans le code source des bibliothèques cryptographiques. Ils existent parce que l’utilisation de constantes mathématiques fixes évite de soupçonner une porte dérobée cachée. L'outil ToolAcre utilise l'implémentation Web Crypto du navigateur, qui applique ces mêmes constantes.
L'algorithme utilise également des constantes rondes 64, dérivées des premiers 32 bits des parties fractionnaires des racines cubiques des premiers 64 nombres premiers. Ceux-ci sont également fixes et publics. Les constantes servent de matériau de mélange supplémentaire ; les changer briserait l’algorithme et produirait des résumés différents.
Le calendrier des messages – extension de 16 mots en 64 avec des équipes et des rotations
Le calendrier des messages développe 16 mots (512 bits) en 64 mots (2048 bits) via une formule spécifique. Pour les tours 0-15, les mots proviennent directement du bloc d'entrée. Pour les tours 16-63, chaque nouveau mot est calculé en prenant deux mots précédents (à des décalages spécifiques), en appliquant une rotation et un décalage, en effectuant un XOR dans un autre mot et en stockant le résultat. La formule est déterministe et réversible dans le contexte d'un bloc, mais l'expansion répartit l'influence de l'entrée sur tous les 64 tours.
La formule d'expansion utilise des opérations de rotation à droite (un décalage de bits circulaire où les bits qui tombent d'une extrémité réapparaissent à l'autre) et de décalage à droite. La rotation préserve tous les bits mais modifie leurs positions ; le décalage vers la droite supprime les bits. La combinaison de rotations, de décalages et d'opérations XOR garantit que chaque bit d'entrée influence plusieurs mots dans le planning.
Un tour — les fonctions Ch, Maj et Sigma décrites comme des opérations de mélange de bits, et comment les huit variables de travail sont mises à jour
Chacun des tours 64 traite un mot du calendrier des messages et met à jour les huit variables de travail. La fonction principale implique six opérations : un mélange conditionnel (souvent appelé Ch, pour « choisir ») qui sélectionne les bits en fonction d'une variable de contrôle, une fonction majoritaire (Maj) qui sélectionne la valeur la plus courante parmi trois variables, deux fonctions de mélange spéciales (Sigma_0 et Sigma_1) qui font pivoter et décalent les variables de travail, et l'addition modulo 2^32. Toute l'arithmétique est effectuée sur des mots de 32 bits, donc le débordement s'effectue.
La fonction "choisir" prend trois entrées 32-bit et, pour chaque position de bit, sélectionne le bit de la première entrée si un bit de contrôle est 1, ou le bit de la deuxième entrée si le bit de contrôle est 0. La fonction majoritaire examine trois entrées et, pour chaque position de bit, génère la valeur de bit qui apparaît le plus souvent parmi les trois. Il s'agit d'opérations non linéaires qui brisent la linéarité et garantissent que de minuscules changements d'entrée se propagent de manière imprévisible à travers l'état.
Chaînage de blocs et production de la sortie - ajout du résultat de chaque bloc dans l'état d'exécution
Chaque tour met à jour les huit variables de travail en les faisant pivoter et en incorporant une nouvelle valeur calculée à partir de la constante de tour actuelle, du mot de planification du message et de l'état précédent. Les sept premières variables de travail se décalent : la 8ème devient la 1ère, la 1ère devient la 2ème, et ainsi de suite. Le nouveau huitième est calculé à partir des anciennes variables à l'aide des fonctions de mixage. Après 64 tours, vous disposez de huit nouvelles valeurs 32 bits. Celles-ci sont ajoutées (modulo 2^32) aux constantes initiales, produisant l'état de hachage final pour ce bloc.
Pour un message multibloc, les huit valeurs d'un bloc deviennent l'état initial du bloc suivant. La chaîne garantit qu'un changement n'importe où dans l'entrée affecte tous les blocs suivants. Au moment où vous atteignez le bloc final, chaque bit d’entrée a influencé la sortie finale.
Exemple concret et ce que cela ne couvre pas : tracer le remplissage et le nombre de blocs pour un message court ; les preuves de sécurité sont hors de portée
Pour l'entrée abc, le message tient dans un bloc 512 bits après le remplissage. Le remplissage ajoute 424 bits, ce qui fait le total de 512 bits. Le calendrier des messages l'étend à 64 mots. Chaque tour consomme un mot et met à jour les huit variables de travail via les fonctions de mixage. Après 64 tours, l'état est XORé avec les constantes initiales, produisant le résumé final ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad.
Il s'agit d'un vecteur de test publié : le même calcul sur la même entrée produit toujours la même sortie. L'outil ToolAcre effectue ce calcul exact via l'implémentation Web Crypto du navigateur. Vous pouvez le vérifier en hachant abc et en comparant le résultat au vecteur connu. Tout navigateur qui implémente correctement Web Crypto produira le même résultat ; l'algorithme n'admet aucun raccourci ni chemin alternatif.
À retenir : Web Crypto effectue un mélange déterministe SHA-256 sans révéler de secret
L'algorithme est public et chaque étape est déterministe. Les fonctions de mélange (Ch, Maj, Sigma_0, Sigma_1) ont été choisies pour être non linéaires, ce qui signifie que la modification d'un bit d'entrée ne modifie pas de manière prévisible un bit de sortie. L'expansion des mots de message 16 en 64 garantit que l'ensemble de l'entrée influence l'ensemble du calcul. Les tours 64 et le chaînage des états signifient que la sortie est sensible à chaque bit de l'entrée, et le référentiel utilise la sortie résultante comme un résumé déterministe. La résistance aux collisions est une propriété de sécurité avec des limites, et non une promesse que les sorties en double sont mathématiquement impossibles.
Les preuves cryptographiques dépassent le cadre de cet article. Le point clé est que vous savez maintenant ce que fait réellement l’algorithme. Ce n’est pas de la magie et ce n’est pas une boîte noire. Si vous souhaitez vérifier que ToolAcre hache correctement, suivez vos propres entrées à travers ces étapes ou utilisez une implémentation de référence dans un autre langage et comparez les résultats. L'implémentation du navigateur et toute référence correcte produiront des résumés identiques pour des entrées identiques.