Co je algoritmus SHA-2?
Pokud jste četli náš další článek, pravděpodobně máte docela dobrou představu o tom, proč používáme SHA-2 a co to dělá v širším smyslu. Aleco se vlastně děje, když přiblížíme?Jak můžeme vzít větu jako „hašování je složité“, dát ji na internet Kalkulačka SHA-256 a skončíte s hash takto:
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Jak nám jednoduché písmeno „A“ dává něco stejně složitého?
559aead08264d5795d3909718cdd05abd49572e84fe55590eef31a88a08fdffd
Jak může celá Deklarace nezávislosti vyústit v něco tak podobného jedinému písmenu, ale také s tak široce odlišnými hodnotami?
639505bee7bdae68f224b0d5bcb1c324d0e33011d2302839b7bedfab4515a1bb
Co se skutečně děje uvnitř algoritmu SHA-2?
Jak funguje algoritmus SHA-2?
Budeme vyšetřovatjak funguje algoritmus SHA-2 na příkladu, procházíme každý krok, který přebírá naše sdělení, „hašování je komplikované“ a nějakým způsobem nám dává spletitý výstup:
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Budeme demonstrovat SHA-256, protože je to nejběžněji používaná iterace. SHA-224, SHA-384, SHA-512, SHA-512/224 a SHA-512/256 všechny fungují podobným způsobem, kromědva předchozí algoritmy mají velikost bloku 512 bitů, zatímco poslední čtyři mají velikost bloku 1024 bitů.Všimněte si, že SHA-384, SHA-512, SHA-512/224 a SHA-512/256 také zahrnují 80 nábojů, nikoli 64, které budeme popisovat.
Používají také některá mírně odlišná vstupní čísla v různých bodech algoritmu. SHA-512/224 a SHA-512/256 jsou zkrácené verze SHA-512, což znamená, že konečný hash je pouze 224 nebo 256 bitů zcela vlevo.Můžete odkazovat FIPS 180-4 pro specifika.
Převod na binární
Když do hašovací funkce SHA-256 zadáme „hašování je komplikované“, první věc, která se stane, je převedení dat na binární. Pro zjednodušení vysvětlení je to v podstatě protolidé a stroje mluví, rozumí a pracují v různých jazycích. I když je pro nás snadné myslet slovy, počítače to všechno dělají v nulách a jedničkách. Kdykoli je používáme, převádějí naše písmena a slova do binárního jazyka, kterému rozumí, aby mohli provádět výpočty. To vše se však obecně děje, aniž bychom si toho všimli, což nám poskytuje hladký uživatelský zážitek.
Písmena, čísla a symboly převádíme do binárních souborů pomocí Americký standardní kód pro výměnu informací (ASCII) , což je v podstatě jen systém, na kterém se dohodla komise chytrých lidí pro překlady mezi těmito dvěma jazyky.
Pokud se obrátíme na an ASCII tabulka , vidíme, že první písmeno naší fráze, malé písmeno „h“, je zapsáno jako „01101000“ v binární podobě. Podle stejné tabulky je malé písmeno „a“ „01100001“, zatímco „s“ je „01110011“ a „h“ je „01101000“. Písmeno „i“ je „01101001“, zatímco „n“ je „01101110“ a „g“ je „01100111“. Binární kód mezery je uveden v tabulce v horní části druhého sloupce jako znak ASCII „SP“ ve stejném řádku jako desetinné číslo 32. Je to „00100000“.
Spíše než abychom procházeli každé jednotlivé písmeno naší vzorové fráze, zadáme jej do an Převodník ASCII na binární . Zadáním dostaneme:
01101000 01100001 01110011 01101000 01101001 01101110 01100111 00100000 01101001 01110011 001011 0010101 0101101 1101 01110000 01101100 01101001 01100011 01100001 01110100 0110010
Výše uvedené pro nás jako lidi nedává smysl, ale pro stroje se říká, že „hašování je složité“.
SHA-2 a polstrování
Jakmile jsme přepsali naši frázi v binární podobě, dalším krokem je přidat výplň, což je v podstatě spousta dalších dat, která přidáme do našeho vstupu, aby měla pevnou délku. Pomáhá také předcházet útoky prodloužení délky . Různé verze SHA-2 mají následující velikosti bloků:
- SHA-224 – 512 bitů
- SHA-256 – 512 bitů
- SHA-384 – 1024 bitů
- SHA-512 – 1024 bitů
- SHA-512/224 – 1024 bitů
- SHA-512/256 – 1024 bitů
Tyto velikosti bloků představují množství dat, které algoritmus SHA-2 zpracovává najednou. Ukázali jsme, že hashovací funkce jsou schopny zpracovávat vstupy, pokud je deklarována nezávislost (SHA-256 může skutečně přijímat vstupy, které jsou řádově větší , do 264-1, což je tak obrovské číslo, že se opravdu nemusíte starat o horní limity algoritmu). Tyto informace však nezpracovává všechny najednou.
Místo toho v případě SHA-256 zpracovává informace v 512bitových blocích dat. V našem příkladu jsou věci relativně přímočaré, protoženáš vstup „hašování je komplikované“ je méně než 512 bitů dat–je to 176 bitů. Můžete jej vypočítat tak, že spočítáte každou binární číslici nebo spočítáte každé písmeno plus dvě mezery a poté vynásobíte 8, protože každý znak je dlouhý jeden bajt.
Často však potřebujeme hashovat vstupy, které jsou mnohem delší než 512 bitů. V těchto případech je zpráva jednoduše rozdělena do bloků. Pokud bychom potřebovali hashovat 10 000bitovou zprávu, bylo by potřeba ji jednoduše rozdělit do více 512bitových bloků.
V našem příkladu máme pouze 176 bitů dat, ale potřebujeme zaplnit 512bitový blok. Tohle znamená tamtobudeme muset přidat 336 bitů výplnědokončit to. SHA-2 používá následující schéma výplně:
- Přidá se „jedna“.za daty binární zprávy, která jsou hashována.
- Poté se přidávají nuly, dokud délka vstupních dat plus další z předchozího kroku nedosáhne 448 bitů. V našem příkladu máme vstupní délku 176 bitů plus délku z předchozího kroku, což nám přináší až 177 bitů. Proto potřebujeme 448 mínus 177 nul. Když to spočítáme, musímepřidejte 271 nul.
- The konečných 64 bitů z závěrečný blok (512 bitů mínus 448 bitů, které jsme již zaplnili v předchozích krocích) jsou odloženy pro zobrazení délky zprávy v binárním formátu . Protože se zabýváme pouze jedním blokem dat, jeho konec musí obsahovat tuto 64bitovou délku zprávy. Délka naší zprávy v bitech je 176, což je 10110000 binárně . To půjde na úplný konec bloku a předchozí čísla se zaplní dalšími nulami (v případech, kdy máme mnohem větší vstup, budou tyto nuly nahrazeny delší délkou zprávy zapsané binárně).
Pokud to dáme dohromady, dostaneme následující vycpaný 512bitový blok pro zprávu „hašování je komplikované“:
01101000 01100001 01110011 01101000 01101001 01101110 01100111 00100000 01101001 01110011 001011 0010101 0101101 1101 01110000 01101100 01101001 01100011 01100001 01110100 0110010 1 0 0000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000000 000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00 0 000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10110000
Pokud spočítáte jedničky a nuly, uvidíte, že ve výše uvedeném bloku je 512 bitů dat. Prvních 176 bitů je vstupní zpráva v binární podobě, „hašování je komplikované“. Následuje 1, kterou jsme zvýraznili tučně a podtržili, abychom ji lépe viděli. Pak máme 271 nul, za nimiž následuje 64bitová délka zprávy, která je také tučně a podtržená. Této délce zprávy předcházejí nuly, jak jsme již zmínili dříve.
V SHA-384, SHA-512, SHA-512/224 a SHA-512/256 je schéma vyplnění v podstatě stejné, kromě toho, že každý blok musí být vyplněn 1024 bity dat aposlední blok má následující rozdíly:
- Ve druhém kroku se přidávají nuly, dokud není dosaženo délky 896 bitů, nikoli 448 bitů.
- V posledním kroku je 128 bitů bloku vyčleněno pro připojení délky zprávy.
Pokud bychom procházeli naším příkladem s SHA-384, SHA-512, SHA-512/224 nebo SHA-512/256, vycpaný blok by vypadal téměř stejně, až na to, že by měl z druhého kroku navíc 448 nul. a dalších 64 nul z posledního kroku.
Vstupy větší než 448 bitů (pro SHA-224 a SHA-256) a 896 bitů (pro SHA-384, SHA-512, SHA-512/224 a SHA-512/256)
Často potřebujeme hashovat vstupy zpráv, které jsou větší než velikost bloku 512 bitů nebo 1024 bitů, což znamená, že potřebujeme rozdělit data do více bloků. Mezní bod pro rozdělení bloků je ve skutečnosti buď 447 bitů nebo 895 bitů, protože musí být zahrnut alespoň jeden bit výplně plus 64bitová nebo 128bitová délka zprávy.
Tohle znamená tamtopokud máte přesně 448 bitů (nebo 896 bitů) dat, která potřebujete hašovat, bude nutné je rozdělit do dvou bloků. První blok bude obsahovat všechna data plus 64 (nebo 128) bitů výplně (ten následovaný 63 nebo 127 nulami). Druhý blok bude mít dalších 448 (nebo 896) nul s 64bitovou (nebo 128bitovou) délkou zprávy označenou na konci stejným způsobem, jaký jsme ukázali v předchozí části.
449 bitů (nebo 897 bitů) dat by také zabralo dva bloky dat a místo toho by mělo před délkou zprávy jednu plus 62 (nebo 126) nul výplně.
Na druhou stranu,447 bitů (nebo 895 bitů) dat by se vešlo do jediného bloku. Zahrnovalo by 447 (nebo 895) bitů, pak výplň jednoho jeden , za kterým následuje délka zprávy 64 nebo 128 bitů.
Systém funguje stejně pro větší datové vstupy. Data jsou rozdělena do tolika bloků, kolik je potřeba, aby byla zahrnuta všechna data, plus alespoň jedna číslice výplně a 64bitová délka zprávy připojená na konec posledního bloku. V případě 5 000 bitů vstupních dat a 512bitových velikostí bloku SHA-224 nebo SHA-256 by byl vstup rozdělen do 10 bloků. Prvních devět by zahrnovalo pouze vstupní data, zatímco desátá by zahrnovala posledních 392 bitů vstupních dat, jeden , 55 nul a poté 64bitová délka zprávy na konci. To znamená celkem 5 120 bitů dat, což je 10 násobeno 512.
V případě SHA-384, SHA-512, SHA-512/224 nebo SHA-512/256 by stejných 5 000 bitů dat bylo rozděleno do šesti 1024bitových bloků. První čtyři by zahrnovaly pouze vstupní data. Pátý blok by zahrnoval konečných 904 bitů dat, a jeden a poté 119 nuly jako vycpávka. 5 000 bitů dat se nevejde do pěti bloků, protože konečných 904 bitů dat překračuje limit pro poslední blok, což je 896 bitů. Šestý blok by obsahoval 896 nul a na konci pak 128bitovou délku zprávy.
Hlavní algoritmus SHA-2
Níže uvádíme grafické znázornění algoritmu SHA-2:
Algoritmus SHA-2
Pokud jste se dříve nezabývali podobnými algoritmy, pravděpodobně to nedává moc smysl. Nebojte se, protože strávíme spoustu času podrobným vysvětlováním.
První věc, která stojí za zmínku, je, že schéma ukazuje Kolo 0, kolo T a kolo 63. Kolo 0 je první kolo, zatímco kolo T je v podstatě zástupný symbol, který představuje jakékoli kolo mezi tím, protože by bylo nepraktické losovat desítky kol. Kolo 63 je posledním kolem, což nám dává celkem 64 kol, pokud začínáme od 0.Pamatujte, že SHA-384, SHA-512, SHA-512/224 a SHA-512/256 zahrnují 80 kol namísto 64, takže proces, který se chystáme popsat, je v těchto verzích algoritmu SHA-2 poněkud odlišný.
Každé z těchto kol má své vlastní vstupy a výpočty, přičemž výstupy některých výpočtů se stávají vstupy pro následující. Jak pravděpodobně začínáte zjišťovat, algoritmus SHA-2 je komplikovaný a zahrnuje spoustu kroků a výpočtů.
Vstup zprávy M
V tomto příkladu budeme věci zjednodušovat pouze použitím našeho jediného 512bitového bloku vstupu namísto delšího a komplikovanějšího vstupu, který vyžaduje řadu bloků. Pokud bychom měli popsat proces pro delší vstupy dat, museli bychom zcela zopakovat velkou část dlouhého, spletitého procesu, který se chystáme nastínit, s každým z různých bloků vstupních dat.
Když se podíváte na výše uvedený diagram vlevo nahoře, uvidíteVstup zprávy (M). Toto je 512bitový polstrovaný blok naší zprávy „hašování je komplikované“:
01101000 01100001 01110011 01101000 01101001 01101110 01100111 00100000 01101001 01110011 001011 0010101 0101101 0 00 0 011 1000 01101100 01101001 01100011 01100001 01110100 01100101 01100100 10000000 00000000 000 000 00 0 0 0 0 0000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0000 00 0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10110000
Naše vstupní zpráva je nejprve rozdělena do šestnácti 32bitových slov označených W0je W.patnáct:
- v0– 01101000 01100001 01110011 01101000
- v1– 0110100 01101110 01100111 00100000
- vdva– 01101001 01110011 00100000 01100011
- v3– 01101111 01101101 01110000 01101100
- v4– 01101001 01100011 01100001 01110100
- v5– 01100101 01100100 10000000 00000000
- v6– 00000000 00000000 00000000 00000000
- v7– 00000000 00000000 00000000 00000000
- v8– 00000000 00000000 00000000 00000000
- v9– 00000000 00000000 00000000 00000000
- v10– 00000000 00000000 00000000 00000000
- vjedenáct– 00000000 00000000 00000000 00000000
- v12– 00000000 00000000 00000000 00000000
- v13– 00000000 00000000 00000000 00000000
- v14– 00000000 00000000 00000000 00000000
- vpatnáct– 00000000 00000000 00000000 10110000
Převod do šestnáctkové soustavy
Než půjdeme dále, převedeme výše uvedené binární číslice na jiný systém číslování, který se nazývá hexadecimální. Pokud jste věnovali zvýšenou pozornost, možná jste si všimli, že náš hash obsahuje spoustu písmen:
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Je to proto, že hashe se obecně zapisují v hexadecimální soustavě, což je prostě jiný způsob počítání, podobně jako se liší binární a desítková soustava, na kterou jsme všichni zvyklí.
Binární je systém se základnou 2, což v podstatě znamená, že máte dvě možnosti, 1 a 0, než budete muset začít reprezentovat informace větším počtem číslic.
Naše běžná desítková soustava je základ 10, což znamená, že máme 10 možností, 0, 1, 2, 3, 4, 5, 6, 7, 8 a 9, než nám dojde a budeme muset začít kombinovat čísla, aby představovala větší množství dat, například když zkombinujeme 1 a 0, abychom vytvořili 10.
Hexadecimální je systém se základem 16, což znamená, že máme 16 možností:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f
Když použijeme základ 16, hodnota 10 není stejná pohodlná hodnota, se kterou jsme vyrostli. Místo toho je 10 v základu 16 skutečně číslo 16, na které jsme zvyklí v desítkové soustavě. V základu-10 je naše známé, desetinné číslo 10 reprezentováno anA, 11 jeb, 12 jeC,13 jed, 14 jeaa 15 jeF.
Jít příliš do hloubky v šestnáctkové soustavě odvede pozornost od hlavního tématu, ale můžete najít další informace tady .
Vše, co potřebujete vědět, je, že přepínáme náš vstup z binárního na hexadecimální, a to zadáním našich binárních hodnot do jednoduchý online převodník (pokud to zkoušíte sami a kopírujete binární čísla shora, odstraňte mezery). Mělo by vám to dát:
- v0– 68617368
- v1– 346E6720
- vdva– 69732063
- v3- 6F6D706C
- v4– 69636174
- v5– 65648000
- v6– 00000000
- v7– 00000000
- v8– 00000000
- v9– 00000000
- v10– 00000000
- vjedenáct– 00000000
- v12– 00000000
- v13– 00000000
- v14– 00000000
- vpatnáct– 000 000 B0
Plán zpráv: Nalezení dalších hodnot W
Algoritmus SHA-2
Pokud pozorně prozkoumáte diagram, všimnete si, že jedním ze vstupů pro kolo 63 je W63. Máme jen W0je W.patnáctzatím, takže to znamená, že potřebujeme dalších 48 hodnot, než budeme mít všechny naše W vstupy. Ve verzích algoritmu SHA-384, SHA-512, SHA-512/224 a SHA-512/256 bychom potřebovali celkem 80 hodnot, takže bychom museli odvodit dalších 64.
Tyto vstupy se počítají v označeném poliplán zprávv diagramu. V obou případech je odvodíme pomocí následujícího vzorce:
vt= p1(Vt-2) + Wt-7+ str0(Vt-15) + Wt-16
Zmatený? Neobviňujte nás, obviňujte kryptografy, kteří to navrhli. Začněme tím, že se pokusíme vysvětlit několik hodnot ve výše uvedené rovnici.
tje v podstatě záskok pro kterékoli kolo, které právě máme.Pokud jsme v prvním kole, kterému inženýři milostivě říkají kolo 0,tje 0. Takžepokud vidíš W0, znamená hodnotu pro W v 0. kole. Tento zápis používáme, protože budeme používat velké množství různých hodnot pro W v různých fázích algoritmu. Mnoho dalších proměnných také používá měnící se hodnoty v průběhu jednotlivých fází algoritmu.
Další hodnota, se kterou jste pravděpodobně zmateni, je:
p1(X)
Symbol je znám jako asigmaa vedle čísla 1 zastupuje následující funkci:
p1(x) = ROTR17(X) ⊕ R.O.T.R.19(X) ⊕ SHR10(X)
Než budeme moci plně porozumět tomu, jak funguje plán zpráv, budeme muset tuto funkci vysvětlit.
Směnové operace
ROTR z předchozí rovnice signalizuje, že musíme provést akruhový pravý posunna hodnotě, která za ním následuje, x. Posouvá se podle počtu bitů zobrazených v horním indexu. Vezměme si první segment:
R.O.T.R.17(X)
Výše uvedené je opravdu jen říká k posunutí hodnotyX 17 bitůkže jo. Abychom vám dali příklad, jak to funguje, pokud je hodnota x 1000 1001 a my chceme provést kruhový pravý posun o1 bit, v podstatě bychom vzali hodnotu ve sloupci úplně vpravo:
1000 1001
A přesuňte jej doleva:
1100 0100
Abychom koncept znovu demonstrovali, tentokrát s kruhovým posunem doprava o 3 bity, vezmeme stejné číslo:
1000 1001
Tentokrát vezmeme každou ze tří číslic zcela vpravo a přesuneme je doleva:
0011 0001
Tento typ operace je zahrnut jak v první části rovnice, tak i ve střední části s posuny o17a19bitů resp.
Poslední část rovnice říká:
SHR10(X)
SHR nám říká, abychom provedli podobnou, ale mírně odlišnou operaci, známou jako alogický levý posun. V tomto případě posuneme hodnotu x doleva o počet bitů v horním indexu,10a pak pravou stranu vyplňte nulami. Vezměme stejné číslo jako předtím, abychom ukázali, jak to funguje:
1000 1001
Provedeme posun o 10 bitů doleva v 10 krocích, přičemž poslední číslice bude tučně označena pouze proto, abychom vám pomohli sledovat průběh:
0001 0010
0010 0100
01001000
10010000
0010 0000
0100 0000
1000 0000
0000 0000
0000 0000
0000 0000
Během prvních sedmi tahů jsme viděli, jak se data pomalu přesouvají doleva a nahrazují je nulami napravo. Při osmém tahu byla všechna původní data úplně pryč a byla nahrazena nulami.
Všimněte si rozdílu mezi tímlogický levý posunoperace a dříve diskutovanékruhový pravý posun. Nejen, že k pohybu dochází v různých směrech, ale kruhový pravý posun recykluje data na druhou stranu, zatímco logický levý posun je zahodí a vyplní prostor, který se otevře, nulami.
Pokud budeme o těchto posunech diskutovat příliš podrobně, dostaneme se na tečnu, ale více o tom, jak fungují, se můžete dozvědět zde zdroj .
operace XOR
Poslední část naší operace, kterou musíme vysvětlit, jesymbol ⊕, který spojuje každou z těchto složek dohromady. ⊕ znamená operaci XOR, což je logická operace, která v podstatě znamenájeho výstup je pravdivý, pokud je jeden vstup pravdivý, ale je nepravdivý, pokud oba vstupy nebo žádný vstup jsou pravdivé.
Je těžké to vysvětlit, aniž byste se ponořili do úplné přednášky o booleovské algebře a logických operacích. Tento odkaz vám poskytne trochu přehledu, ale opravdu tomu nemusíte rozumět do hloubky, abyste získali slušný přehled o tom, jak funguje zbytek algoritmu. Jediné, co musíte vědět, je, že v podstatě budeme sčítat nějaká čísla dohromady, ale pomocí nějaké podivné matematiky, kterou jste se pravděpodobně ve škole neučili.
Řešení první části naší rovnice
Nyní, když jsme probrali některé detaily operací, pojďme se znovu podívat na rovnici, která nás zarazila:
vt= p1(Vt-2) + Wt-7+ str0(Vt-15) + Wt-16
Kde:
p1(x) = ROTR17(X) ⊕ R.O.T.R.19(X) ⊕ SHR10(X)
A:
p0(x) = ROTR7(X) ⊕ R.O.T.R.18(X) ⊕ SHR3(X)
Nyní se pokusíme zjistit hodnotu pro W16, protože je to první číslo, které musíme pomocí této rovnice zjistit. Zapojme naši hodnotu:
v16= p1(V16-2) + W16-7+ str0(V16-15) + W16-16
Proto:
v16= p1(V14) + W9+ str0(V1) + W0
Známe všechny hodnoty W na pravé straně rovnice, protože jsou to slova W, která jsme zjistili rozdělením našeho vycpaného bloku zpráv. Hodnoty v binární i hexadecimální soustavě jsou:
- v0–68617368nebo01101000 01100001 01110011 01101000
- v1–346E6720nebo0110100 01101110 01100111 00100000
- v9–00000000nebo00000000 00000000 00000000 00000000
- v14–00000000nebo00000000 00000000 00000000 00000000
Než zapojíme všechna čísla, pojďme zjistit, k čemu je hodnotap1(V14)pomocí rovnice, kterou jsme probrali výše:
p1(V14) = ROTR17(V14) ⊕ R.O.T.R.19(V14) ⊕ SHR10(V14)
S W14hodnoty v hexadecimální soustavě, rovnice vypadá takto:
p1(00000000) = ROTR17(00000000) ⊕ R.O.T.R.19(00000000) ⊕ SHR10(00000000)
Prvním krokem je provést posuny, které jsme popsali dříve pro každou část rovnice. Přepneme na binární hodnotu pro W14spíše než hexadecimální, protože to usnadňuje vidět posuny, které budeme provádět. Všimněte si, že binární a hexadecimální verze jsou jednoduše různé reprezentace stejné hodnoty, takže jejich přepínání, když je to vhodné, nezpůsobuje žádné problémy:
R.O.T.R.17(00000000 00000000 00000000 00000000)
Výsledek výše uvedené operace bude extrémně předvídatelný, protože jsou to samé nuly, ale stejně to projdeme, abychom vám dali představu o tom, co se děje. Přejděte na následující online nástroj a zadejte binární hodnotu pro W14, 32 nul, do označeného vstupního poleHodnota. Ujistěte se, že jste odstranili mezery. Vstupte32vVelikost, protože vstupní hodnota je dlouhá 32 bitů. Typ17vPosunpole, abyste se ujistili, že posune hodnotu o 17 mezer. Ujistěte se, že je směr nastaven naŽe jo. VybratKruhový posunpole a potom klepněte na tlačítkoProveďte operaci bitového posunu. Tím se provede kruhový posun doprava.
Není překvapením, že vám to dá hodnotu:
00000000 00000000 00000000 00000000
Zdá se, že se nic nestalo, ale nuly byly posunuty. Prostě to nemůžeme říct a zdá se to nesmyslné, protože všechny jsou nuly.
Nyní je čas provést střední část operace:
R.O.T.R.19(00000000 00000000 00000000 00000000)
V tomto případě je vše stejné, kroměPosunhodnota je nyní19. To nám dává výstup:
00000000 00000000 00000000 00000000
Nyní k závěrečné části:
SHR10(00000000 00000000 00000000 00000000)
Pamatujte, že SHR představuje alogický levý posun, takže tentokrát musíme vyladit nastavení. TheHodnotaaVelikostzůstat stejné, ale musíme se ujistit, že:
Posunje nastaveno na10
Směrje nastaveno naVlevo, odjet
Logický posunje vybráno.
Opět dostaneme stejný výstup:
00000000 00000000 00000000 00000000
I když se to mohlo zdát jako zbytečná snaha, bylo to jen proto, že naše startovní číslo byly samé nuly. Když tyto operace provedete s jinými čísly, skutečně dojde ke změnám.
Binární a hexadecimální řetězec nuly jsou stejné, takže když přejdeme k další části našeho výpočtu, přepneme tyto hodnoty zpět na hexadecimální, aby se lépe vešly na stránku:
p1(V14) = 00000000 ⊕ 00000000 ⊕ 00000000
V tomto můžeme vyřešit tuto rovnici online kalkulačka zadáním:
00000000dopole A.
VýběrVOLNÝ, UVOLNITz rozbalovací nabídky pod ním.
00000000dopole B.
VýběrVOLNÝ, UVOLNITz rozbalovací nabídky pod ním.
00000000dopole C.
Pokud jste to udělali správně, mělo by se to ukázatA XOR B XOR Cv označeném rámečkuLogický výraz. Odpověď vám dá v označeném poliVýsledek operace. V tomto případě je to:
0nebo00000000nebo00000000 00000000 00000000 00000000.
Je to nudná odpověď, ale posune nás o krok blíže k vyřešení naší rovnice, protože nyní víme, že:
p1(V14) = 00000000
Pokud se posunete zpět, uvidíte, že potřebujeme najít ještě jednu součást a pak budeme schopni rovnici vyřešit. Musíme najít hodnotu pro σ0(V1), který používá následující rovnici:
p0(x) = ROTR7(X) ⊕ R.O.T.R.18(X) ⊕ SHR3(X)
Jak jsme uvedli výše, víme, že W1je :
346E6720
Proto:
p0(346E6720) = ROTR7(346E6720) ⊕ R.O.T.R.18(346E6720) ⊕ SHR3(346E6720)
Tato rovnice je téměř přesně stejná jako ta, kterou jsme právě vyřešili. Kvůli stručnosti to nebudeme rozebírat, ale pokud byste si to chtěli vyzkoušet sami, postupujte podle všech kroků, které jsme provedli výše, ale změňtePosunpokaždé k7,18a3, resp.
p0(346E6720) =4068DCCE ⊕ 99C80D1B ⊕ A3733901
Jakmile to vyřešíte, zjistíte, že odpověď zní:
p0(346E6720) =7AD3E8D4
Modulární přídavek
Nyní, když známe hodnoty pro obap1(V14)ap0(V1), jsme konečně připraveni zjistit hodnotu pro W16:
v16= p1(V14) + W9+ str0(V1) + W0
v16= 00000000 + 00000000 + 7AD3E8D4 + 68617368
Výše uvedená rovnice vypadá poměrně jednoduše. Jediná věc, kterou musíme poznamenat, je, že znaménka plus v něm představují modulární sčítání, nikoli normální sčítání.
Abychom demonstrovali koncept s 8místným desítkovým číslem, pokud bychom použili modulární sčítání k přidání 1 k 99 999 999, odpověď není 100 000 000, jak byste očekávali. Místo toho se jednoduše vrátí na začátek stejným způsobem, jako 1 následuje 12 na hodinách. Odpověď je 0 nebo 00 000 000. Překontrolovat tento primer pokud potřebujete krátký úvod do modulární aritmetiky.
Modulární sčítání v podstatě umožňuje přidávat čísla, aniž by se vaše odpověď prodlužovala. Jako další desetinný příklad vezměte následující:
76,487,639 + 98,094,034
Při normálním sčítání by odpověď byla:
76 487 639 + 98 094 034 =174,581,673
S modulárním přidáním můžeme jednoduše vyhodit1a naše odpověď je:
76 487 639 + 98 094 034 =74,581,673
Úplně stejné výpočty můžeme provést s hexadecimálními čísly v naší rovnici:
v16= 00000000 + 00000000 + 7AD3E8D4 + 68617368
Vyřešíme to pomocí tohoto online kalkulačka . V našem příkladu se nemusíme obtěžovat přidáváním nul, protože nezmění hodnotu, a můžeme jednoduše přidat7AD3E8D4a68617368. Pokud v budoucnu potřebujete použít stejný nástroj k přidání dalších čísel, můžete operaci jednoduše provést vícekrát a přidat další číslo k výsledku z předchozí rovnice.
Naši rovnici můžeme vyřešit zadáním7AD3E8D4do prvního pole online kalkulačky a68617368do druhého. To nám dává výsledek:
v16= e3355c3c
Pamatujte, že toto má být modulární sčítání, takže pokud výsledek přesáhl osm číslic, museli bychom odstranit číslici zcela vlevo. Náš výsledek má pouze 8 číslic, takže se v tomto případě nemusíme obávat.
Byl to dlouhý a spletitý proces, ale konečně máme odpověď pro W16. Svée3355c3c. Stejnou sadu výpočtů je třeba provést pro všechny hodnoty W, od W17je W.63.
Ukázali jsme, jak tyto výpočty fungují, takže je čas přejít k dalším aspektům algoritmu SHA-2.
Inicializační proměnné
Nyní, když jsme probrali, odkud všechny W vstupy pocházejí, vraťme se k našemu diagramu:
Algoritmus SHA-2
Nahoře si všimnete, že je napsáno Hi-1. To představuje pracovní proměnné, které fungují jako vstupy v každém kole. Těchto proměnných je osm a jsou aktualizovány na konci každého kola. Pro začátek inicializační proměnné, H(0)jsou:
- H(0)a= 6a09e667
- H(0)b= bb67ae85
- H(0)c= 3c6ef372
- H(0)d= a54ff53a
- H(0) a= 510e527f
- H(0)f= 9b05688c
- H(0)g= 1f83d9ab
- H(0) h= 5be0cd19
Výše uvedená čísla jsou odvozena od druhých odmocnin prvních osmi prvočísel, ale pro naše účely nezáleží na tom, odkud pocházejí. Jediné, co musíte vědět, je, že musíme začít s konkrétními čísly uvedenými výše.
V dalších kolech se tyto hodnoty budou lišit. Pro jednoduchost a pro znázornění jejich měnících se hodnot jsou v diagramu tyto vstupy zobrazeny jakoa, b, c, d, e, f, g a h, spíše nežH(0)a, H(0)batd., nebo H(1)a, H(1)b, atd..
Konstanta, K
V každém kole vezmeme pracovní proměnné a zkombinujeme je s hodnotou W vhodnou pro kolo, kterou jsme popsali v předchozí části. Pokud se podíváte na pravou stranu kol v diagramu, uvidíte další vstup,K. Existuje 64 samostatných 32bitových hodnot pro K, jedna pro každé ze 64 kol. Jsou odvozeny od krychlových odmocnin prvních 64 prvočísel. V hexadecimální soustavě jsou tyto osmiznakové konstanty pro každé kolo následující, čtou se zleva doprava a poté sestupují na další řádek:
|_+_|Všimněte si, že hodnoty pro K jsou 64 bitů dlouhé v SHA-384, SHA-512, SHA-512/224 a SHA-512/256. Těchto hodnot je také 80, nikoli 64. Můžete je zkontrolovat v FIPS 180-4 V případě potřeby.
Operace Maj
Konečně máme všechny naše vstupy. Nyní je čas zjistit, jak je každé kolo SHA-2 používá. Následující diagram poskytuje dobrý přehled toho, jak SHA-2 používá všechny tyto vstupy:
Výpočty SHA-2 zahrnuté v jediném kole.
Když se podíváte nahoru, máme pracovní proměnné,H(IA, H(i)b, H(i)c, H(i)d, H(tj, H(li, H(i) ga H(i)h. Ty jsou stejné jako pracovní proměnnéa, b, c, d, e, f, g ahv diagramu pro celý algoritmus SHA-2. V prvním kole to budou příslušné inicializační proměnné, které jsme uvedli v předchozí části. Pokud se podíváte na H(IA, H(i)b, H(i)c, v levém horním rohu uvidíte, že všechny tři vstupy mají šipky ukazující na pole,mjr. To znamená následující rovnici:
Maj (a,b,c) = (a AND b) ⊕ (a AND c) ⊕ (b a c)
Abychom usnadnili čtení rovnice, odstranili jsme H(i)z každé proměnné a prostě je nechal jakoA,b, aC. Dokud si pamatujete, že hodnotyA,baCměnit s každým kolem, mělo by to usnadnit sledování.
Již jsme se vypořádali s ⊕ symbol, aleAv této souvislosti je pro nás novinkou. Toto je další operace v Booleově algebře. Odkazuje na logickou konjunkci, což v podstatě znamená, že výstup je pravdivý, pouze pokud jsou pravdivé oba vstupy. Můžeš více se dozvíte zde , ale my skočíme dopředu a jednoduše použijeme an online kalkulačka k provedení této operace.
Nejprve vhodíme inicializační proměnné, které jsme uvedli vInicializační proměnnésekce:
Maj (6a09e667, bb67ae85, 3c6ef372) = (6a09e667 AND bb67ae85) ⊕ (6a09e667 AND 3c6ef372) ⊕ (bb67ae85 AND 3c6ef372)
Kalkulačka, kterou používáme, je poměrně omezená, takže výpočet budeme muset provést v několika fázích.
Vstupte6a09e667do vstupuA.
VybratAz rozbalovacího seznamu níže.
Vstuptebb67ae85do vstupuB.
To vám dává výsledek:
2A01A605
Další:
Vstupte6a09e667do vstupuA.
VybratAz rozbalovacího seznamu níže.
Vstupte3c6ef372do vstupuB.
To vám dává výsledek:
2808E262
Pak:
Vstuptebb67ae85do vstupuA.
VybratAz rozbalovacího seznamu níže.
Vstupte3c6ef372do vstupuB.
To vám dává výsledek:
3866A200
Všechny tyto odpovědi dáme do rovnice:
Maj (6a09e667, bb67ae85, 3c6ef372) = 2A01A605 2808E262 3866A200
Teď už zbývá jen změnit údaje v naší online kalkulačce ještě jednou:
Vstupte2A01A605do vstupuA.
VybratVOLNÝ, UVOLNITz rozbalovacího seznamu níže.
Vstupte2808E262do vstupuB.
VybratVOLNÝ, UVOLNITz rozbalovacího seznamu níže.
Vstupte3866A200do vstupuC.
To nám dává:
Maj(a,b,c)=3A6FE667
∑0úkon
Nyní, když máme odpověď naMaj(a,b,c)vraťme se ke schématu a uvidíme, co bude dál:
Výpočty SHA-2 zahrnuté v jediném kole.
Uvidíte, že šipka odH(IAtaké poukazuje nasymbol ∑. To znamená, že musíme vzít H(IAzadejte a proveďte následující výpočet:
∑0(a) = ROTRdva(A) ⊕ R.O.T.R.13(A) ⊕ R.O.T.R.22(A)
Opět jsme vynechali H(i)pro přehlednost. Těmi jsme se již zabývalikruhové posuny doprava, stejně jakooperace XOR. Tentokrát musíme provést kruhové posuny doprava o 2, 13 a 22 bitů. Vraťme se k naše kalkulačka , s naší hodnotou proA,6a09e667.
Pro první část tohoto výpočtu zadejte:
6a09e667doHodnotaZajistithexadecimálníse vybírá z rozbalovací nabídky vpravo.
32 doVelikost.
2 doPosun.
Ujisti seŽe joje vybrán proSměr.
Klikněte naKruhový posunbox.
Klikněte naProveďte operaci bitového posunuknoflík.
To vám dá výsledek:
DA827999
Chcete-li získat více informací o tom, jak bylo tohoto výsledku dosaženo, kalkulačka ukazuje kroky potřebné k vypracování operace. Můžete se také vrátit zpět naSměnové operacesekce pro další podrobnosti.
Pro zbývající dvě hodnoty, které musíme zjistit, potřebujeme pouze změnit hodnotu vPosunpole a poté klepněte naProveďte operaci bitového posunuznovu tlačítko.
Změna na13nám dává odpověď:
333B504F
Změna na22nám dává odpověď:
27999DA8
Nyní máme všechny hodnoty, které potřebujeme k dokončení rovnice:
∑0(6a09e667) =DA827999⊕333B504F⊕27999DA8
Vraťme se k kalkulačka které jsme používali pro operace XOR a:
VstupteDA827999do vstupuA.
VybratVOLNÝ, UVOLNITz rozbalovacího seznamu níže.
Vstupte333B504Fdo vstupuB.
VybratVOLNÝ, UVOLNITz rozbalovacího seznamu níže.
Vstupte27999DA8do vstupuC.
To nám dává výsledek:
∑0(6a09e667) = CE20B47E
Modulární sčítání výsledků
Pokud budeme postupovat podle šipek zmjrkrabice a∑box, vidíme, že výstupy jsou pak odeslány jako vstupy do boxu s a+symbol na něm. Toto představujemodulární doplněk, které, jak jsme již popsali, je velmi podobné normálnímu sčítání, až na to, že čísla se v určitém bodě jednoduše přetočí zpět na začátek, místo aby se dále zvětšovala. Pokud chcete osvěžení s podrobnějšími informacemi, podívejte se zpět na předchozí sekci modulárního přidání.
Diagram lze znázornit pomocí následujícího vzorce:
Maj(a,b,c) + ∑0(a) =3A6FE667+CE20B47E
Budeme používat stejná kalkulačka znovu.
Vstupte3A6FE667do prvního pole aCE20B47Edo druhého a poté klikněteVypočítat. To by vám mělo dát odpověď:
108909ae5
Pokud věnujete zvýšenou pozornost, můžete si všimnout, že výše uvedená odpověď má devět číslic, zatímco každá z předchozích měla pouze osm. Pokud si vzpomínáte na dobu, kdy jsme zavedli koncept modulárního sčítání, zmínili jsme se, že je to jako běžné sčítání, ale když čísla překročí určitý bod, vrátí se zpět na začátek.
Kalkulačka, kterou jsme používali, není speciálně pro modulární sčítání – pouze provádí normální sčítání, které jste se naučili na základní škole (ale s hexadecimálními čísly). To znamená, že po dosažení limitu čísla nepřetočí. Až do této chvíle jsme měli štěstí, že žádný z našich předchozích výpočtů nevedl k devítimístnému číslu.
Tentokrát jsme skončili s devíti číslicemi, když opravdu potřebujeme, aby to bylo jen osm. Dobrou zprávou je, že je snadné vyřešit náš problém. Jediné, co musíme udělat, je odstranit číslici zcela vlevo,1. Naše odpověď tedy ve skutečnosti není108909ae5. Místo toho je to:
08909ae5
Pokud se vrátíte zpět do diagramu a vysledujete čáru, která toto opouští+box jako výstup, uvidíte, že se propojí s další linkou, která obsahuje vstupy, kterými jsme se ještě nezabývali.Než se vrátíme k tomuto bodu, budeme muset provést nějaké další výpočty.
Podmíněná funkce
Tentokrát se podíváme na H(tj, H(li, H(i) gv diagramu. Všechny ukazují na označenou krabiciCh, což znamená, že tyto hodnoty fungují jako vstupy v následující funkci:
Ch(e, f, g) = (e AND f) ⊕ (NE e AND g)
Již jsme se zabývali každou z těchto operací kroměNE. Toto představuje negace , který je také známý jako logický doplněk. Nebudeme zabíhat do podrobností o tom, jak to funguje, abychom se vyhnuli přílišné tečně, ale můžete buď odkazovat na odkaz, nebo důvěřovat online kalkulačce.
Opět jsme odstranili H(i)od e, f a g, jednoduše proto, aby se to lépe četlo. Stále pracujeme na 0. kole, takže tyto hodnoty budou inicializační proměnné, které jsme uvedli dříve:
H(0) a–510e527f
H(0)f–9b05688c
H(0)g–1f83d9ab
Všimněte si, že v budoucích kolech se proměnné pro e, f a g budou lišit. Prozatím do naší rovnice vložme tyto inicializační proměnné:
Ch (510e527f, 9b05688c, 1f83d9ab) = (510e527f AND 9b05688c) ⊕ (NE 510e527f A 1f83d9ab)
Budeme muset tuto rovnici rozdělit na části, abychom ji dokončili naše kalkulačka . Za první poločas:
Vstupte510e527fdo vstupuA.
VybratAz rozbalovacího seznamu níže.
Vstupte9b05688cdo vstupuB.
To by vám mělo dát odpověď:
1104400C
Pro druhou polovinu rovnice:
VybratNetlačítko vlevo od vstupuA.
Do vstupu zadejte 510e527fA.
VybratAz rozbalovacího seznamu níže.
Do vstupu zadejte 1f83d9abB.
To by vám mělo dát výsledek:
E818980
Zapojme tyto odpovědi zpět do rovnice:
Ch(510e527f, 9b05688c, 1f83d9ab) = (1104400C) ⊕ (E818980)
Dokončete řešení:
Ujistěte se, žeNEjiž není vybráno.
Vstupte1104400Cdo vstupuA.
VybratVOLNÝ, UVOLNITz rozbalovacího seznamu níže.
VstupteE818980do vstupuB.
To by vám mělo dát odpověď:
Ch(e, f, g) = 1F85C98C
∑1: Kruhový posun doprava
Výpočty SHA-2 zahrnuté v jediném kole.
Pokud se vrátíte k diagramu, uvidíte, že H(tj, není pouze vstupem doChrovnice, kterou jsme právě provedli.Stane se také vstupem do jiného pole označeného ∑. Toto pole znamená následující výpočet:
∑1(e) = ROTR6(a) ⊕ R.O.T.R.jedenáct(a) ⊕ R.O.T.R.25(a)
Všimněte si, že toto∑1(a)funkce je téměř stejná jako∑0(A)funkce, kterou jsme vykonávali v∑0úkonsekce. Tyto dva však mají různé hodnoty pro kruhové posuny doprava.
Vynechali jsme H(i)části rovnice ještě jednou pro jednoduchost. ZapojmeH(0) ahodnotu proahodnoty, protože na nich stále pracujemekolo 0. Jak jsme diskutovali vInicializační proměnnésekce, hodnota proH(0) aje510e527f. Proto:
∑1(510e527f) = ROTR6(510e527f) ⊕ R.O.T.R.jedenáct(510e527f) ⊕ R.O.T.R.25(510e527f)
Několikrát jsme vysvětlili, jak tyto správné kruhové posuny fungují, takže pojďme k našemu online kalkulačka a zadejte:
510e527f doHodnotaZajistithexadecimálníse vybírá z rozbalovací nabídky vpravo.
32 doVelikost.
6 doPosun.
Ujisti seŽe joje vybrán proSměr.
Klikněte naKruhový posunbox.
Klikněte naProveďte operaci bitového posunuknoflík.
To by nám mělo dát odpověď:
FD443949
Udržujte všechny podrobnosti stejné, kromě změnyPosunhodnotu kjedenácta klikněte naProveďte operaci bitového posunutlačítko ještě jednou. To by vám mělo dát odpověď:
4FEA21CA
Opakujte proces, tentokrát pouze změňtePosunhodnota do 25. Naše odpověď by měla znít:
87293FA8
Nyní máme každý z výsledků, které potřebujeme k vyřešení rovnice. Každou z hodnot, které jsme právě zjistili, dáme do vzorce:
∑1(510e527f) = FD443949⊕ 4FEA21CA⊕ 87293FA8
Nyní to vyřešme návratem k naší kalkulačce Operace XOR:
Vstupte FD443949 do vstupuA.
VybratVOLNÝ, UVOLNITz rozbalovacího seznamu níže.
Vstupte 4FEA21CA do vstupuB.
VybratVOLNÝ, UVOLNITz rozbalovacího seznamu níže.
Vstupte87293FA8do vstupuC.
To nám dává výsledek:
∑1(510e527f) = 3587272B
Modulární přídavek
Vraťme se k diagramu, abychom viděli, kam dál:
Výpočty SHA-2 zahrnuté v jediném kole.
Když se podíváme vpravo nahoře, uvidíme, že pracovní proměnná H(i)hmá šipku, která vede k rámečku s aznaménko plusna to. Výstup zChoperace, kterou jsme již dokončili, vede ke stejnému boxu, což znamená, že musíme provést modulární sčítání s těmito dvěma hodnotami. Stále jsme uprostřed kola 0, takže musíme použít inicializační proměnnou H(0) h, jako naše hodnota proh. Jak jsme diskutovali vInicializační proměnnásekce.
H(0) h= 5be0cd19
Odpověď na operaci Ch byla:
Ch(e, f, g) = 1F85C98C
Proto musíme najít řešení:
5be0cd19+1F85C98C
Pojďme k našemu online kalkulačka pro hexadecimální sčítání.
Vstupte5be0cd19do prvního pole a1F85C98Cdo druhého pole a poté klikněte na vypočítat. To nám dává výsledek:
7b6696a5
Více modulární doplněk
Pokud budete sledovat šipku směřující ven z tohoto pole pomocí+symbol, uvidíte, že se stane vstupem do jiného podobného pole, což naznačuje modulárnější přidání. Tentokrát je dalším vstupem výsledek, který jsme získali provedením kruhových správných sraček na ∑1e) v posledním∑1: Kruhový posun dopravasekce. Odpověď byla:
∑1(510e527f) = 3587272B
Vezměme tedy výsledek z poslední části a přičteme jej k výsledku∑1(a). Rovnice je:
7b6696a5+3587272B
Přejít na online kalkulačka které jsme právě použili v předchozí části, a zadejte7b6696a5do prvního pole a3587272Bdo druhého pole a poté klikněte na vypočítat. To nám dává výsledek:
b0edbdd0
Přidání hodnoty W… s ještě modulárnějším přidáním
Pokud se znovu podíváte do diagramu, uvidíte, že výstup z předchozí operace jde do jiné operacemodulární přídavné boxyoznačený+podepsat. Tentokrát se přidá k jedné z hodnot W, což jsou části naší vyplněné zprávy, „hašování je komplikované“ (v případě hodnot W16-V63jsou odvozeny z vycpané zprávy, spíše než aby byly její částí).
Jsme stále uvnitřkolo 0, takže musíme použítv0, který, jak jsme diskutovali vPřevod do šestnáctkové soustavysekce směrem k začátku je:
v0– 68617368
Pokud to přidáme do modulární rovnice sčítání vedle řešení z naší poslední sekce, dostaneme:
68617368+b0edbdd0
Vraťte se ke stejnému online kalkulačka pro přidávání hexadecimálních čísel a vstup68617368do prvního pole,pak b0edbdd0do toho druhého. KlikněteVypočítat, která vám dá odpověď na:
1194f3138
Jak jsme poznamenali vModulární sčítání výsledkůKdykoli některý z našich výsledků dosáhne délky devíti číslic namísto osmi, musíme jej vrátit zpět jednoduchým odstraněním číslice zcela vlevo,1. Proto výsledek, který potřebujeme, ve skutečnosti není1194f3138. Místo toho je to:
194f3138
Přidání konstantního K… prostřednictvím vždy spolehlivého modulárního sčítání
S výše uvedenou odpovědí v ruce výstup z krabice ukazuje na jinou, která má+ symbol, což ještě jednou indikuje modulární přidání. Tentokrát druhá šipka, která k ní ukazuje, říká Ki, což znamená, že nyní je čas přidat konstantu K. Vypsali jsme každou z 64 hodnot pro K vKonstanta, Ksekce. Hodnota, kterou potřebujeme pro první kolo, K0je:
428a2f98
Takže naše modulární operace sčítání musí zahrnovat tuto hodnotu plus výsledek z předchozího kola:
428a2f98+194f3138
Nyní se musíme vrátit k našemu online kalkulačka pro hexadecimální sčítání a zadejte428a2f98do prvního pole, s194f3138ve druhém. kliknutímvypočítatnám dává výsledek:
5bd960d0
Modulární přídavek nikdy nekončí
Vraťte se do diagramu a postupujte podle výstupu z předchozí operace. Splňuje další obávaný modulární přídavný box, tentokrát s hodnotou H(i)djako jeho další vstup. Stále jsme v 0. kole, takže musíme použít inicializační proměnnou H(0)d, který je:
a54ff53a
Proto musíme najít odpověď na:
a54ff53a+5bd960d0
Když tyto hodnoty dáme do stejného online kalkulačka , skončíme s:
10129560a
Opět jsme narazili na devět číslic, takže musíme jednoduše vypustit tu úplně vlevo1, jak je diskutováno vModulární sčítání výsledkůsekce. Naše odpověď tedy skutečně zní:
0129560a
Odkud pocházejí pracovní proměnné?
Pokud budete následovat řádek z pole se symbolem +, uvidíte, že skončí v řadě polí ve spodní části, přičemž toto konkrétní pole je označenoH(tj. To jsme zmíniliKolo 0 začíná inicializačními proměnnými, ale tonásledující kola místo toho používají jiné proměnné.
Možná jste se divili, odkud se to vzalo, a teď máte alespoň část odpovědi.Hodnoty v této řadě polí ve spodní části se stanou pracovními proměnnými, které se použijí v dalším kole.
V tomto případě inicializační proměnnáH(0)dbyl přidán k tomu, co je v podstatě směsí dalších inicializačních proměnných H(0) a, H(0)f, H(0)ga H(0) h, spolu s částí naší vstupní zprávy, W0,a konstanta, K0. Výsledná směs,0129560a, pak se stane pracovní proměnnouH(1 apro kolo 1.
Ostatní inicializační proměnné probíhají podobným procesem, jsou upravovány a přidávány k sobě zvláštním způsobem, aby se v dalším kole staly novými pracovními proměnnými. Můžete se podívat na šipky směřující ke spodnímu řádku, abyste viděli, odkud pocházejí pracovní proměnné každého dalšího kola.
To se nemusí zdát tak významné, ale je to klíčová součást struktury, která umožňuje, aby každý hash SHA-2 vypadal radikálně odlišně, i když se změní pouze jediné písmeno vstupu. Pamatujte, že jsme stále jen na části cesty 0. kolem a zbývá ještě 63 kol, takže je mnohem více příležitostí tyto hodnoty zamíchat.
Sjednocení obou stran… s více modulárním přídavkem
Pamatujte zpět naModulární sčítání výsledkůsekce, kde jsme provedli modulární přidání na následujících hodnotách:
Maj(a,b,c) + ∑0(a) =08909ae5
Poté, co jsme našli řešení, jsme se museli zastavit u tohoto vlákna diagramu, zatímco jsme přišli na další komponenty. Nyní jsme udělali vše, co jsme potřebovali, a jsme připraveni se k tomu vrátit.
Abychom se ujistili, že sledujete v pořádku, jsme právě nanejnižší + pole na levé straně diagramu, který je vložen do rovnice diskutované výše. Naším dalším vstupem do této modulární rovnice sčítání je řešení zModulární přídavek nikdy nekončíoddíl, který byl:
0129560a
Proto se snažíme najít řešení:
08909ae5+0129560a
Vraťme se k našemu online kalkulačka a zadejte08909ae5do prvního pole, s0129560ave druhém. Když se trefímevypočítat, dává nám:
9b9f0ef
Na začátek můžeme přidat nulu, aby byla konzistentní na 8 číslic:
09b9f0ef
Tato odpověď se pak umístí do H(IAslot ve spodní řadě, což znamená, žestane se pracovní proměnnou H(1)av dalším kole, kolo 1.
Nyní, když máme toto řešení, jsme konečně dokončili všechny zahrnuté výpočtykolo 0.
Ostatní pracovní proměnné
Pracovní proměnnou jsme již diskutovaliH(tja nyní pracovní proměnnáH(IA také. Nyní je čas zjistit, odkud pocházejí zbývající pracovní proměnné, abychom je mohli použít v 1. kole a v každém z následujících kol.
Jak jsme diskutovali, v 0. kole byly pracovní proměnné sada předdefinovaných čísel, které jsme nazvali inicializační proměnné:
- H(0)a= 6a09e667
- H(0)b= bb67ae85
- H(0)c= 3c6ef372
- H(0)d= a54ff53a
- H(0) a= 510e527f
- H(0)f= 9b05688c
- H(0)g= 1f83d9ab
- H(0) h= 5be0cd19
Nyní je čas zjistit, jaký bude zbytek těchto pracovních proměnných pro začátek 1. kola. Naštěstí to diagram velmi usnadňuje:
Výpočty SHA-2 zahrnuté v jediném kole.
Když se podíváme na spodní řádek, kde je napsánoH(i)b, můžeme sledovat šipku zpět, abychom viděli, že hodnota je jednodušeH(IA. Tak jakoH(0)aje6a09e667, to znamená, že naše pracovní proměnná pro 1. kolo,H(1)b, bude také6a09e667.
Přesouváme se kH(i)cve spodním řádku vidíme, že šipka začíná vH(i)bpole v horní řadě. ProtoH(0)bhodnota,bb67ae85, se stane pracovní proměnnouH(1)cv kole 1.
Když se obrátíme naH(i)dve spodním řádku vidíme, že jej spojuje šipkaH(i)cNahoře. Proto,H(1)dje stejná hodnota jakoH(0)c, který je3c6ef372.
Pohybujte se, šipka dolůH(tjpochází z modulárního přidáníH(i)da výsledek, který jsme dostali, když jsme přidali souhlásku. Tuto hodnotu jsme zjistili vModulární přídavek nikdy nekončísekce, tedy hodnota proH(1 aje0129560a.
Hodnoty proH(li,H(i) gaH(i)hje snadné zjistit. Pokud budeme sledovat šipky od těchto hodnot ve spodním řádku, vidíme, že šipky pocházejí zH(tj,H(liaH(i) g, resp.
Proto:
H(0) a, který byl 510e527f, se stáváH(1)f.
H(0)f, která byla 9b05688c, se stáváH(1)g.
H(0)g, což bylo 1f83d9ab, se stáváH(1)h.
Jen pro shrnutí, pracovní proměnné, které použijeme jako některé z našich vstupů pro 1. kolo, jsou:
- H(1)a= 09b9f0ef
- H(1)b= 6a09e667
- H(1)c= bb67ae85
- H(1)d= 3c6ef372
- H(1 a= 0129560a
- H(1)f= 510e527f
- H(1)g= 9b05688c
- H(1)h= 1f83d9ab
1. kolo (a následující kola)
Dokončili jsme kolo 0 a víme, jaké jsou pracovní proměnné pro kolo 1. Pokud se vrátíte zpět naPřevod do šestnáctkové soustavyčást, známe také hodnotu W, kterou musíme použít v 1. kole:
v1= 346E6720
Hodnotu K, kterou potřebujeme, můžete také najít vKonstanta, K, sekce. Tentokrát potřebujeme hodnotu ve druhém sloupci horního řádku:
K1=71374491
Nyní máme všechny informace, které potřebujeme k zahájení 1. kola. Nejprve se vraťme ke schématu celého algoritmu:
Algoritmus SHA-2
Pokud budeme sledovat šipky, které vycházejí ze spodní částikolo 0, uvidíte, že ukazují doKulaté t. Kolo t má také vstupy Wta Kt.Kulaté tje pouze náhradníkem pro každé z 62 kol mezi nimikolo 0a63. kolo, protože tasit 64 kol by bylo nepraktické.
Místo toho si představte, že šipky z kola 0 skutečně směřují ke kolu 1 a že ostatní vstupy jsou ve skutečnosti W1a K1.
Nyní se vraťme zpět k diagramu pro jedno kolo SHA-2:
Výpočty SHA-2 zahrnuté v jediném kole.
Jak naznačují dva diagramy, abychom dokončili 1. kolo, musíme jednoduše zopakovat každou z operací, které jsme provedli v 0. kole. Jediný rozdíl je v tom, že začínáme s jinými hodnotami. Místo W0používáme W1. Místo K0používáme K1. Místo všech H0inicializační proměnné, používáme H1pracovní proměnné. Právě jsme uvedli každý z těchto vstupů, které potřebujeme k zahájení 1. kola, takže máte všechny informace, které potřebujete, abyste mohli začít.
Vaším prvním krokem je zjistitMaj (a, b, c). Tentokrát musíte použít nový1. kolovstupy:
- H(1)a= 09b9f0ef
- H(1)b= 6a09e667
- H(1)c= bb67ae85
Proces jsme popsali vOperace Majsekce. Zahrnoval operace AND i operace XOR a my jsme to dokončili v několika krocích pomocí online kalkulaček. Jakmile proces zopakujete s novými vstupními hodnotami, můžete zjistit, co dělat dále, a to buď návratem do diagramu nebo do∑0úkončásti našeho článku.
V této části jsme provedli řadu kruhových posunů doprava a také operace XOR. Tentokrát musíte použít novýAhodnota, H(1)a, který je:
09b9f0ef
Zbytek operací je stejný, včetně počtu bitů, které potřebujete posunout. Jakmile budete mít výsledek, je čas přejít k dalšímu kroku, který najdete buď v diagramu, nebo v článku. Jakmile získáte tento výsledek, musíte pokračovat v posouvání vpřed, pokaždé provádět stejné operace, ale s novými vstupními hodnotami, kdykoli je to vhodné.
jako souhrn,k dokončení 1. kola musíte mít:
- ProvedlMaj operace.
- Dokončeno∑0úkon.
- U těchto dvou předchozích výsledků bylo použito modulární sčítání.
Pak:
- Dokončenopodmíněná funkce.
- Dokončeno∑1úkon.
- Provedeno modulární sčítání na výsledku podmíněné funkce a hodnoty pro H(1)h
- Vzal výsledek posledního kroku a přičetl ho k výsledku ∑1provoz prostřednictvím modulárního přídavku
- Tento výsledek byl přidán do W1prostřednictvím modulárního přidání
- Použito modulární sčítání k odebrání výsledku z posledního kroku a přidání K1
- Přidán výsledek z předchozího kroku do H(1)ds modulárním přídavkem
Podle těchto kroků je třeba:
- Vezměte výsledek, který jste získali, když jste přidali K1(před dvěma kroky) a přidejte jej do řešení, které jste získali pomocí modulárního přidávání ke kombinaci výsledkůMaj operacea∑0úkon(tuto odpověď jste dostali ve třetím kroku, v dolní části první sady odrážek)
- Použijte schéma a naše popisy vOstatní pracovní proměnnéčásti, abyste zjistili, které hodnoty se stanou H(dva)pracovní proměnné, které budete potřebovat pro 2. kolo
Jakmile jste v tomto bodě, je čas, abyste to udělalizačněte 2. kolo, tentokrát pomocí H(dva)pracovní proměnné, které jste právě zjistili, spolu s Wdvaa Kdva. 2. kolo probíhá přesně stejným způsobem, s výjimkou použití těchto nových vstupů tam, kde je to vhodné.
Po dokončení 2. kola budete mít pracovní proměnné, které potřebujete pro 3. kolo, a budete potřebovat pouze W3a K3hodnoty, které jsme uvedli dříve v článku k dokončení operací.
Tento proces se opakuje ve 4. a 5. kole a tak dále, přičemž výsledky se stávají pracovními proměnnými pro další kolo. Jediná komplikace přichází v 16. kole, kde musíte použít W16hodnotu, kterou jsme již vypočítali v prvnímModulární přídaveksekce, která byla na začátku článku.
Úkol se pro 17. až 63. kola stává ještě složitější, protože hodnoty W budete muset vypočítat sami pomocí metody popsané vostatní hodnoty Woddíl a následující části článku.
Za předpokladu, že přežijete utrpení a zvládnete to do konce kola 63, zbude vám osm H(i)hodnoty jako vaše výstupy z každého z výpočtů, které jste v průběhu kola dokončili.
Poslední XOR
Pokud se vrátíte zpět k celkovému diagramu funkce SHA-2, uvidíte poslední krok:
Algoritmus SHA-2
Uvidíte, že výstupy z kola 63, což je osm konečných hodnot H, na které byste v této fázi přišli, všechny míří do řady modulárních přídavných boxů. Tato pole mají také další vstupní šipky, které vedou zpět k H(i-1). To znamená, že ostatní vstupy v každé z těchto modulárních operací sčítání jsou inicializační proměnné.
Proto musíte dokončit následující modulární výpočty sčítání:
- Konečná HAhodnota + H(0)a= d6320dec
- Konečná Hbhodnota + H(0)b= c80c83e4
- Konečná HChodnota + H(0)c= c17915ee
- Konečná Hdhodnota + H(0)d= 5de8587b
- Konečná Hahodnota + H(0) a=b8118258
- Konečná HFhodnota + H(0)f= 759b2453
- Konečná HGhodnota + H(0)g= fce812d4
- Konečná Hhhodnota + H(0) h= 7d3df56a
Zbývá udělat jen jednu věc, a to zřetězit tyto výsledky. Toto je jen ozdobné slovo pro přidání jednoho na konec druhého v pořadí. Když to uděláte, zůstane vám:
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Výše uvedený výsledek je náš hash SHA-2 pro „hašování je složité“.V diagramu je to znázorněnoHidole.
Větší vstupy zpráv
Pokud by počáteční data zprávy byla větší než 448 bitů, ještě bychom neskončili. Stále bychom museli zpracovávat každý ze zbývajících bloků, dokud by všechna vstupní data neprošla algoritmem SHA-2.
Pokud by tomu tak bylo, nezřetězovali bychom naše konečné výsledky, abychom vytvořili hash. Místo toho každý z těchto osmiHihodnoty by se staly inicializačními proměnnými pro další blok.
Kroky by probíhaly podobně jako výše, až na to, že tentokrát by našich prvních 16 W hodnot bylo částí druhého bloku vstupních dat. Dalších 48 W hodnot by bylo odvozeno z těchto 16 hodnot podle vzorce, který jsme použili vplán zpráv: nalezení dalších hodnot Wsekce.
Pokud jsou celkem pouze dva bloky vstupních dat, které je třeba zpracovat, pak se po 63. kole druhého bloku přidají konečné hodnoty H k inicializačním proměnným druhého bloku stejným způsobem, jaký jsme právě ukázali pro první blok. . Tyto výsledky by pak byly zřetězeny a vytvořily by SHA-2 hash.
Pokud existuje více bloků, výstupy Round 63 z druhého bloku se místo toho stanou inicializačními proměnnými pro třetí blok. Tento proces bude pokračovat, dokud nebudou zpracovány všechny bloky vstupních dat. Osm výstupů finálního bloku by pak bylo zřetězeno do hashe SHA-2 stejným způsobem, jakým jsme vypočítali hash pro jeden blok vstupních dat.