Qu'est-ce que l'algorithme SHA-2 ?
Si vous avez lu notre autre article, vous avez probablement une assez bonne idée de la raison pour laquelle nous utilisons SHA-2 et de ce qu'il fait dans son ensemble. Maisque se passe-t-il réellement lorsque nous zoomons ?Comment pouvons-nous prendre une phrase comme « le hachage est compliqué » et la mettre en ligne Calculatrice SHA-256 , et on obtient un hachage comme celui-ci :
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Comment une simple lettre « A » nous donne-t-elle quelque chose d’aussi complexe ?
559aead08264d5795d3909718cdd05abd49572e84fe55590eef31a88a08fdffd
Comment l’ensemble de la Déclaration d’Indépendance peut-il aboutir à quelque chose d’aussi semblable à une seule lettre, mais aussi avec des valeurs si différentes ?
639505bee7bdae68f224b0d5bcb1c324d0e33011d2302839b7bedfab4515a1bb
Que se passe-t-il réellement à l’intérieur de l’algorithme SHA-2 ?
Comment fonctionne l'algorithme SHA-2 ?
Nous allons enquêtercomment fonctionne l'algorithme SHA-2 à travers un exemple, en passant par chaque étape qui prend en compte notre message, « le hachage est compliqué », et nous donne d'une manière ou d'une autre le résultat alambiqué de :
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Nous présenterons SHA-256 car c’est l’itération la plus couramment utilisée. SHA-224, SHA-384, SHA-512, SHA-512/224 et SHA-512/256 fonctionnent tous de la même manière, sauf queles deux premiers algorithmes ont une taille de bloc de 512 bits, tandis que les quatre derniers ont une taille de bloc de 1 024 bits.Notez que SHA-384, SHA-512, SHA-512/224 et SHA-512/256 incluent également 80 tours, au lieu des 64 que nous allons décrire.
Ils utilisent également des nombres d’entrée légèrement différents à différents points de l’algorithme. SHA-512/224 et SHA-512/256 sont des versions tronquées de SHA-512, ce qui signifie que le hachage final correspond respectivement aux 224 ou 256 bits les plus à gauche.Vous pouvez vous référer à FIPS180-4 pour les détails.
Conversion en binaire
Lorsque nous entrons « le hachage est compliqué » dans une fonction de hachage SHA-256, la première chose qui se produit est que les données sont converties en binaire. Pour simplifier l'explication, c'est essentiellement parce queles humains et les machines parlent, comprennent et travaillent dans des langues différentes. Même s’il est facile pour nous de penser avec des mots, les ordinateurs font tout cela avec des zéros et des uns. Chaque fois que nous les utilisons, ils convertissent nos lettres et nos mots dans le langage binaire qu’ils comprennent afin de pouvoir effectuer des calculs. Cependant, tout cela se fait généralement sans que nous nous en rendions compte, ce qui nous offre une expérience utilisateur fluide.
Nous convertissons les lettres, les chiffres et les symboles en binaire en utilisant le Code standard américain pour l'échange d'informations (ASCII) , qui est essentiellement un système sur lequel un comité de personnes intelligentes s'est mis d'accord pour traduire entre les deux langues.
Si nous nous tournons vers un Tableau ASCII , nous pouvons voir que la première lettre de notre phrase, un « h » minuscule, s'écrit « 01101000 » en binaire. Selon le même tableau, un « a » minuscule est « 01100001 », tandis qu'un « s » est « 01110011 » et un « h » est « 01101000 ». La lettre « i » est « 01101001 », tandis que « n » est « 01101110 » et « g » est « 01100111 ». Le code binaire d'un espace est répertorié dans le tableau en haut de la deuxième colonne sous le caractère ASCII « SP », dans la même ligne que le nombre décimal 32. Il s'agit de « 00100000 ».
Plutôt que de parcourir chaque lettre de notre exemple de phrase, nous allons simplement la saisir dans un Convertisseur ASCII en binaire . Le taper nous donne :
01101000 01100001 01110011 01101000 01101001 01101110 01100111 00100000 01101001 01110011 00100000 01100011 01101111 0110 1101 01110000 01101100 01101001 01100011 01100001 01110100 0110010
Ce qui précède n’a aucun sens pour nous, humains, mais pour les machines, « le hachage est compliqué ».
SHA-2 et rembourrage
Une fois que nous avons réécrit notre phrase en binaire, l'étape suivante consiste à ajouter du remplissage, qui est essentiellement un ensemble de données supplémentaires que nous ajoutons à notre entrée pour lui donner une longueur fixe. Cela aide également à prévenir attaques d'extension de longueur . Les différentes versions de SHA-2 ont les tailles de blocs suivantes :
- SHA-224 – 512 bits
- SHA-256 – 512 bits
- SHA-384 – 1024 bits
- SHA-512 – 1024 bits
- SHA-512/224 – 1024 bits
- SHA-512/256 – 1024 bits
Ces tailles de bloc correspondent à la quantité de données que l'algorithme SHA-2 traite en une seule fois. Nous avons montré que les fonctions de hachage sont capables de traiter des entrées tant que la Déclaration d'Indépendance (SHA-256 peut en fait accepter des entrées qui sont des ordres de grandeur plus grands , jusqu'à 264-1, ce qui est un nombre tellement énorme que vous n’avez pas vraiment à vous soucier des limites supérieures de l’algorithme). Cependant, il ne traite pas toutes ces informations en une seule fois.
Au lieu de cela, dans le cas de SHA-256, il traite les informations par blocs de données de 512 bits. Dans notre exemple, les choses sont relativement simples, carnotre entrée « le hachage est compliqué » contient moins de 512 bits de données–c'est 176 bits. Vous pouvez le calculer en comptant chaque chiffre binaire, ou en comptant chaque lettre plus les deux espaces, puis en multipliant par 8, car chaque caractère fait un octet.
Cependant, nous devons souvent hacher des entrées d’une longueur bien supérieure à 512 bits. Dans ces cas-là, le message est simplement divisé en blocs. Si nous devions hacher un message de 10 000 bits, il faudrait simplement le diviser en plusieurs blocs de 512 bits.
Dans notre exemple, nous n’avons que 176 bits de données, mais devons remplir un bloc de 512 bits. Cela signifie quenous devrons ajouter 336 bits de remplissagepour le compléter. SHA-2 utilise le schéma de remplissage suivant :
- Un « un » est ajoutéaprès les données du message binaire en cours de hachage.
- Ensuite, des zéros sont ajoutés jusqu'à ce que la longueur des données d'entrée plus celle supplémentaire de l'étape précédente totalise 448 bits. Dans notre exemple, nous avons une longueur d'entrée de 176 bits, plus celle de l'étape précédente, ce qui nous amène à 177 bits. Il nous faut donc 448 moins 177 zéros. Si nous faisons le calcul, nous devonsajouter 271 zéros.
- Le 64 bits finaux de la bloc final (512 bits moins les 448 bits que nous avons déjà remplis lors des étapes précédentes) sont réservés pour afficher la longueur du message en binaire . Comme nous ne traitons qu'un seul bloc de données, la fin de celui-ci doit inclure cette longueur de message de 64 bits. La longueur de notre message en bits est de 176, soit 10110000 en binaire . Cela ira à la toute fin du bloc, et les nombres précédents sont remplis avec plus de zéros (dans les cas où nous avons une entrée beaucoup plus grande, ces zéros seront remplacés par la longueur du message plus longue écrite en binaire).
Si nous mettons tout cela ensemble, nous nous retrouvons avec le bloc suivant de 512 bits pour le message « le hachage est compliqué » :
01101000 01100001 01110011 01101000 01101001 01101110 01100111 00100000 01101001 01110011 00100000 01100011 01101111 0110 1101 01110000 01101100 01101001 01100011 01100001 01110100 0110010 1 0000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000 000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0 0 000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10110000
Si vous comptez les uns et les zéros, vous verrez qu'il y a 512 bits de données dans le bloc ci-dessus. Les 176 premiers bits sont le message d'entrée en binaire, « le hachage est compliqué ». Il est suivi du 1, que nous avons mis en gras et souligné pour le rendre plus facile à voir. Ensuite, nous avons les 271 zéros, suivis de la longueur du message de 64 bits, qui est également en gras et souligné. Cette longueur de message est précédée de zéros, comme nous l'avons mentionné précédemment.
Dans SHA-384, SHA-512, SHA-512/224 et SHA-512/256, le schéma de remplissage est essentiellement le même, sauf que les blocs doivent chacun être remplis de 1 024 bits de données etle bloc final présente les différences suivantes:
- Dans la deuxième étape, des zéros sont ajoutés jusqu'à ce qu'une longueur de 896 bits soit atteinte, au lieu de 448 bits.
- Dans la dernière étape, 128 bits du bloc sont réservés pour ajouter la longueur du message.
Si nous parcourions notre exemple avec SHA-384, SHA-512, SHA-512/224 ou SHA-512/256, le bloc complété aurait à peu près le même aspect, sauf qu'il aurait 448 zéros supplémentaires à partir de la deuxième étape. , et 64 autres zéros de l'étape finale.
Entrées supérieures à 448 bits (pour SHA-224 et SHA-256) et 896 bits (pour SHA-384, SHA-512, SHA-512/224 et SHA-512/256)
Nous devons souvent hacher des entrées de message supérieures à la taille des blocs de 512 bits ou 1 024 bits, ce qui signifie que nous devons diviser les données sur plusieurs blocs. Le point limite pour diviser les blocs est en réalité soit de 447 bits, soit de 895 bits, car au moins un bit de remplissage, plus la longueur du message de 64 ou 128 bits doit être inclus.
Cela signifie quesi vous avez exactement 448 bits (ou 896 bits) de données à hacher, elles devront être réparties sur deux blocs. Le premier bloc comprendra l'intégralité des données, plus 64 (ou 128) bits de remplissage (celui suivi de 63 ou 127 zéros). Le deuxième bloc aura 448 (ou 896) zéros supplémentaires, avec la longueur du message de 64 bits (ou 128 bits) marquée à la fin de la même manière que nous avons montré dans la section précédente.
449 bits (ou 897 bits) de données occuperaient également deux blocs de données et auraient à la place un un plus 62 (ou 126) zéros de remplissage avant la longueur du message.
D'autre part,447 bits (ou 895 bits) de données parviendraient simplement à tenir dans un seul bloc. Il inclurait les 447 (ou 895) bits, puis le remplissage d'un seul un , suivi de la longueur du message de 64 ou 128 bits.
Le système fonctionne de la même manière pour les entrées de données plus volumineuses. Les données sont réparties sur autant de blocs que nécessaire pour que toutes les données soient incluses., plus au moins un chiffre de remplissage et avec la longueur du message de 64 bits ajoutée à la fin du bloc final. Dans le cas de 5 000 bits de données d'entrée et de tailles de bloc de 512 bits de SHA-224 ou SHA-256, l'entrée serait répartie sur 10 blocs. Les neuf premiers incluraient uniquement les données d'entrée, tandis que le dixième inclurait les 392 derniers bits de données d'entrée, un un , 55 zéros, puis la longueur du message de 64 bits à la fin. Cela totalise 5 120 bits de données, soit 10 multiplié par 512.
Dans le cas de SHA-384, SHA-512, SHA-512/224 ou SHA-512/256, ces mêmes 5 000 bits de données seraient répartis sur six blocs de 1 024 bits. Les quatre premiers n’incluraient que les données d’entrée. Le cinquième bloc comprendrait les 904 derniers bits de données, un un , puis 119 des zéros comme rembourrage. Les 5 000 bits de données ne tiennent pas tout à fait dans cinq blocs, car les 904 derniers bits de données dépassent la limite du dernier bloc, qui est de 896 bits. Le sixième bloc comprendrait 896 zéros, puis la longueur du message de 128 bits à la fin.
Le principal algorithme SHA-2
Ci-dessous, nous avons une représentation graphique de l'algorithme SHA-2 :
L'algorithme SHA-2
À moins que vous n’ayez déjà utilisé des algorithmes similaires, cela n’a probablement pas beaucoup de sens. Ne vous inquiétez pas, car nous allons passer beaucoup de temps à l’expliquer en détail.
La première chose à noter est que le diagramme montre Tour 0, tour T et tour 63. Le tour 0 est le premier tour, tandis que le tour T est essentiellement un espace réservé qui représente n'importe quel tour intermédiaire, car il serait compliqué de dessiner des dizaines de tours. Le tour 63 est le tour final, ce qui nous donne un total de 64 tours si l'on part de 0.Notez que SHA-384, SHA-512, SHA-512/224 et SHA-512/256 impliquent 80 tours au lieu de 64, le processus que nous sommes sur le point de décrire est donc quelque peu différent dans ces versions de l'algorithme SHA-2.
Chacun de ces tours comporte ses propres entrées et calculs, les résultats de certains calculs devenant des entrées pour les calculs suivants. Comme vous commencez probablement à le comprendre, l’algorithme SHA-2 est compliqué et implique tout un tas d’étapes et de calculs.
L'entrée de message M
Nous garderons les choses simples dans cet exemple en utilisant uniquement notre seul bloc d'entrée de 512 bits, au lieu d'une entrée plus longue et plus compliquée qui nécessite une série de blocs. Si nous devions décrire le processus pour des entrées de données plus longues, nous aurions besoin de répéter complètement une grande partie du processus long et alambiqué que nous sommes sur le point de décrire, avec chacun des différents blocs de données d'entrée.
Si vous regardez en haut à gauche du diagramme ci-dessus, vous verrezL'entrée du message (M). Il s'agit du bloc de 512 bits complété de notre message « Le hachage est compliqué » :
01101000 01100001 01110011 01101000 01101001 01101110 01100111 00100000 01101001 01110011 00100000 01100011 01101111 0110 1101 01110000 01101100 01101001 01100011 01100001 01110100 01100101 01100100 10000000 00000000 00000000 00000000 00000000 0 0000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000 00 0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10110000
Notre message d'entrée est d'abord divisé en seize mots de 32 bits étiquetés W.0est W.quinze:
- Dans0– 01101000 01100001 01110011 01101000
- Dans1– 0110100 01101110 01100111 00100000
- Dansdeux– 01101001 01110011 00100000 01100011
- Dans3– 01101111 01101101 01110000 01101100
- Dans4– 01101001 01100011 01100001 01110100
- Dans5– 01100101 01100100 10000000 00000000
- Dans6– 00000000 00000000 00000000 00000000
- Dans7– 00000000 00000000 00000000 00000000
- Dans8– 00000000 00000000 00000000 00000000
- Dans9– 00000000 00000000 00000000 00000000
- Dansdix– 00000000 00000000 00000000 00000000
- Dansonze– 00000000 00000000 00000000 00000000
- Dans12– 00000000 00000000 00000000 00000000
- Dans13– 00000000 00000000 00000000 00000000
- Dans14– 00000000 00000000 00000000 00000000
- Dansquinze– 00000000 00000000 00000000 10110000
Conversion en hexadécimal
Avant d'aller plus loin, nous allons convertir les chiffres binaires ci-dessus en un autre système de numérotation appelé hexadécimal. Si vous avez prêté attention, vous avez peut-être remarqué que notre hachage comprend un tas de lettres :
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
En effet, les hachages sont généralement écrits en hexadécimal, ce qui est simplement une façon différente de compter, de la même manière que le système binaire et le système décimal auxquels nous sommes tous habitués sont différents.
Le binaire est un système de base 2, ce qui signifie essentiellement que vous disposez de deux options, un 1 et un 0, avant de devoir commencer à représenter des informations avec un plus grand nombre de chiffres.
Notre système décimal habituel est en base 10, ce qui signifie que nous avons 10 options, 0, 1, 2, 3, 4, 5, 6, 7, 8 et 9, avant d'en manquer et de devoir commencer à combiner des nombres pour représenter des nombres plus grands. quantités de données, comme lorsque nous combinons un 1 et un 0 pour obtenir 10.
L'hexadécimal est un système en base 16, ce qui signifie que nous avons 16 options :
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f
Lorsque nous utilisons la base 16, la valeur 10 n’est pas la même valeur confortable avec laquelle nous avons grandi. Au lieu de cela, un 10 en base 16 est en réalité le nombre 16 auquel nous sommes habitués en décimal. En base 10, notre nombre décimal familier 10 est représenté par unun, 11 estb, 12 estc,13 estd, 14 estetet 15 estF.
Aller trop en profondeur sur l'hexadécimal détournera l'attention du sujet principal, mais vous pouvez trouver plus d'informations ici .
Tout ce que vous devez savoir, c'est que nous passons notre entrée du binaire à l'hexadécimal, et nous le ferons en entrant nos valeurs binaires dans un convertisseur en ligne simple (si vous essayez cela vous-même et copiez les nombres binaires ci-dessus, supprimez les espaces). Cela devrait vous donner :
- Dans0– 68617368
- Dans1– 346E6720
- Dansdeux– 69732063
- Dans3-6F6D706C
- Dans4– 69636174
- Dans5– 65648000
- Dans6– 00000000
- Dans7– 00000000
- Dans8– 00000000
- Dans9– 00000000
- Dansdix– 00000000
- Dansonze– 00000000
- Dans12– 00000000
- Dans13– 00000000
- Dans14– 00000000
- Dansquinze– 000000B0
Calendrier des messages : Recherche des autres valeurs W
L'algorithme SHA-2
Si vous examinez attentivement le diagramme, vous remarquerez que l'une des entrées du Round 63 est W.63. Nous n'avons que W0est W.quinzejusqu'à présent, cela implique que nous avons besoin de 48 valeurs supplémentaires avant d'avoir toutes nos entrées W. Dans les versions SHA-384, SHA-512, SHA-512/224 et SHA-512/256 de l'algorithme, nous aurions besoin de 80 valeurs au total, nous aurions donc besoin d'en dériver 64 supplémentaires.
Ces entrées sont calculées dans la case marquéecalendrier des messagesdans le diagramme. Dans les deux cas, nous les dérivons à l’aide de la formule suivante :
Danst=p1(DANSt-2) + Wt-7+p0(DANSt-15) + Wt-16
Confus? Ne nous blâmez pas, blâmez les cryptographes qui l’ont conçu. Commençons par essayer d’expliquer quelques valeurs de l’équation ci-dessus.
test essentiellement un remplaçant pour le tour auquel nous nous trouvons.Si nous sommes au premier tour, que les ingénieurs appellent gracieusement Round 0,test 0. Doncsi tu vois W0, cela signifie la valeur de W au tour 0. Nous utilisons cette notation car nous utiliserons un grand nombre de valeurs différentes pour W à différentes étapes de l’algorithme. De nombreuses autres variables utilisent également des valeurs changeantes tout au long des étapes de l'algorithme.
La valeur suivante qui vous semble probablement confuse est :
p1(X)
Le symbole est connu sous le nom desigma, et à côté du chiffre 1, il représente la fonction suivante :
p1(x) = ROTR17(X) ⊕ R.O.T.R.19(X) ⊕ SHRdix(X)
Avant de pouvoir comprendre pleinement le fonctionnement de la planification des messages, nous devrons expliquer cette fonction.
Opérations de quart de travail
Le ROTR de l’équation précédente signale que nous devons effectuer undécalage circulaire vers la droitesur la valeur qui le suit, x. Il est décalé en fonction du nombre de bits indiqué en exposant. Prenons le premier segment :
R.O.T.R.17(X)
Ce qui précède dit simplement de décaler la valeurX 17 bitsaudroite. Pour vous donner un exemple de la façon dont cela fonctionne, si la valeur de x est 1000 1001 et que nous voulons effectuer un décalage circulaire vers la droite de seulement1 peu, nous prendrions essentiellement la valeur dans la colonne la plus à droite :
1000 1001
Et déplacez-le vers la gauche :
1100 0100
Pour démontrer à nouveau le concept, cette fois avec un décalage circulaire vers la droite de 3 bits, on prend le même nombre :
1000 1001
Cette fois, nous prenons chacun des trois chiffres les plus à droite et les déplaçons vers la gauche :
0011 0001
Ce type d'opération intervient à la fois dans la première section de l'équation, ainsi que dans celle du milieu, avec des déplacements de17et19bits respectivement.
La dernière partie de l'équation dit :
SHRdix(X)
Le SHR nous demande d'effectuer une opération similaire, quoique légèrement différente, connue sous le nom dedécalage logique vers la gauche. Dans ce cas, on décale à gauche la valeur x du nombre de bits en exposant,dix, puis complétez le côté droit avec des zéros. Prenons le même nombre que précédemment pour démontrer comment cela fonctionne :
1000 1001
Nous effectuerons un décalage de 10 bits vers la gauche en 10 étapes, le dernier chiffre étant mis en gras sans autre raison que pour vous aider à suivre sa progression :
0001 0010
0010 0100
01001000
10010000
0010 0000
0100 0000
1000 0000
0000 0000
0000 0000
0000 0000
Au cours des sept premiers mouvements, nous avons vu les données se déplacer lentement vers la gauche et être remplacées par des zéros sur la droite. Au huitième coup, toutes les données originales avaient complètement disparu et avaient été remplacées par des zéros.
Notez la différence entre cecidécalage logique vers la gauchefonctionnement et les éléments évoqués précédemmentdécalage circulaire vers la droite. Non seulement le mouvement se produit dans des directions différentes, mais le décalage circulaire vers la droite recycle les données de l'autre côté, tandis que le décalage logique vers la gauche les supprime et remplit l'espace qui s'ouvre avec des zéros.
Discuter de ces changements de manière trop détaillée nous amènera sur une tangente, mais vous pouvez en savoir plus sur leur fonctionnement à ce stade. Ressource .
Opérations XOR
La dernière partie de notre opération que nous devons expliquer est la⊕ symbole, qui relie chacun de ces composants entre eux. ⊕ signifie opération XOR, qui est une opération logique qui signifie essentiellementsa sortie est vraie si l'une des entrées est vraie, mais est fausse si les deux entrées ou aucune entrée n'est vraie.
Il est difficile d’expliquer cela sans plonger dans un cours complet sur l’algèbre booléenne et les opérations logiques. Ce lien vous donne un petit aperçu, mais vous n’avez pas vraiment besoin de le comprendre en profondeur pour avoir un bon aperçu du fonctionnement du reste de l’algorithme. Tout ce que vous devez savoir, c'est que nous allons essentiellement additionner quelques nombres, mais en utilisant des mathématiques étranges que vous n'avez probablement pas apprises à l'école.
Résoudre la première partie de notre équation
Maintenant que nous avons couvert certains détails des opérations, examinons à nouveau l’équation sur laquelle nous sommes restés perplexes :
Danst=p1(DANSt-2) + Wt-7+p0(DANSt-15) + Wt-16
Où:
p1(x) = ROTR17(X) ⊕ R.O.T.R.19(X) ⊕ SHRdix(X)
Et:
p0(x) = ROTR7(X) ⊕ R.O.T.R.18(X) ⊕ SHR3(X)
Essayons maintenant de déterminer la valeur de W16, car c’est le premier nombre que nous devons déterminer à l’aide de cette équation. Branchons notre valeur :
Dans16=p1(DANS16-2) + W16-7+p0(DANS16-15) + W16-16
Donc:
Dans16=p1(DANS14) + W9+p0(DANS1) + W0
Nous connaissons toutes les valeurs W du côté droit de l’équation car ce sont les mots W que nous avons découverts en divisant notre bloc de message complété. Les valeurs en binaire et en hexadécimal sont :
- Dans0–68617368ou01101000 01100001 01110011 01101000
- Dans1–346E6720ou0110100 01101110 01100111 00100000
- Dans9–00000000ou00000000 00000000 00000000 00000000
- Dans14–00000000ou00000000 00000000 00000000 00000000
Avant de brancher tous les nombres, voyons à quoi correspond la valeurp1(DANS14), en utilisant l'équation dont nous avons discuté ci-dessus :
p1(DANS14) = ROTR17(DANS14) ⊕ R.O.T.R.19(DANS14) ⊕ SHRdix(DANS14)
Avec le W14valeurs en hexadécimal, l'équation ressemble à :
p1(00000000) = ROTR17(00000000) ⊕ R.O.T.R.19(00000000) ⊕ SHRdix(00000000)
La première étape consiste à effectuer les déplacements que nous avons décrits précédemment pour chaque section de l'équation. Nous allons passer à la valeur binaire de W14plutôt que l'hexadécimal, car cela permet de voir plus facilement les changements que nous allons effectuer. Notez que les versions binaire et hexadécimale sont simplement des représentations différentes de la même valeur, donc les changer quand cela vous convient ne pose aucun problème :
R.O.T.R.17(00000000 00000000 00000000 00000000)
Le résultat de l’opération ci-dessus sera extrêmement prévisible car il n’y a que des zéros, mais nous le passerons en revue quand même, juste pour vous donner une idée de ce qui se passe. Dirigez-vous vers ce qui suit outil en ligne et entrez la valeur binaire pour W14, les 32 zéros, dans le champ de saisie marquéValeur. Assurez-vous de supprimer les espaces. Entrer32dansTaille, car la valeur d'entrée fait 32 bits. Taper17dans leChangementchamp, pour vous assurer qu’il décale la valeur de 17 espaces. Assurez-vous que la direction est définie surDroite. Sélectionnez leDécalage circulairecase puis cliquez surEffectuer une opération de décalage de bits. Cela effectue le décalage circulaire vers la droite.
Sans surprise, cela vous donnera une valeur de :
00000000 00000000 00000000 00000000
On dirait que rien ne s'est passé, mais les zéros ont été déplacés. Nous ne pouvons tout simplement pas le dire et cela semble dénué de sens, car ce sont tous des zéros.
Il est maintenant temps d’effectuer la partie médiane de l’opération :
R.O.T.R.19(00000000 00000000 00000000 00000000)
Dans ce cas, tout est pareil, sauf leChangementla valeur est maintenant19. Cela nous donne un résultat de :
00000000 00000000 00000000 00000000
Passons maintenant à la dernière partie :
SHRdix(00000000 00000000 00000000 00000000)
N'oubliez pas que le SHR représente undécalage logique vers la gauche, donc cette fois, nous devons modifier les paramètres. LeValeuretTaillerestent les mêmes, mais nous devons nous assurer que :
Changementest réglé surdix
Directionest réglé surGauche
Changement logiqueest sélectionné.
Encore une fois, nous obtenons le même résultat de :
00000000 00000000 00000000 00000000
Même si cela a pu sembler une entreprise inutile, c'était uniquement parce que notre numéro de départ était composé de zéros. Lorsque vous effectuez ces opérations avec d’autres nombres, des changements se produiront réellement.
Les chaînes binaires et hexadécimales de zéro sont les mêmes, nous remettrons donc ces valeurs en hexadécimal lorsque nous passerons à la partie suivante de notre calcul, afin qu'elles tiennent mieux sur la page :
p1(DANS14) = 00000000 ⊕ 00000000 ⊕ 00000000
Nous pouvons résoudre cette équation dans ceci calculateur en ligne en entrant:
00000000danschamp A.
SélectionGRATUITdans le menu déroulant en dessous.
00000000danschamp B.
SélectionGRATUITdans le menu déroulant en dessous.
00000000danschamp C.
Si vous l'avez bien fait, cela devrait se voirA XOR B XOR Cdans la case marquéeExpression logique. Il vous donnera la réponse dans la case marquéeRésultat de l'opération. Dans ce cas, c'est :
0ou00000000ou00000000 00000000 00000000 00000000.
C’est une réponse ennuyeuse, mais elle nous rapproche de la résolution de notre équation, car nous savons maintenant que :
p1(DANS14) = 00000000
Si vous faites défiler vers l’arrière, vous verrez qu’il nous suffit de trouver un composant supplémentaire, et nous pourrons alors résoudre l’équation. Nous devons trouver la valeur de σ0(DANS1), qui utilise l'équation suivante :
p0(x) = ROTR7(X) ⊕ R.O.T.R.18(X) ⊕ SHR3(X)
Comme nous l'avons dit plus haut, nous savons que W1est :
346E6720
Donc:
p0(346E6720) = ROTR7(346E6720) ⊕ R.O.T.R.18(346E6720) ⊕ SHR3(346E6720)
Cette équation est presque exactement la même que celle que nous venons de résoudre. Par souci de brièveté, nous n'entrerons pas dans les détails, mais si vous souhaitez essayer vous-même, suivez simplement chacune des étapes que nous avons suivies ci-dessus, mais changez leChangementà chaque fois pour7,18et3, respectivement.
p0(346E6720) =4068DCCE ⊕ 99C80D1B ⊕A3733901
Une fois que vous l’aurez résolu, vous constaterez que la réponse est :
p0(346E6720) =7AD3E8D4
Ajout modulaire
Maintenant que nous connaissons les valeurs des deuxp1(DANS14)etp0(DANS1), nous sommes enfin prêts à déterminer la valeur de W16:
Dans16=p1(DANS14) + W9+p0(DANS1) + W0
Dans16= 00000000 + 00000000 + 7AD3E8D4 + 68617368
L'équation ci-dessus semble relativement simple. La seule chose que nous devons noter est que les signes plus représentent un ajout modulaire plutôt qu'un ajout normal.
Pour démontrer le concept avec un nombre décimal à 8 chiffres, si nous utilisions l’addition modulaire pour ajouter 1 à 99 999 999, la réponse n’est pas 100 000 000 comme on pourrait s’y attendre. Au lieu de cela, il revient simplement au début de la même manière que 1 suit 12 sur une horloge. La réponse est 0 ou 00 000 000. Vérifier cette amorce si vous avez besoin d'une brève introduction à l'arithmétique modulaire.
Essentiellement, l’addition modulaire vous permet d’ajouter des nombres sans que votre réponse ne s’allonge. Prenons ce qui suit comme autre exemple décimal :
76 487 639 + 98 094 034
Sous une addition normale, la réponse serait :
76 487 639 + 98 094 034 =174 581 673
Avec l'ajout modulaire, nous pouvons simplement jeter le1, et notre réponse est :
76 487 639 + 98 094 034 =74 581 673
Nous pouvons faire les mêmes calculs avec les nombres hexadécimaux de notre équation :
Dans16= 00000000 + 00000000 + 7AD3E8D4 + 68617368
Nous allons le résoudre en utilisant ceci calculateur en ligne . Dans notre exemple, nous n’avons pas besoin d’ajouter les zéros car ils ne changeront pas la valeur, et nous pouvons simplement ajouter7AD3E8D4et68617368. Si vous devez utiliser le même outil pour ajouter d'autres nombres à l'avenir, vous pouvez simplement effectuer l'opération plusieurs fois, en ajoutant le nombre suivant au résultat de l'équation précédente.
Nous pouvons résoudre notre équation en tapant7AD3E8D4dans la première case du calculateur en ligne et68617368dans la seconde. Cela nous donne un résultat de :
Dans16= e3355c3c
N'oubliez pas qu'il s'agit d'une addition modulaire, donc si le résultat dépasse huit chiffres, nous devrons supprimer le chiffre le plus à gauche. Notre résultat ne comporte que 8 chiffres, nous n’avons donc pas à nous inquiéter dans ce cas.
Cela a été un processus long et compliqué, mais nous avons enfin la réponse pour W.16. C'este3355c3c. Le même ensemble de calculs doit être effectué pour toutes les valeurs W, de W17est W.63.
Nous avons démontré le fonctionnement de ces calculs, il est donc temps de passer aux autres aspects de l’algorithme SHA-2.
Les variables d'initialisation
Maintenant que nous avons discuté de l’origine de toutes les entrées W, revenons à notre diagramme :
L'algorithme SHA-2
En haut, vous remarquerez qu'il est écrit Hje-1. Cela représente les variables de travail, qui agissent comme entrées à chaque tour. Il existe huit de ces variables et elles sont mises à jour à la fin de chaque tour. Pour commencer, les variables d'initialisation, H(0)sont:
- H(0)un= 6a09e667
- H(0)b= bb67ae85
- H(0)c= 3c6ef372
- H(0)d= a54ff53a
- H(0) et= 510e527f
- H(0)f= 9b05688c
- H(0)g= 1f83d9ab
- H(0)h= 5be0cd19
Les nombres ci-dessus sont dérivés des racines carrées des huit premiers nombres premiers, mais leur origine n’a pas vraiment d’importance pour notre propos. Tout ce que vous devez savoir, c'est que nous devons commencer par les numéros spécifiques indiqués ci-dessus.
Lors des tours suivants, ces valeurs seront différentes. Par souci de simplicité et pour représenter leurs valeurs changeantes, le diagramme affiche ces entrées sous la formea, b, c, d, e, f, g et h, plutôt queH(0)un, H(0)b, etc., ou H(1)un, H(1)b, etc..
La constante, K
À chaque tour, nous prenons les variables de travail et les combinons avec la valeur W appropriée au tour que nous avons décrite dans la section précédente. Si vous regardez du côté droit des tours dans le diagramme, vous verrez une autre entrée,K. Il existe 64 valeurs distinctes de 32 bits pour K, une pour chacun des 64 tours. Ils sont dérivés des racines cubiques des 64 premiers nombres premiers. En hexadécimal, ces constantes de huit caractères pour chaque tour sont les suivantes, lues de gauche à droite avant de descendre à la ligne suivante :
|_+_|Notez que les valeurs de K ont une longueur de 64 bits dans SHA-384, SHA-512, SHA-512/224 et SHA-512/256. Il existe également 80 de ces valeurs, au lieu de 64. Vous pouvez les consulter dans FIPS180-4 si besoin.
L'opération Maj
Enfin, nous avons toutes nos entrées. Il est maintenant temps de comprendre comment chaque cycle de SHA-2 les utilise. Le diagramme suivant donne un bon aperçu de la façon dont SHA-2 utilise toutes ces entrées :
Les calculs SHA-2 impliquaient un seul tour.
Si vous regardez vers le haut, nous avons les variables de travail,H(i)un, H(je)b, H(je)c, H(identifiant, H(c'est à dire, H(si, H(je)g, et H(je)h. Ce sont les mêmes que les variables de travaila, b, c, d, e, f, g et hdans le diagramme pour l’ensemble de l’algorithme SHA-2. Au premier tour, ce seront les variables d'initialisation respectives que nous avons répertoriées dans la section précédente. Si vous regardez H(i)un, H(je)b, H(je)c, en haut à gauche, vous verrez que les trois entrées ont des flèches pointant vers une case,Majeur. Cela correspond à l’équation suivante :
Maj (a,b,c) = (a ET b) ⊕ (une ET c) ⊕ (b ET c)
Pour rendre l'équation plus facile à lire, nous avons supprimé le H(je)de chaque variable et je les ai simplement laissés tels quelsun,b, etc. Tant que vous vous souvenez que les valeurs deun,betcchangez à chaque tour, cela devrait faciliter le suivi.
Nous avons déjà traité du ⊕ symbole, maisETdans ce contexte est nouveau pour nous. C'est une autre opération de l'algèbre booléenne. Il fait référence à une conjonction logique, ce qui signifie essentiellement que la sortie n'est vraie que si les deux entrées sont vraies. Tu peux En savoir plus ici , mais nous allons aller de l'avant et utiliser simplement un calculateur en ligne pour effectuer cette opération.
Tout d’abord, ajoutons les variables d’initialisation que nous avons répertoriées dans leLes variables d'initialisationsection:
Maj (6a09e667, bb67ae85, 3c6ef372) = (6a09e667 ET bb67ae85) ⊕ (6a09e667 ET 3c6ef372) ⊕ (bb67ae85 ET 3c6ef372)
La calculatrice que nous utilisons est assez limitée, nous devrons donc effectuer le calcul en plusieurs étapes.
Entrer6a09e667en entréeUN.
SélectionnerETdans la liste déroulante ci-dessous.
Entrerbb67ae85en entréeB.
Cela vous donne un résultat de :
2A01A605
Suivant:
Entrer6a09e667en entréeUN.
SélectionnerETdans la liste déroulante ci-dessous.
Entrer3c6ef372en entréeB.
Cela vous donne un résultat de :
2808E262
Alors:
Entrerbb67ae85en entréeUN.
SélectionnerETdans la liste déroulante ci-dessous.
Entrer3c6ef372en entréeB.
Cela vous donne un résultat de :
3866A200
Mettons toutes ces réponses dans l’équation :
Maj (6a09e667, bb67ae85, 3c6ef372) = 2A01A605 2808E262 3866A200
Il ne nous reste plus qu'à modifier une fois de plus les entrées dans notre calculateur en ligne :
Entrer2A01A605en entréeUN.
SélectionnerGRATUITdans la liste déroulante ci-dessous.
Entrer2808E262en entréeB.
SélectionnerGRATUITdans la liste déroulante ci-dessous.
Entrer3866A200en entréeC.
Cela nous donne :
Maj(a,b,c)=3A6FE667
Le ∑0opération
Maintenant que nous avons la réponse àMaj(a,b,c)Revenons au diagramme et voyons la suite :
Les calculs SHA-2 impliquaient un seul tour.
Vous verrez que la flèche deH(i)unsouligne également lesymbole ∑. Cela indique que nous devons prendre le H(i)unsaisissez-le et faites-le subir le calcul suivant :
∑0(a) = ROTRdeux(un) ⊕ R.O.T.R.13(un) ⊕ R.O.T.R.22(un)
Encore une fois, nous avons laissé de côté le H(je)pour plus de clarté. Nous en avons déjà traitédécalages circulaires à droite, aussi bien queOpérations XOR. Cette fois, nous devons effectuer les décalages circulaires vers la droite de 2, 13 et 22 bits, respectivement. Revenons à notre calculateur , avec notre valeur pourun,6a09e667.
Pour la première section de ce calcul, saisissez :
6a09e667dansValeurAssurerhexadécimalest sélectionné dans le menu déroulant à droite.
32 enTaille.
2 dansChangement.
S'assurerDroiteest sélectionné pour leDirection.
Clique leDécalage circulaireboîte.
Clique leEffectuer une opération de décalage de bitsbouton.
Cela vous donnera un résultat de :
DA827999
Si vous souhaitez plus d'informations sur la manière dont ce résultat a été obtenu, le calculateur indique les étapes nécessaires à la réalisation de l'opération. Vous pouvez également vous référer auOpérations de quart de travailsection pour plus de détails.
Pour les deux valeurs restantes que nous devons déterminer, il nous suffit de modifier la valeur dans leChangementchamp, puis cliquez sur leEffectuer une opération de décalage de bitsbouton à nouveau.
Le changer en13nous donne une réponse de :
333B504F
Le changer en22nous donne une réponse de :
27999DA8
Nous avons maintenant toutes les valeurs dont nous avons besoin pour terminer l’équation :
∑0(6a09e667) =DA827999⊕333B504F⊕27999DA8
Revenons au calculatrice nous utilisons pour les opérations XOR et :
EntrerDA827999en entréeUN.
SélectionnerGRATUITdans la liste déroulante ci-dessous.
Entrer333B504Fen entréeB.
SélectionnerGRATUITdans la liste déroulante ci-dessous.
Entrer27999DA8en entréeC.
Cela nous donne un résultat de :
∑0(6a09e667) = CE20B47E
Addition modulaire des résultats
Si l'on suit les flèches duMajeurboîte et le∑boîte, on voit que les sorties sont ensuite envoyées en entrées dans une boîte avec un+symbole dessus. Cela représenteajout modulaire, qui, comme nous l'avons déjà décrit, ressemble beaucoup à une addition normale, sauf que les nombres reviennent simplement au début à un certain point, au lieu de continuer à croître. Si vous souhaitez un rappel plus détaillé, reportez-vous à la section précédente sur les ajouts modulaires.
Le diagramme peut être représenté par la formule suivante :
Maj(a,b,c) + ∑0(une) =3A6FE667+CE20B47E
Nous utiliserons le même calculatrice encore.
Entrer3A6FE667dans le premier champ etCE20B47Edans la seconde, puis cliquez surCalculer. Cela devrait vous donner une réponse de :
108909ae5
Si vous y prêtez attention, vous remarquerez peut-être que la réponse ci-dessus comporte neuf chiffres, alors que chacune des réponses précédentes n'en comptait que huit. Si vous vous souvenez de l'époque où nous avons introduit le concept d'addition modulaire, nous avons mentionné que c'était comme une addition régulière, mais qu'elle revenait au début lorsque les nombres dépassaient un certain point.
Eh bien, la calculatrice que nous utilisons n’est pas spécifiquement destinée à l’addition modulaire : elle effectue simplement l’addition normale que vous avez apprise à l’école primaire (mais avec des nombres hexadécimaux). Cela signifie qu’il ne reconduira pas les chiffres une fois qu’il aura atteint la limite. Jusqu’à présent, nous avons eu de la chance qu’aucun de nos calculs précédents n’aboutisse à un nombre à neuf chiffres.
Cette fois, nous nous sommes retrouvés avec neuf chiffres, alors que nous en avions vraiment besoin, à huit seulement. La bonne nouvelle est qu’il est facile de résoudre notre problème. Tout ce que nous avons à faire est de supprimer le chiffre le plus à gauche, le1. Par conséquent, notre réponse n’est pas vraiment108909ae5. Au lieu de cela, c'est :
08909ae5
Si vous revenez au diagramme et tracez la ligne qui part de ce+box comme sortie, vous verrez qu'elle se connecte à une autre ligne qui comprend des entrées que nous n'avons pas encore traitées.Il faudra faire d'autres calculs avant de pouvoir revenir sur ce point.
La fonction conditionnelle
Cette fois, regardons H(c'est à dire, H(si, H(je)gdans le diagramme. Ils pointent tous vers la case étiquetéeCh., ce qui indique que ces valeurs agissent comme entrées dans la fonction suivante :
Ch(e, f, g) = (e ET f) ⊕ (PAS e ET g)
Nous avons déjà traité de chacune de ces opérations à l'exception dePAS. Cela représente négation , également connu sous le nom de complément logique. Nous n’entrerons pas dans les détails de son fonctionnement pour éviter de trop prendre la tangente, mais vous pouvez soit vous référer au lien, soit faire confiance au calculateur en ligne.
Encore une fois, nous avons supprimé le H(je)de e, f et g, simplement pour faciliter la lecture. Nous travaillons toujours sur le Round 0, ces valeurs seront donc les variables d'initialisation que nous avons répertoriées plus tôt :
H(0) et–510e527f
H(0)f–9b05688c
H(0)g–1f83d9ab
Notez que dans les prochains tours, les variables pour e, f et g seront différentes. Pour l’instant, mettons ces variables d’initialisation dans notre équation :
Ch (510e527f, 9b05688c, 1f83d9ab) = (510e527f ET 9b05688c) ⊕ (PAS 510e527f ET 1f83d9ab)
Nous devrons décomposer cette équation en parties pour la compléter avec notre calculateur . Pour le premier semestre :
Entrer510e527fen entréeUN.
SélectionnerETdans la liste déroulante ci-dessous.
Entrer9b05688cen entréeB.
Cela devrait vous donner une réponse de :
1104400C
Pour la seconde moitié de l’équation :
Sélectionnez lePasbouton à gauche de la saisieUN.
Entrez 510e527f dans l'entréeUN.
SélectionnerETdans la liste déroulante ci-dessous.
Entrez 1f83d9ab dans l'entréeB.
Cela devrait vous donner un résultat de :
E818980
Reprenons ces réponses dans l’équation :
Ch(510e527f, 9b05688c, 1f83d9ab) = (1104400C) ⊕ (E818980)
Terminez de le résoudre en :
S'assurer quePASn’est plus sélectionné.
Entrer1104400Cen entréeUN.
SélectionnerGRATUITdans la liste déroulante ci-dessous.
EntrerE818980en entréeB.
Cela devrait vous donner une réponse de :
Ch(e, f, g) = 1F85C98C
∑1: Décalage circulaire vers la droite
Les calculs SHA-2 impliquaient un seul tour.
Si vous revenez au diagramme, vous verrez que H(c'est à dire, n'est pas seulement une entrée dans leCh.équation que nous venons de réaliser.Il devient également une entrée dans une autre case marquée d'un ∑. Cette case signifie le calcul suivant :
∑1(e) = ROTR6(et) ⊕ R.O.T.R.onze(et) ⊕ R.O.T.R.25(et)
Notez que ceci∑1(et)la fonction est presque la même que celle du∑0(un)fonction que nous avons exercée dans leLe ∑0opérationsection. Cependant, les deux ont des valeurs différentes pour les décalages circulaires vers la droite.
Nous avons laissé de côté le H(je)parties de l’équation encore une fois par souci de simplicité. Branchons leH(0) etvaleur pour leetvaleurs, car nous travaillons toujours surTour 0. Comme nous en avons discuté dans leLes variables d'initialisationsection, la valeur deH(0) etest510e527f. Donc:
∑1(510e527f) = ROTR6(510e527f) ⊕ R.O.T.R.onze(510e527f) ⊕ R.O.T.R.25(510e527f)
Nous avons expliqué à plusieurs reprises le fonctionnement de ces changements circulaires corrects, passons donc à notre calculateur en ligne et entrez :
510e527f dansValeurAssurerhexadécimalest sélectionné dans le menu déroulant à droite.
32 enTaille.
6 dansChangement.
S'assurerDroiteest sélectionné pour leDirection.
Clique leDécalage circulaireboîte.
Clique leEffectuer une opération de décalage de bitsbouton.
Cela devrait nous donner une réponse de :
FD443949
Conservez tous les détails identiques, sauf modifiez leChangementvaleur àonzeet cliquez sur leEffectuer une opération de décalage de bitsbouton une fois de plus. Cela devrait vous donner une réponse de :
4FEA21CA
Répétez le processus, cette fois en changeant simplement leChangementvaleur à 25. Notre réponse devrait être :
87293FA8
Nous avons maintenant chacun des résultats dont nous avons besoin pour résoudre l’équation. Mettons chacune des valeurs que nous venons de calculer dans la formule :
∑1(510e527f) = FD443949⊕ 4FEA21CA⊕ 87293FA8
Maintenant, résolvons-le en revenant à notre calculatrice pour Opérations XOR :
Entrer FD443949 en entréeUN.
SélectionnerGRATUITdans la liste déroulante ci-dessous.
Entrer 4FEA21CA en entréeB.
SélectionnerGRATUITdans la liste déroulante ci-dessous.
Entrer87293FA8en entréeC.
Cela nous donne un résultat de :
∑1(510e527f) = 3587272B
Ajout modulaire
Revenons au diagramme pour voir où aller ensuite :
Les calculs SHA-2 impliquaient un seul tour.
Si on regarde en haut à droite, on verra que la variable de travail H(je)ha une flèche qui mène à une boîte avec unsigne plusdessus. La sortie duCh.L'opération que nous avons déjà effectuée mène à la même case, ce qui signifie que nous devons effectuer une addition modulaire avec ces deux valeurs. Nous sommes toujours au milieu du Round 0, nous devons donc utiliser la variable d'initialisation, H(0)h, comme notre valeur pourh. Comme nous en avons discuté dans leLa variable d'initialisationsection.
H(0)h= 5be0cd19
La réponse à l’opération Ch était :
Ch(e, f, g) = 1F85C98C
Nous devons donc trouver la solution pour :
5be0cd19+1F85C98C
Direction notre calculateur en ligne pour l'addition hexadécimale.
Entrer5be0cd19dans le premier champ, et1F85C98Cdans le deuxième champ, puis cliquez sur calculer. Cela nous donne un résultat de :
7b6696a5
Ajout plus modulaire
Si vous tracez la flèche pointant vers cette case avec le+symbole, vous verrez qu'il devient une entrée dans une autre boîte similaire, indiquant un ajout plus modulaire. Cette fois, l’autre entrée est le résultat que nous avons obtenu en effectuant les chies circulaires à droite sur ∑1(e) dans le dernier∑1: Décalage circulaire vers la droitesection. La réponse était :
∑1(510e527f) = 3587272B
Prenons donc le résultat de la dernière section et ajoutons-le au résultat de∑1(et). L'équation est :
7b6696a5+3587272B
Allez au calculateur en ligne que nous venons d'utiliser dans la section précédente, et entrez7b6696a5dans le premier champ, et3587272Bdans le deuxième champ, puis cliquez sur calculer. Cela nous donne un résultat de :
b0edbdd0
Ajouter la valeur W… avec un ajout encore plus modulaire
Si vous consultez à nouveau le diagramme, vous verrez que la sortie de l'opération précédente va dans un autre desboîtes d'addition modulairesindiqué par le+signe. Cette fois, il est ajouté à l'une des valeurs W, qui sont des parties de notre message complété, « le hachage est compliqué » (dans le cas des valeurs W16-DANS63, ils sont dérivés du message complété, plutôt que d'en être des parties).
Nous sommes toujours dansTour 0, nous devons donc utiliserDans0, qui, comme nous l'avons discuté dans leConversion en hexadécimalsection vers le début, est :
Dans0– 68617368
Si nous ajoutons cela dans une équation d’addition modulaire avec la solution de notre dernière section, nous obtenons :
68617368+b0edbdd0
Retour au même calculateur en ligne pour ajouter des nombres hexadécimaux et saisir68617368dans le premier champ,alors b0edbdd0dans le second. Cliquez surCalculer, ce qui vous donnera une réponse de :
1194f3138
Comme nous l'avons noté dans leAddition modulaire des résultatssection, chaque fois qu'un de nos résultats atteint neuf chiffres au lieu de huit, nous devons l'annuler en supprimant simplement le chiffre le plus à gauche, le1. Par conséquent, le résultat dont nous avons besoin n’est pas réellement1194f3138. Au lieu de cela, c'est :
194f3138
Ajout du K constant… grâce à l’ajout modulaire toujours fiable
Avec la réponse ci-dessus en main, la sortie de la boîte pointe vers une autre qui a le+ symbole, indiquant à nouveau un ajout modulaire. Cette fois, l'autre flèche qui pointe vers elle dit Kje, ce qui signifie qu’il est maintenant temps d’ajouter la constante K. Nous avons répertorié chacune des 64 valeurs de K dansLa constante, Ksection. La valeur dont nous avons besoin pour le premier tour, K0est:
428a2f98
Notre opération d'addition modulaire doit donc inclure cette valeur, plus le résultat du tour précédent :
428a2f98+194f3138
Maintenant, nous devons revenir à notre calculateur en ligne pour l'addition hexadécimale et entrez428a2f98dans le premier champ, avec194f3138dans la seconde. En cliquantcalculernous donne un résultat de :
5bd960d0
L'ajout modulaire ne finit jamais
Revenez au diagramme et suivez le résultat de l’opération précédente. Il rencontre encore une autre boîte d'addition modulaire redoutée, cette fois avec la valeur H(identifiantcomme son autre entrée. Nous sommes toujours au Round 0, nous devons donc utiliser la variable d'initialisation H(0)d, lequel est:
a54ff53a
Nous devons donc trouver la réponse à :
a54ff53a+5bd960d0
Lorsque nous mettons ces valeurs dans le même calculateur en ligne , on obtient :
10129560a
Encore une fois, nous sommes tombés sur neuf chiffres, il nous suffit donc de supprimer le chiffre le plus à gauche.1, comme discuté dans leAddition modulaire des résultatssection. Par conséquent, notre réponse est réellement :
0129560a
D'où viennent les variables de travail ?
Si vous suivez la ligne en dehors de la zone du symbole +, vous verrez qu'il se retrouve dans une rangée de cases en bas, avec cette case particulière marquéeH(c'est à dire. Nous avons mentionné queLe tour 0 commence avec les variables d'initialisation, mais çales tours suivants utilisent des variables différentes à la place.
Vous vous êtes peut-être demandé d’où ces choses allaient venir, et vous avez maintenant au moins une partie de la réponse.Les valeurs de cette rangée de cases en bas deviendront les variables de travail qui seront utilisées au prochain tour.
Dans ce cas, la variable d'initialisationH(0)da été ajouté à ce qui est essentiellement un mélange des autres variables d'initialisation H(0) et, H(0)f, H(0)g, et H(0)h, à côté d'une partie de notre message d'entrée, W0,et la constante, K0. Le mélange obtenu,0129560a, devient alors la variable de travailH(1 etpour le premier tour.
Les autres variables d'initialisation suivent des processus similaires, étant modifiées et ajoutées les unes aux autres de manière étrange pour devenir de nouvelles variables de travail au tour suivant. Vous pouvez regarder les flèches pointant vers la rangée du bas pour voir d’où proviennent chacune des variables de travail du tour suivant.
Cela peut ne pas sembler si important, mais c’est un élément clé de la structure qui permet à chaque hachage SHA-2 d’avoir un aspect radicalement différent, même lorsqu’une seule lettre de l’entrée est modifiée. N'oubliez pas que nous n'en sommes qu'à une partie du tour 0 et qu'il reste 63 tours supplémentaires, il y a donc beaucoup plus de possibilités de mélanger ces valeurs.
Unir les deux côtés… avec un ajout plus modulaire
Rappelez-vous de revenir auAddition modulaire des résultatssection où nous avons effectué une addition modulaire sur les valeurs suivantes :
Maj(a,b,c) + ∑0(une) =08909ae5
Après avoir trouvé la solution, nous avons dû faire une pause sur ce fil du diagramme pendant que nous trouvions les autres composants. Maintenant, nous avons fait tout ce que nous devions faire et nous sommes prêts à y retourner.
Juste pour être sûr que vous suivez bien, nous sommes actuellement àla case + la plus basse sur le côté gauche du diagramme, qui est alimenté par l’équation discutée ci-dessus. Notre autre entrée dans cette équation d’addition modulaire est la solution duL'ajout modulaire ne finit jamaissection, qui était :
0129560a
Nous essayons donc de trouver la solution pour :
08909ae5+0129560a
Revenons à notre calculateur en ligne et tapez08909ae5dans le premier champ, avec0129560adans la seconde. Quand nous frapponscalculer, cela nous donne :
9b9f0ef
Nous pouvons ajouter un zéro au début pour le garder cohérent à 8 chiffres :
09b9f0ef
Cette réponse est ensuite placée dans le H(i)unfente dans la rangée du bas, ce qui signifie queelle deviendra la variable de travail H(1)unau prochain tour, tour 1.
Maintenant que nous avons cette solution, nous avons enfin terminé tous les nombreux calculs impliqués dansTour 0.
Les autres variables de travail
Nous avons déjà discuté de la variable de travailH(c'est à dire, et maintenant la variable de travailH(i)un aussi. Il est maintenant temps de déterminer d'où proviennent le reste des variables de travail afin que nous puissions les utiliser au premier tour et à chacun des tours suivants.
Comme nous en avons discuté, lors du Round 0, les variables de travail étaient un ensemble de nombres prédéfinis que nous avons appelés variables d'initialisation :
- H(0)un= 6a09e667
- H(0)b= bb67ae85
- H(0)c= 3c6ef372
- H(0)d= a54ff53a
- H(0) et= 510e527f
- H(0)f= 9b05688c
- H(0)g= 1f83d9ab
- H(0)h= 5be0cd19
Il est maintenant temps de déterminer quelles seront les autres variables de travail pour le début du premier tour. Heureusement, le diagramme rend les choses assez simples :
Les calculs SHA-2 impliquaient un seul tour.
Si nous regardons la rangée du bas où il est écritH(je)b, nous pouvons retracer la flèche pour voir que la valeur est simplementH(i)un. CommeH(0)unest6a09e667, cela signifie que notre variable de travail pour le premier tour,H(1)b, sera aussi6a09e667.
Passer àH(je)cdans la rangée du bas, nous voyons que la flèche part duH(je)bcase dans la rangée supérieure. Par conséquent, laH(0)bvaleur,bb67ae85, deviendra la variable de travailH(1)cau premier tour.
Quand nous nous tournons versH(identifiantdans la rangée du bas, on voit que la flèche le relie àH(je)cau sommet. Donc,H(1)dest la même valeur queH(0)c, lequel est3c6ef372.
En continuant, la flèche vers le basH(c'est à direvient de l'ajout modulaire deH(identifiantet le résultat que nous avons obtenu en ajoutant la consonne. Nous avons trouvé cette valeur dansL'ajout modulaire ne finit jamaissection, donc la valeur deH(1 etest0129560a.
Les valeurs pourH(si,H(je)getH(je)hsont simples à comprendre. Si nous suivons les flèches de ces valeurs dans la rangée du bas, nous voyons que les flèches proviennent deH(c'est à dire,H(sietH(je)g, respectivement.
Donc:
H(0) et, qui était 510e527f, devientH(1)f.
H(0)f, qui était 9b05688c, devientH(1)g.
H(0)g, qui était 1f83d9ab, devientH(1)h.
Pour récapituler, les variables de travail que nous utiliserons comme certaines de nos entrées pour le premier tour sont :
- H(1)un= 09b9f0ef
- H(1)b= 6a09e667
- H(1)c= bb67ae85
- H(1)d= 3c6ef372
- H(1 et= 0129560a
- H(1)f= 510e527f
- H(1)g= 9b05688c
- H(1)h= 1f83d9ab
Tour 1 (et tours suivants)
Nous avons terminé le Round 0 et nous savons quelles sont les variables de travail pour le Round 1. Si vous vous référez auConversion en hexadécimalsection, nous connaissons également la valeur W que nous devons utiliser au premier tour :
Dans1= 346E6720
Vous pouvez également trouver la valeur K dont nous avons besoin dans leLa constante, K, section. Cette fois, nous avons besoin de la valeur dans la deuxième colonne de la ligne du haut :
K1=71374491
Nous avons maintenant toutes les informations dont nous avons besoin pour commencer le premier tour. Tout d’abord, revenons au schéma de l’ensemble de l’algorithme :
L'algorithme SHA-2
Si nous suivons les flèches qui sortent du bas deTour 0, vous verrez qu'ils pointent versT rond. Le tour t a également des entrées de Wtet Kt.T rondn'est qu'un remplaçant pour chacun des 62 tours entreTour 0etTour 63, car tirer 64 tours n'aurait pas été pratique.
Imaginez plutôt que les flèches du Round 0 se dirigent réellement vers le Round 1 et que les autres entrées sont en réalité W.1et K1.
Maintenant, revenons au diagramme pour un seul cycle de SHA-2 :
Les calculs SHA-2 impliquaient un seul tour.
Comme l'indiquent les deux schémas, pour terminer le tour 1, il suffit de répéter chacune des opérations que nous avons effectuées lors du tour 0. La seule différence est que nous commençons avec des valeurs différentes. Au lieu de W0nous utilisons W1. Au lieu de K0nous utilisons K1. Au lieu de tous les H0variables d'initialisation, nous utilisons le H1variables de travail. Nous venons de répertorier chacune de ces contributions dont nous avons besoin pour commencer le premier tour, afin que vous disposiez de toutes les informations dont vous avez besoin pour commencer.
Votre première étape consiste à comprendreMaj (a, b, c). Cette fois, vous devez utiliser le nouveauTour 1entrées de :
- H(1)un= 09b9f0ef
- H(1)b= 6a09e667
- H(1)c= bb67ae85
Nous avons décrit le processus dans leL'opération Majsection. Cela impliquait à la fois des opérations ET et des opérations XOR, et nous l'avons complété en plusieurs étapes à l'aide des calculateurs en ligne. Une fois que vous avez répété le processus avec les nouvelles valeurs d'entrée, vous pouvez déterminer la marche à suivre en revenant soit au diagramme, soit auLe ∑0opérationsection de notre article.
Dans cette section, nous avons effectué une série de décalages circulaires vers la droite ainsi que des opérations XOR. Cette fois, vous devez utiliser le nouveauunvaleur, H(1)un, lequel est:
09b9f0ef
Le reste des opérations est le même, y compris le nombre de bits à décaler. Une fois que vous avez le résultat, il est temps de passer à l’étape suivante, que vous pourrez retrouver soit en consultant le schéma, soit en vous référant à l’article. Une fois que vous avez ce résultat, vous devez continuer à avancer, en effectuant à chaque fois les mêmes opérations, mais avec les nouvelles valeurs d'entrée lorsque cela est approprié.
En résumé,pour terminer le premier tour, vous devez avoir:
- Effectué leOpération majeure.
- Terminé le∑0opération.
- Ajout modulaire utilisé sur ces deux résultats antérieurs.
Alors:
- Terminé lefonction conditionnelle.
- Fini le∑1opération.
- Ajout modulaire effectué sur le résultat de la fonction conditionnelle et la valeur de H(1)h
- J'ai pris le résultat de la dernière étape et je l'ai ajouté au résultat du ∑1fonctionnement par ajout modulaire
- Ajout de ce résultat à W1grâce à l'ajout modulaire
- Ajout modulaire utilisé pour prendre le résultat de la dernière étape et ajouter K1
- Ajout du résultat de l'étape précédente à H(1)davec ajout modulaire
En suivant ces étapes, vous devez :
- Prenez le résultat que vous avez obtenu en ajoutant K1(il y a deux étapes), et ajoutez-le à la solution que vous avez obtenue en utilisant l'addition modulaire pour combiner les résultats duOpération majeureet le∑0opération(vous avez obtenu cette réponse à la troisième étape, au bas de la première série de puces)
- Utilisez le schéma et nos descriptions dans leLes autres variables de travailsection pour déterminer quelles valeurs deviendront le H(deux)variables de travail dont vous aurez besoin pour le tour 2
Une fois que vous en êtes à ce stade, il est temps pour vous decommencez le tour 2, cette fois en utilisant le H(deux)variables de travail que vous venez de comprendre, aux côtés de Wdeuxet Kdeux. Le tour 2 se déroule exactement de la même manière, sauf qu'il utilise ces nouvelles entrées le cas échéant.
Lorsque vous aurez terminé le tour 2, vous aurez les variables de travail dont vous avez besoin pour le tour 3, et vous n'aurez besoin que du W3et K3valeurs que nous avons répertoriées plus tôt dans l’article pour terminer les opérations.
Ce processus se répète aux tours 4 et 5 et ainsi de suite, les résultats devenant les variables de travail pour le tour suivant. La seule complication survient au Round 16, où vous devez utiliser le W16valeur que nous avons déjà calculée dans le premierAjout modulairesection, qui se trouvait vers le début de l’article.
La tâche devient encore plus complexe pour les tours 17 à 63, car vous devrez calculer vous-même les valeurs W, en utilisant la méthode décrite dansles autres valeurs Wsection et les parties suivantes de l’article.
En supposant que vous surviviez à l'épreuve et parveniez à atteindre la fin du Round 63, il vous restera huit H.(je)valeurs comme résultats de chacun des calculs que vous avez effectués tout au long du tour.
Le XOR final
Si vous revenez au schéma global de la fonction SHA-2, vous verrez la dernière étape :
L'algorithme SHA-2
Vous verrez que les résultats du Round 63, qui sont les huit valeurs H finales que vous auriez déterminées à ce stade, se dirigent tous vers une série de boîtes d'addition modulaires. Ces cases comportent également d'autres flèches de saisie qui remontent à H.(i-1). Cela signifie que les autres entrées dans chacune de ces opérations d'addition modulaire sont les variables d'initialisation.
Par conséquent, vous devez effectuer les calculs d’addition modulaire suivants :
- Finale Hunvaleur + H(0)un= d6320déc
- Finale Hbvaleur + H(0)b= c80c83e4
- Finale Hcvaleur + H(0)c= c17915ee
- Finale Hdvaleur + H(0)d= 5de8587b
- Finale Hetvaleur + H(0) et= b8118258
- Finale HFvaleur + H(0)f= 759b2453
- Finale Hgvaleur + H(0)g= fce812d4
- Finale Hhvaleur + H(0)h= 7d3df56a
Il ne reste plus qu’une chose à faire : concaténer ces résultats. C'est juste un mot sophistiqué pour ajouter l'un à la fin de l'autre dans l'ordre. Lorsque vous faites cela, il vous restera :
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Le résultat ci-dessus est notre hachage SHA-2 pour « le hachage est compliqué ».Dans le diagramme, ceci est représenté par leHjeau fond.
Entrées de messages plus grandes
Si les données du message initial avaient été supérieures à 448 bits, nous n’aurions pas encore terminé. Nous aurions toujours besoin de traiter chacun des blocs restants jusqu'à ce que l'intégralité des données d'entrée ait été parcourue via l'algorithme SHA-2.
Si tel était le cas, nous n'aurions pas concaténé nos résultats finaux pour former le hachage. Au lieu de cela, chacun de ces huitHjeles valeurs seraient devenues les variables d’initialisation du bloc suivant.
Les étapes se seraient déroulées comme ci-dessus, sauf que cette fois, nos premières valeurs de 16 W auraient été des parties du deuxième bloc de données d'entrée. Les 48 valeurs W suivantes auraient été dérivées de ces 16 valeurs selon la formule que nous avons utilisée dans leplanning des messages : trouver les autres valeurs Wsection.
S'il n'y a que deux blocs de données d'entrée au total qui doivent être traités, alors après le tour 63 du deuxième bloc, les valeurs H finales sont ajoutées aux variables d'initialisation du deuxième bloc de la même manière que nous venons de démontrer pour le premier bloc. . Ces résultats seraient ensuite concaténés pour former le hachage SHA-2.
S'il y a plus de blocs, les sorties du Round 63 du deuxième bloc deviendront plutôt les variables d'initialisation du troisième bloc. Ce processus se poursuivrait jusqu'à ce que tous les blocs de données d'entrée aient été traités. Les huit sorties du bloc final seraient ensuite concaténées dans le hachage SHA-2, de la même manière que nous avons calculé le hachage pour un seul bloc de données d'entrée.