Какво представлява алгоритъмът SHA-2?
Ако сте чели другата ни статия, вероятно имате доста добра представа защо използваме SHA-2 и какво прави той в смисъл на голяма картина. Нокакво всъщност се случва, когато увеличим мащаба?Как можем да вземем изречение като „хеширането е сложно“, да го пуснем в онлайн SHA-256 калкулатор , и завършва с хеш като този:
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Как една проста буква „А“ ни дава нещо също толкова сложно?
559aead08264d5795d3909718cdd05abd49572e84fe55590eef31a88a08fdffd
Как може цялата Декларация за независимост да доведе до нещо толкова подобно на една буква, но също така с толкова различни стойности?
639505bee7bdae68f224b0d5bcb1c324d0e33011d2302839b7bedfab4515a1bb
Какво наистина се случва вътре в алгоритъма SHA-2?
Как работи алгоритъмът SHA-2?
Ще проучимкак работи алгоритъмът SHA-2 чрез пример, преминавайки през всяка стъпка, която приема нашето съобщение, „хеширането е сложно“ и някак си ни дава сложния изход от:
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Ще демонстрираме SHA-256, защото това е най-често използваната итерация. Всички SHA-224, SHA-384, SHA-512, SHA-512/224 и SHA-512/256 работят по подобен начин, с изключение напървите два алгоритъма имат размер на блока от 512 бита, докато последните четири имат размер на блока от 1024 бита.Имайте предвид, че SHA-384, SHA-512, SHA-512/224 и SHA-512/256 също включват 80 кръга, вместо 64-те, които ще описваме.
Те също така използват някои малко по-различни входни числа в различни точки на алгоритъма. SHA-512/224 и SHA-512/256 са съкратени версии на SHA-512, което означава, че крайният хеш е само най-левите 224 или 256 бита, съответно.Можете да се обърнете към FIPS 180-4 за спецификата.
Преобразуване в двоичен код
Когато въведем „хеширането е сложно“ в хеш функция SHA-256, първото нещо, което се случва е, че данните се преобразуват в двоични. За да опростим обяснението, това е основно защотохората и машините говорят, разбират и работят на различни езици. Докато за нас е лесно да мислим с думи, компютрите правят всичко с нули и единици. Всеки път, когато ги използваме, те преобразуват нашите букви и думи в двоичния език, който разбират, за да могат да извършват изчисления. Въпреки това, всичко това обикновено се прави, без да забележим, което ни осигурява гладко потребителско изживяване.
Преобразуваме букви, цифри и символи в двоични с помощта на Американски стандартен код за обмен на информация (ASCII) , което всъщност е просто система, за която комитет от умни хора се съгласи за превод между двата езика.
Ако се обърнем към ан ASCII таблица , можем да видим, че първата буква от нашата фраза, малка буква „h“, е написана като „01101000“ в двоична система. Според същата таблица малката буква „a“ е „01100001“, докато „s“ е „01110011“, а „h“ е „01101000“. Буквата „i“ е „01101001“, докато „n“ е „01101110“, а „g“ е „01100111“. Двоичният код за интервал е посочен в таблицата в горната част на втората колона като ASCII знака „SP“ в същия ред като десетичното число 32. Това е „00100000“.
Вместо да минаваме през всяка една буква от нашата примерна фраза, ние просто ще я въведем в ASCII към двоичен конвертор . Въвеждането му ни дава:
01101000 01100001 01110011 01101000 01101001 01101110 01100111 00100000 01101001 01110011 00100000 01100011 01101111 0110 1101 01110000 01101100 01101001 01100011 01100001 01110100 0110010
Горното няма смисъл за нас като хора, но за машините се казва, че „хеширането е сложно“.
SHA-2 и подложка
След като пренапишем нашата фраза в двоичен код, следващата стъпка е да добавим подложка, която по същество е куп допълнителни данни, които добавяме към нашия вход, за да я направим с фиксирана дължина. Също така помага за предотвратяване на атаки с удължаване на дължината . Различните версии на SHA-2 имат следните размери на блокове:
- SHA-224 – 512 бита
- SHA-256 – 512 бита
- SHA-384 – 1024 бита
- SHA-512 – 1024 бита
- SHA-512/224 – 1024 бита
- SHA-512/256 – 1024 бита
Тези размери на блокове са количеството данни, които алгоритъмът SHA-2 обработва наведнъж. Ние показахме, че хеш функциите са в състояние да обработват входни данни, стига Декларацията за независимост (SHA-256 може действително да приема входни данни, които са порядъци по-големи , до 264-1, което е толкова огромно число, че всъщност не е нужно да се притеснявате за горните граници на алгоритъма). Той обаче не обработва тази информация наведнъж.
Вместо това, в случая на SHA-256, той обработва информацията в 512-битови блокове от данни. В нашия пример нещата са относително прости, т.кнашият вход „хеширането е сложно“ е по-малко от 512 бита данни–това е 176 бита. Можете да го изчислите, като преброите всяка двоична цифра или като преброите всяка буква плюс двата интервала и след това умножите по 8, защото всеки знак е с дължина един байт.
Въпреки това, често се налага да хешираме входове, които са много по-големи от 512 бита по дължина. В тези случаи съобщението просто се разделя на блокове. Ако трябва да хешираме 10 000-битово съобщение, то просто трябва да бъде разделено на множество 512-битови блокове.
В нашия пример имаме само 176 бита данни, но трябва да попълним 512-битов блок. Това означава, чеще трябва да добавим 336 бита подложказа да го завършите. SHA-2 използва следната схема за подпълване:
- Добавя се „едно“.след данните от двоичното съобщение, които се хешират.
- След това се добавят нули, докато дължината на входните данни плюс допълнителната от предишната стъпка се съберат до 448 бита. В нашия пример имаме входна дължина от 176 бита, плюс тази от предишната стъпка, което ни води до 177 бита. Следователно имаме нужда от 448 минус 177 нули. Ако направим сметката, трябвадобавете 271 нули.
- The крайни 64 бита от финален блок (512 бита минус 448 бита, които вече сме попълнили в предишните стъпки) са отделени за показване на дължината на съобщението в двоичен формат . Тъй като имаме работа само с един блок от данни, краят му трябва да включва тази 64-битова дължина на съобщението. Дължината на нашето съобщение в битове е 176, което е 10110000 в двоичен код . Това ще отиде в самия край на блока и предходните числа се запълват с още нули (в случаите, когато имаме много по-голям вход, тези нули ще бъдат заменени от по-дългата дължина на съобщението, записана в двоичен код).
Ако съберем всичко заедно, ще получим следния подплатен 512-битов блок за съобщението „хеширането е сложно“:
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
Ако преброите единиците и нулите, ще видите, че има 512 бита данни в горния блок. Първите 176 бита са входното съобщение в двоичен код, „хеширането е сложно“. Следва 1, което сме удебелили и подчертали, за да го видим по-лесно. След това имаме 271 нули, последвани от 64-битовата дължина на съобщението, която също е удебелена и подчертана. Тази дължина на съобщението се предхожда от нули, както споменахме по-рано.
В SHA-384, SHA-512, SHA-512/224 и SHA-512/256 схемата за подпълване е по същество същата, с изключение на това, че всеки блок трябва да бъде запълнен с 1024 бита данни ипоследният блок има следните разлики:
- Във втората стъпка се добавят нули, докато се достигне дължина от 896 бита, вместо 448 бита.
- В последната стъпка 128 бита от блока се заделят за добавяне на дължината на съобщението.
Ако минаваме през нашия пример с SHA-384, SHA-512, SHA-512/224 или SHA-512/256, подплатеният блок ще изглежда почти по същия начин, с изключение на това, че ще има допълнителни 448 нули от втората стъпка , и още 64 нули от последната стъпка.
Входове, по-големи от 448 битове (за SHA-224 и SHA-256) и 896 битове (за SHA-384, SHA-512, SHA-512/224 и SHA-512/256)
Често трябва да хешираме входове на съобщения, които са по-големи от размерите на блоковете от 512 бита или 1024 бита, което означава, че трябва да разделим данните на множество блокове. Граничната точка за разделянето на блокове всъщност е или 447 бита, или 895 бита, тъй като трябва да се включи поне един бит запълване, плюс 64-битовата или 128-битовата дължина на съобщението.
Това означава, чеако имате точно 448 бита (или 896 бита) данни, които трябва да хеширате, те ще трябва да бъдат разделени на два блока. Първият блок ще включва всички данни, плюс 64 (или 128) бита запълване (този, последван от 63 или 127 нули). Вторият блок ще има още 448 (или 896) нули, с 64-битова (или 128-битова) дължина на съобщението, маркирана в края по същия начин, който показахме в предишния раздел.
449 бита (или 897 бита) данни също ще заемат два блока данни и вместо това ще имат едно плюс 62 (или 126) нули за подпълване преди дължината на съобщението.
От друга страна,447 бита (или 895 бита) данни просто биха успели да се поберат в един блок. Той ще включва 447 (или 895) бита, след това подпълване на единичен един , последвано от дължината на съобщението от 64 или 128 бита.
Системата работи по същия начин за по-големи входни данни. Данните се разделят на толкова блокове, колкото са необходими, за да бъдат включени всички данни, плюс поне една цифра за допълване и с 64-битова дължина на съобщението, добавена в края на последния блок. В случай на 5000 бита входни данни и 512-битови размери на блокове на SHA-224 или SHA-256, входът ще бъде разделен на 10 блока. Първите девет ще включват само входните данни, докато десетият ще включва последните 392 бита входни данни, един , 55 нули и след това 64-битовата дължина на съобщението в края. Това общо 5120 бита данни, което е 10, умножено по 512.
В случай на SHA-384, SHA-512, SHA-512/224 или SHA-512/256 същите тези 5000 бита данни ще бъдат разделени на шест 1024-битови блока. Първите четири ще включват само входните данни. Петият блок ще включва последните 904 бита данни, a един и след това 119 нули като подплата. 5000-те бита данни не се побират съвсем в рамките на пет блока, тъй като последните 904 бита данни надвишават границата за последния блок, която е 896 бита. Шестият блок ще включва 896 нули и след това 128-битовата дължина на съобщението в края.
Основният SHA-2 алгоритъм
По-долу имаме графично представяне на алгоритъма SHA-2:
Алгоритъмът SHA-2
Освен ако не сте се занимавали с подобни алгоритми преди, вероятно няма много смисъл. Не се притеснявайте, защото ще отделим много време, за да го обясним подробно.
Първото нещо, което си струва да се отбележи, е, че диаграмата показва Кръг 0, Кръг T и Кръг 63. Кръг 0 е първият рунд, докато рунд T е по същество заместител, който представлява всеки кръг между тях, защото би било тромаво да се изтеглят десетки рундове. Кръг 63 е последният рунд, който ни дава общо 64 рунда, ако започнем от 0.Имайте предвид, че SHA-384, SHA-512, SHA-512/224 и SHA-512/256 включват 80 кръга вместо 64, така че процесът, който ще опишем, е малко по-различен в тези версии на алгоритъма SHA-2.
Всеки от тези кръгове включва свои собствени входове и изчисления, като резултатите от някои изчисления стават входове за следващите. Както вероятно започвате да разбирате, алгоритъмът SHA-2 е сложен и включва цял куп стъпки и изчисления.
Въведеното съобщение M
Ще запазим нещата прости в този пример, като използваме само нашия единичен 512-битов входен блок, вместо по-дълъг и по-сложен вход, който изисква поредица от блокове. Ако трябваше да опишем процеса за въвеждане на по-дълги данни, ще трябва напълно да повторим голяма част от дългия, сложен процес, който ще изложим, с всеки един от различните блокове входни данни.
Ако погледнете горе вляво на диаграмата по-горе, ще видитеВъвеждането на съобщение (M). Това е 512-битовият подплатен блок на нашето съобщение „хеширането е сложно“:
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
Нашето въведено съобщение първо се разделя на шестнадесет 32-битови думи, обозначени с W0е W.петнадесет:
- в0– 01101000 01100001 01110011 01101000
- в1– 0110100 01101110 01100111 00100000
- вдве– 01101001 01110011 00100000 01100011
- в3– 01101111 01101101 01110000 01101100
- в4– 01101001 01100011 01100001 01110100
- в5– 01100101 01100100 10000000 00000000
- в6– 00000000 00000000 00000000 00000000
- в7– 00000000 00000000 00000000 00000000
- в8– 00000000 00000000 00000000 00000000
- в9– 00000000 00000000 00000000 00000000
- в10– 00000000 00000000 00000000 00000000
- вединадесет– 00000000 00000000 00000000 00000000
- в12– 00000000 00000000 00000000 00000000
- в13– 00000000 00000000 00000000 00000000
- в14– 00000000 00000000 00000000 00000000
- впетнадесет– 00000000 00000000 00000000 10110000
Преобразуване в шестнадесетичен
Преди да продължим, ще преобразуваме горните двоични цифри в друга система за номериране, наречена шестнадесетична. Ако сте обръщали голямо внимание, може би сте забелязали, че нашият хеш включва куп букви:
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Това е така, защото хешовете обикновено се записват в шестнадесетична система, което е просто различен начин за броене, почти по същия начин, по който двоичната и десетичната система, с която всички сме свикнали, са различни.
Двоичната система е система с основа 2, което на практика означава, че имате две възможности, 1 и 0, преди да трябва да започнете да представяте информация с по-голям брой цифри.
Нашата обичайна десетична система е основа-10, което означава, че имаме 10 опции, 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9, преди да свършим и трябва да започнем да комбинираме числа, за да представим по-големи количества данни, като например когато комбинираме 1 и 0, за да направим 10.
Шестнадесетичната е система с основа 16, което означава, че имаме 16 опции:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f
Когато използваме база 16, стойността 10 не е същата удобна стойност, с която сме израснали. Вместо това 10 в основа 16 е наистина числото 16, с което сме свикнали в десетичната система. В база 10 познатото ни десетично число 10 е представено с anа, 11 еb, 12 е° С,13 ед, 14 еии 15 еf.
Прекалено задълбочаването на шестнадесетичната система ще отвлече вниманието от основната тема, но можете да намерите още информация тук .
Всичко, което трябва да знаете е, че ние превключваме нашия вход от двоичен към шестнадесетичен и ще го направим, като въведем нашите двоични стойности в прост онлайн конвертор (ако опитвате това сами и копирате двоичните числа отгоре, премахнете интервалите). Трябва да ви даде:
- в0– 68617368
- в1– 346E6720
- вдве– 69732063
- в3- 6F6D706C
- в4– 69636174
- в5– 65648000
- в6– 00000000
- в7– 00000000
- в8– 00000000
- в9– 00000000
- в10– 00000000
- вединадесет– 00000000
- в12– 00000000
- в13– 00000000
- в14– 00000000
- впетнадесет– 000000B0
График на съобщенията: Намиране на другите W стойности
Алгоритъмът SHA-2
Ако разгледате внимателно диаграмата, ще забележите, че един от входовете за кръг 63 е W63. Имаме само W0е W.петнадесетдосега, така че това означава, че имаме нужда от още 48 стойности, преди да имаме всичките си W входове. Във версиите SHA-384, SHA-512, SHA-512/224 и SHA-512/256 на алгоритъма ще ни трябват общо 80 стойности, така че ще трябва да извлечем допълнителни 64.
Тези входове се изчисляват в маркираното полеграфик за съобщенияв диаграмата. И в двата случая ги извличаме по следната формула:
вT= p1(INt-2) + Wt-7+ стр0(INt-15) + Wt-16
объркани? Не обвинявайте нас, обвинявайте криптографите, които са го проектирали. Нека започнем, като се опитаме да обясним няколко от стойностите в горното уравнение.
Tпо същество е заместник за който и кръг да сме.Ако сме в първия кръг, който инженерите любезно наричат Рунд 0,Tе 0. И такаако видите W0, означава стойността за W в кръг 0. Използваме тази нотация, защото ще използваме голям брой различни стойности за W на различни етапи от алгоритъма. Много от другите променливи също използват променящи се стойности през етапите на алгоритъма.
Следващата стойност, за която вероятно сте объркани, е:
стр1(х)
Символът е известен като aсигма, и заедно с числото 1 означава следната функция:
стр1(x) = ROTR17(х) ⊕ R.O.T.R.19(х) ⊕ SHR10(х)
Преди да разберем напълно как работи графикът на съобщенията, ще трябва да обясним тази функция.
Операции на смени
ROTR от предишното уравнение сигнализира, че трябва да извършим aкръгово десен шифтвърху стойността, която го следва, x. Той се измества според броя на битовете, показани в горния индекс. Да вземем първия сегмент:
R.O.T.R.17(х)
Горното всъщност просто казва да се промени стойносттах 17 битакъмточно. За да ви дам пример за това как работи това, ако стойността за x е 1000 1001 и искаме да извършим кръгово изместване надясно от само1 бит, по същество просто ще вземем стойността в най-дясната колона:
1000 1001
И го преместете наляво:
1100 0100
За да демонстрираме отново концепцията, този път с кръгово изместване надясно на 3 бита, вземаме същото число:
1000 1001
Този път вземаме всяка от трите най-десни цифри и ги преместваме наляво:
0011 0001
Този тип операция е включена както в първия раздел на уравнението, така и в средния, с измествания от17и19бита съответно.
Последната част от уравнението гласи:
SHR10(х)
SHR ни казва да извършим подобна, но малко по-различна операция, известна като aлогично ляво изместване. В този случай изместваме наляво стойността x с броя на битовете в горния индекс,10, и след това подложете дясната страна с нули. Нека вземем същото число като преди, за да демонстрираме как работи това:
1000 1001
Ще извършим изместване с 10 бита наляво в 10 стъпки, като последната цифра е удебелена не по друга причина, освен за да ви помогнем да следите напредъка му:
0001 0010
0010 0100
01001000
10010000
0010 0000
0100 0000
1000 0000
0000 0000
0000 0000
0000 0000
През първите седем хода видяхме как данните бавно се преместват наляво и се заменят с нули вдясно. До осмия ход всички оригинални данни бяха напълно изчезнали и бяха заменени с нули.
Обърнете внимание на разликата между товалогично ляво изместванеоперация и обсъденото по-ранокръгово десен шифт. Не само, че движението се извършва в различни посоки, но кръговото изместване вдясно рециклира данните от другата страна, докато логическото изместване вляво ги изхвърля и запълва пространството, което се отваря с нули
Обсъждането на тези смени с твърде много подробности ще ни отведе по допирателната, но можете да разберете повече за това как работят в това ресурс .
XOR операции
Последната част от нашата операция, която трябва да обясним, е⊕ символ, който свързва всеки от тези компоненти заедно. ⊕ означава XOR операция, която е логическа операция, която основно означаваизходът му е верен, ако някой от входните данни е верен, но е фалшив, ако и двата входа или нито един вход не са верен.
Трудно е да се обясни това, без да се задълбочим в пълна лекция по булева алгебра и логически операции. Тази връзка ви дава малко обобщение, но всъщност не е нужно да го разбирате в дълбочина, за да получите приличен преглед на това как функционира останалата част от алгоритъма. Всичко, което трябва да знаете е, че по същество ще събираме някои числа, но използвайки някаква странна математика, която вероятно не сте учили в училище.
Решаване на първата част от нашето уравнение
Сега, след като разгледахме някои от подробностите на операциите, нека да погледнем отново уравнението, в което се забъркахме:
вT= p1(INt-2) + Wt-7+ стр0(INt-15) + Wt-16
Където:
стр1(x) = ROTR17(х) ⊕ R.O.T.R.19(х) ⊕ SHR10(х)
И:
стр0(x) = ROTR7(х) ⊕ R.O.T.R.18(х) ⊕ SHR3(х)
Сега, нека се опитаме да разберем стойността на W16, защото това е първото число, което трябва да намерим с помощта на това уравнение. Нека включим нашата стойност:
в16= p1(IN16-2) + W16-7+ стр0(IN16-15) + W16-16
Следователно:
в16= p1(IN14) + W9+ стр0(IN1) + W0
Ние знаем всички W стойности от дясната страна на уравнението, защото те са W думите, които разбрахме, като разделихме нашия подплатен блок за съобщения. Стойностите както в двоичен, така и в шестнадесетичен формат са:
- в0–68617368или01101000 01100001 01110011 01101000
- в1–346E6720или0110100 01101110 01100111 00100000
- в9–00000000или00000000 00000000 00000000 00000000
- в14–00000000или00000000 00000000 00000000 00000000
Преди да включим всички числа, нека разберем за какво е стойносттастр1(IN14), използвайки уравнението, което обсъдихме по-горе:
стр1(IN14) = ROTR17(IN14) ⊕ R.O.T.R.19(IN14) ⊕ SHR10(IN14)
С W14стойности в шестнадесетична система, уравнението изглежда така:
стр1(00000000) = ROTR17(00000000) ⊕ R.O.T.R.19(00000000) ⊕ SHR10(00000000)
Първата стъпка е да направите смените, които описахме по-рано за всяка част от уравнението. Ще преминем към двоичната стойност за W14вместо шестнадесетичния, защото така по-лесно се виждат смените, които ще извършваме. Имайте предвид, че двоичните и шестнадесетичните версии са просто различни представяния на една и съща стойност, така че превключването им, когато е удобно, не създава проблеми:
R.O.T.R.17(00000000 00000000 00000000 00000000)
Резултатът от горната операция ще бъде изключително предсказуем, защото всички са нули, но въпреки това ще го прегледаме, само за да ви дадем представа какво се случва. Насочете се към следното онлайн инструмент и въведете двоичната стойност за W14, 32-те нули, в маркираното поле за въвежданеСтойност. Не забравяйте да премахнете интервалите. Въведете32вРазмер, тъй като входната стойност е с дължина 32 бита. Тип17вShiftполе, за да сте сигурни, че измества стойността със 17 интервала. Уверете се, че посоката е зададена навярно. ИзберетеКръгово преместванеи след това щракнетеИзвършете операция за изместване на битове. Това изпълнява кръговото изместване надясно.
Не е изненадващо, че това ще ви даде стойност от:
00000000 00000000 00000000 00000000
Изглежда, че нищо не се е случило, но нулите са разместени. Просто не можем да кажем и изглежда безсмислено, защото всички те са нули.
Сега е време да изпълним средната част от операцията:
R.O.T.R.19(00000000 00000000 00000000 00000000)
В този случай всичко е същото, с изключение наShiftстойността е сега19. Това ни дава резултат от:
00000000 00000000 00000000 00000000
Сега за финалната част:
SHR10(00000000 00000000 00000000 00000000)
Не забравяйте, че SHR представлява aлогично ляво изместване, така че този път трябва да променим настройките. TheСтойностиРазмеростават същите, но трябва да сме сигурни, че:
Shiftе настроен на10
Посокае настроен наНаляво
Логична промянае избрано.
Отново получаваме същия резултат от:
00000000 00000000 00000000 00000000
Въпреки че това може да изглежда като безсмислено начинание, това беше само защото стартовият ни номер беше изцяло нули. Когато извършвате тези операции с други числа, действително ще настъпят промени.
Двоичните и шестнадесетичните низове от нула са еднакви, така че ще превключим тези стойности обратно в шестнадесетични, когато преминем към следващата част от нашето изчисление, така че да пасне по-добре на страницата:
стр1(IN14) = 00000000 ⊕ 00000000 ⊕ 00000000
Можем да решим това уравнение в това онлайн калкулатор като въведете:
00000000вполе А.
ИзбиранеБЕЗПЛАТНОот падащото меню под него.
00000000вполе Б.
ИзбиранеБЕЗПЛАТНОот падащото меню под него.
00000000вполе C.
Ако сте го направили правилно, трябва да си личиA XOR B XOR Cв отбелязаното полеЛогически израз. Той ще ви даде отговора в маркираното полеРезултат от операцията. В този случай това е:
0или00000000или00000000 00000000 00000000 00000000.
Това е скучен отговор, но ни отвежда една стъпка по-близо до решаването на нашето уравнение, защото сега знаем, че:
стр1(IN14) = 00000000
Ако превъртите назад, ще видите, че просто трябва да намерим още един компонент и тогава ще можем да решим уравнението. Трябва да намерим стойността на σ0(IN1), който използва следното уравнение:
стр0(x) = ROTR7(х) ⊕ R.O.T.R.18(х) ⊕ SHR3(х)
Както казахме по-горе, знаем, че W1е:
346E6720
Следователно:
стр0(346E6720) = ROTR7(346E6720) ⊕ R.O.T.R.18(346E6720) ⊕ SHR3(346E6720)
Това уравнение е почти абсолютно същото като това, което току-що решихме. За краткост няма да навлизаме в това, но ако искате сами да опитате, просто следвайте всяка от стъпките, които следвахме по-горе, но променетеShiftвсеки път да7,18и3, съответно.
стр0(346E6720) =4068DCCE ⊕ 99C80D1B ⊕ A3733901
След като го решите, ще откриете, че отговорът е:
стр0(346E6720) =7AD3E8D4
Модулно допълнение
Сега, когато знаем стойностите и за дветестр1(IN14)истр0(IN1), най-накрая сме готови да разберем стойността за W16:
в16= p1(IN14) + W9+ стр0(IN1) + W0
в16= 00000000 + 00000000 + 7AD3E8D4 + 68617368
Горното уравнение изглежда сравнително просто. Единственото нещо, което трябва да отбележим е, че знаците плюс в него представляват модулно добавяне, а не нормално добавяне.
За да демонстрираме концепцията с 8-цифрено десетично число, ако използвахме модулно събиране, за да добавим 1 към 99 999 999, отговорът не е 100 000 000, както бихте очаквали. Вместо това, той просто се връща към началото по същия начин, по който 1 следва 12 на часовник. Отговорът е 0 или 00 000 000. Разгледайте този буквар ако имате нужда от кратко въведение в модулната аритметика.
По същество модулното добавяне ви позволява да добавяте числа, без отговорът ви да става по-дълъг. Вземете следното като друг десетичен пример:
76,487,639 + 98,094,034
При нормално добавяне отговорът би бил:
76 487 639 + 98 094 034 =174,581,673
С модулно добавяне можем просто да изхвърлим1, а нашият отговор е:
76 487 639 + 98 094 034 =74,581,673
Можем да направим същите изчисления с шестнадесетичните числа в нашето уравнение:
в16= 00000000 + 00000000 + 7AD3E8D4 + 68617368
Ще го решим с помощта на това онлайн калкулатор . В нашия пример не е нужно да си правим труда да добавяме нулите, защото те няма да променят стойността и можем просто да добавим7AD3E8D4и68617368. Ако трябва да използвате същия инструмент, за да добавите още числа в бъдеще, можете просто да извършите операцията няколко пъти, като добавите следващото число към резултата от предишното уравнение.
Можем да решим нашето уравнение, като напишем7AD3E8D4в първото поле на онлайн калкулатора и68617368във втория. Това ни дава резултат от:
в16= e3355c3c
Не забравяйте, че това трябва да е модулно събиране, така че ако резултатът е надхвърлил осем цифри, ще трябва да премахнем най-лявата цифра. Резултатът ни е дълъг само 8 цифри, така че не е нужно да се притесняваме в този случай.
Това беше дълъг и сложен процес, но най-накрая имаме отговора за W16. Това еe3355c3c. Същият набор от изчисления трябва да се извърши за всички стойности на W, от W17е W.63.
Ние демонстрирахме как работят тези изчисления, така че е време да преминем към другите аспекти на алгоритъма SHA-2.
Променливите за инициализация
Сега, след като обсъдихме откъде идват всички W входове, нека се върнем към нашата диаграма:
Алгоритъмът SHA-2
В горната част ще забележите, че пише Hi-1. Това представлява работните променливи, които действат като входни данни във всеки кръг. Има осем от тези променливи и те се актуализират в края на всеки кръг. За да започнете, променливите за инициализация, H(0)са:
- з(0)а= 6a09e667
- з(0)б= bb67ae85
- з(0)c= 3c6ef372
- з(0)г= a54ff53a
- з(0) и= 510e527f
- з(0)е= 9b05688c
- з(0)g= 1f83d9ab
- з(0)ч= 5be0cd19
Горните числа са извлечени от квадратния корен на първите осем прости числа, но откъде идват няма особено значение за нашите цели. Всичко, което трябва да знаете е, че трябва да започнем с конкретните числа, изброени по-горе.
В следващите кръгове тези стойности ще бъдат различни. Както за простота, така и за представяне на техните променящи се стойности, диаграмата показва тези входове катоa, b, c, d, e, f, g и h, а нез(0)а, Х(0)б, и т.н., или H(1)а, Х(1)би т.н.
Константата, К
Във всеки кръг вземаме работните променливи и ги комбинираме с подходящата за кръг W стойност, която описахме в предишния раздел. Ако погледнете от дясната страна на кръговете в диаграмата, ще видите друг вход,К. Има 64 отделни 32-битови стойности за K, по една за всеки от 64-те кръга. Те се извличат от кубичните корени на първите 64 прости числа. В шестнадесетичен, тези константи от осем знака за всеки кръг са както следва, прочетени отляво надясно, преди да се спуснете към следващия ред:
|_+_|Обърнете внимание, че стойностите за K са с дължина 64 бита в SHA-384, SHA-512, SHA-512/224 и SHA-512/256. Има също 80 от тези стойности, вместо 64. Можете да ги проверите в FIPS 180-4 ако е необходимо.
Операцията Maj
И накрая, имаме всички наши входове. Сега е време да разберем как всеки кръг от SHA-2 ги използва. Следващата диаграма дава добро обобщение на това как SHA-2 използва всички тези входове:
Изчисленията SHA-2 участват в един кръг.
Ако погледнете към върха, имаме работните променливи,з(i)a, Х(i)b, Х(интегрална схема, Х(документ за самоличност, Х(i)e, Х(i)f, Х(i) gи Х(i)з. Те са същите като работните променливиa, b, c, d, e, f, g и hв диаграмата за целия алгоритъм SHA-2. В първия кръг те ще бъдат съответните променливи за инициализация, които изброихме в предишния раздел. Ако погледнете Х(i)a, Х(i)b, Х(интегрална схема, горе вляво ще видите, че и трите входа имат стрелки, сочещи към поле,майор. Това означава следното уравнение:
Maj (a,b,c) = (a И b) ⊕ (a И c) ⊕ (b И c)
За да направим уравнението по-лесно за четене, ние извадихме H(i)от всяка променлива и просто ги остави катоа,b, и° С. Стига да помните, че стойностите наа,bи° Спромяна с всеки кръг, това трябва да улесни проследяването.
Вече се справихме с ⊕ символ, ноИв този контекст е ново за нас. Това е друга операция в булевата алгебра. Отнася се за логическа връзка, което основно означава, че изходът е верен само ако и двата входа са верни. Можеш научете повече тук , но ние ще скочим напред и просто ще използваме онлайн калкулатор за извършване на тази операция.
Първо, нека добавим променливите за инициализация, които изброихме вПроменливите за инициализацияраздел:
Maj (6a09e667, bb67ae85, 3c6ef372) = (6a09e667 И bb67ae85) ⊕ (6a09e667 И 3c6ef372) ⊕ (bb67ae85 И 3c6ef372)
Калкулаторът, който използваме, е доста ограничен, така че ще трябва да извършим изчислението на няколко етапа.
Въведете6a09e667във входА.
ИзберетеИот падащия списък по-долу.
Въведетеbb67ae85във входБ.
Това ви дава резултат от:
2A01A605
Следващия:
Въведете6a09e667във входА.
ИзберетеИот падащия списък по-долу.
Въведете3c6ef372във входБ.
Това ви дава резултат от:
2808E262
Тогава:
Въведетеbb67ae85във входА.
ИзберетеИот падащия списък по-долу.
Въведете3c6ef372във входБ.
Това ви дава резултат от:
3866A200
Нека поставим всички тези отговори в уравнението:
Maj (6a09e667, bb67ae85, 3c6ef372) = 2A01A605 2808E262 3866A200
Сега всичко, което трябва да направим, е да променим входовете в нашия онлайн калкулатор още веднъж:
Въведете2A01A605във входА.
ИзберетеБЕЗПЛАТНОот падащия списък по-долу.
Въведете2808E262във входБ.
ИзберетеБЕЗПЛАТНОот падащия списък по-долу.
Въведете3866A200във вход° С.
Това ни дава:
майор(a,b,c)=3A6FE667
∑0операция
Сега, когато имаме отговора намайор(a,b,c)нека се върнем към диаграмата и да видим какво следва:
Изчисленията SHA-2 участват в един кръг.
Ще видите, че стрелката отз(i)aсъщо така сочи към∑ символ. Това показва, че трябва да вземем H(i)aвъведете и го подложете на следното изчисление:
∑0(a) = ROTRдве(а) ⊕ R.O.T.R.13(а) ⊕ R.O.T.R.22(а)
Още веднъж сме пропуснали H(i)за яснота. Вече се справихме с тяхкръгови десни смени, както иXOR операции. Този път трябва да извършим кръговите премествания надясно с 2, 13 и 22 бита, съответно. Да се върнем към нашият калкулатор , с нашата стойност заа,6a09e667.
За първия раздел на това изчисление въведете:
6a09e667вСтойностОсигуретешестнадесетиченсе избира от падащото меню вдясно.
32 вРазмер.
2 вShift.
Уверете севярное избран заПосока.
Щракнете върхуКръгово преместванекутия.
Щракнете върхуИзвършете операция за изместване на битовебутон.
Това ще ви даде резултат от:
DA827999
Ако искате повече представа за това как е постигнат този резултат, калкулаторът показва стъпките, включени в разработването на операцията. Можете също да се върнете къмОперации на сменираздел за повече подробности.
За останалите две стойности, които трябва да намерим, трябва само да променим стойността вShiftи след това щракнете върхуИзвършете операция за изместване на битовебутон отново.
Променяйки го на13ни дава отговор на:
333B504F
Променяйки го на22ни дава отговор на:
27999DA8
Сега имаме всички стойности, от които се нуждаем, за да завършим уравнението:
∑0(6a09e667) =DA827999⊕333B504F⊕27999DA8
Да се върнем към калкулатор използвахме за операциите XOR и:
ВъведетеDA827999във входА.
ИзберетеБЕЗПЛАТНОот падащия списък по-долу.
Въведете333B504Fвъв входБ.
ИзберетеБЕЗПЛАТНОот падащия списък по-долу.
Въведете27999DA8във вход° С.
Това ни дава резултат от:
∑0(6a09e667) = CE20B47E
Модулно добавяне на резултатите
Ако следваме стрелките отмайоркутия и∑кутия, виждаме, че изходните данни след това се изпращат като входове в кутия с a+символ върху него. Това представлявамодулно допълнение, което, както вече описахме, прилича много на нормално събиране, с изключение на това, че числата просто се връщат обратно към началото в определен момент, вместо да продължат да растат. Ако искате опресняване с повече подробности, вижте предишния раздел за добавяне на модули.
Диаграмата може да бъде представена чрез следната формула:
Maj(a,b,c) + ∑0(а) =3A6FE667+CE20B47E
Ние ще използваме същият калкулатор отново.
Въведете3A6FE667в първото поле иCE20B47Eвъв втория, след което щракнетеИзчисли. Това трябва да ви даде отговор на:
108909ae5
Ако внимавате, може да забележите, че горният отговор е дълъг девет цифри, докато всеки от предишните е бил само осем. Ако си спомняте, когато въведохме концепцията за модулно добавяне, споменахме, че това е като обикновено добавяне, но просто се връща към началото, когато числата преминат определена точка.
Е, калкулаторът, който използваме, не е специално за модулно събиране - той просто извършва нормалното събиране, което сте научили в началното училище (но с шестнадесетични числа). Това означава, че няма да прехвърли числата, след като достигне лимита. До този момент просто имахме късмет, че нито едно от предишните ни изчисления не доведе до деветцифрено число.
Този път завършихме с девет цифри, когато наистина трябва да са само осем. Добрата новина е, че е лесно да решим проблема си. Всичко, което трябва да направим, е да премахнем най-лявата цифра, the1. Следователно нашият отговор не е наистина108909ae5. Вместо това е:
08909ae5
Ако се върнете обратно към диаграмата и проследите линията, която напуска това+поле като изход, ще видите, че се свързва с друг ред, който включва входове, с които все още не сме се занимавали.Ще трябва да направим някои други изчисления, преди да се върнем към тази точка.
Условната функция
Този път нека да разгледаме H(i)e, Х(i)f, Х(i)gв диаграмата. Всички те сочат към етикетирана кутиягл, което показва, че тези стойности действат като входове в следната функция:
Ch(e, f, g) = (e И f) ⊕ (НЕ e И g)
Вече разгледахме всяка от тези операции с изключение наНЕ. Това представлява отрицание , което също е известно като логическо допълнение. Няма да навлизаме в подробности за това как работи, за да ни спаси от твърде много допирателна, но можете или да се обърнете към връзката, или да се доверите на онлайн калкулатора.
Още веднъж премахнахме H(i)от e, f и g, просто за да се улесни четенето. Все още работим върху кръг 0, така че тези стойности ще бъдат променливите за инициализация, които изброихме по-рано:
з(0) и–510e527f
з(0)е–9b05688c
з(0)g–1f83d9ab
Имайте предвид, че в бъдещи кръгове променливите за e, f и g ще бъдат различни. Засега нека поставим тези инициализиращи променливи в нашето уравнение:
Ch (510e527f, 9b05688c, 1f83d9ab) = (510e527f И 9b05688c) ⊕ (НЕ 510e527f И 1f83d9ab)
Ще трябва да разделим това уравнение на части, за да го завършим нашият калкулатор . За първото полувреме:
Въведете510e527fвъв входА.
ИзберетеИот падащия списък по-долу.
Въведете9b05688cвъв входБ.
Това трябва да ви даде отговор на:
1104400C
За втората половина на уравнението:
ИзберетеНебутон вляво от входаА.
Въведете 510e527f във входаА.
ИзберетеИот падащия списък по-долу.
Въведете 1f83d9ab във входаБ.
Това трябва да ви даде резултат от:
E818980
Нека включим тези отговори обратно в уравнението:
Ch(510e527f, 9b05688c, 1f83d9ab) = (1104400C) ⊕ (E818980)
Завършете решаването му, като:
Уверявайки се, чеНЕвече не е избрано.
Въведете1104400Cвъв входА.
ИзберетеБЕЗПЛАТНОот падащия списък по-долу.
ВъведетеE818980във входБ.
Това трябва да ви даде отговор на:
Ch(e, f, g) = 1F85C98C
∑1: Кръгово дясно изместване
Изчисленията SHA-2 участват в един кръг.
Ако се върнете към диаграмата, ще видите, че H(i)e, не е само принос къмглуравнение, което току-що изпълнихме.Той също така става вход в друго поле, отбелязано с ∑. Това поле означава следното изчисление:
∑1(e) = ROTR6(и) ⊕ R.O.T.R.единадесет(и) ⊕ R.O.T.R.25(и)
Имайте предвид, че това∑1(и)функцията е почти същата като∑0(а)функция, която изпълнявахме в∑0операцияраздел. Двете обаче имат различни стойности за кръговите десни смени.
Пропуснахме H(i)части от уравнението още веднъж за простота. Нека включимз(0) истойност заиценности, защото все още работим върхуКръг 0. Както обсъдихме вПроменливите за инициализацияраздел, стойността заз(0) ие510e527f. Следователно:
∑1(510e527f) = ROTR6(510e527f) ⊕ R.O.T.R.единадесет(510e527f) ⊕ R.O.T.R.25(510e527f)
Обяснихме как работят тези правилни кръгови смени няколко пъти, така че нека преминем към нашите онлайн калкулатор и въведете:
510e527f вСтойностОсигуретешестнадесетиченсе избира от падащото меню вдясно.
32 вРазмер.
6 вShift.
Уверете севярное избран заПосока.
Щракнете върхуКръгово преместванекутия.
Щракнете върхуИзвършете операция за изместване на битовебутон.
Това трябва да ни даде отговор на:
FD443949
Запазете всички детайли същите, с изключение на промяната наShiftстойност къмединадесети щракнете върхуИзвършете операция за изместване на битовебутон още веднъж. Това трябва да ви даде отговор на:
4FEA21CA
Повторете процеса, като този път само променитеShiftстойност до 25. Нашият отговор трябва да бъде:
87293FA8
Сега имаме всеки от резултатите, от които се нуждаем, за да решим уравнението. Нека поставим всяка от стойностите, които току-що разбрахме, във формулата:
∑1(510e527f) = FD443949⊕ 4FEA21CA⊕ 87293FA8
Сега, нека го решим, като се върнем към нашия калкулатор за XOR операции:
Въведете FD443949 във входА.
ИзберетеБЕЗПЛАТНОот падащия списък по-долу.
Въведете 4FEA21CA във входБ.
ИзберетеБЕЗПЛАТНОот падащия списък по-долу.
Въведете87293FA8във вход° С.
Това ни дава резултат от:
∑1(510e527f) = 3587272B
Модулно допълнение
Нека се върнем към диаграмата, за да видим накъде да се насочим:
Изчисленията SHA-2 участват в един кръг.
Ако погледнем горе вдясно, ще видим, че работната променлива H(i)зима стрелка, която води до кутия с aзнак плюсвърху него. Изходът отглоперация, която вече завършихме, води до същата кутия, което означава, че трябва да извършим модулно събиране с тези две стойности. Все още сме в средата на кръг 0, така че трябва да използваме променливата за инициализация, H(0)ч, като нашата стойност зач. Както обсъдихме вПроменливата за инициализацияраздел.
з(0)ч= 5be0cd19
Отговорът на операцията Ch беше:
Ch(e, f, g) = 1F85C98C
Следователно трябва да намерим решение за:
5be0cd19+1F85C98C
Да се отправим към нашите онлайн калкулатор за шестнадесетично събиране.
Въведете5be0cd19в първото поле и1F85C98Cвъв второто поле, след което щракнете върху изчисляване. Това ни дава резултат от:
7b6696a5
Повече модулно допълнение
Ако проследите стрелката, сочеща извън това поле, с+символ, ще видите, че той става вход в друга подобна кутия, което показва по-модулно добавяне. Този път другият вход е резултатът, който получихме от изпълнението на кръговите десни шитове на ∑1д) в последния∑1: Кръгово дясно изместванераздел. Отговорът беше:
∑1(510e527f) = 3587272B
Така че нека вземем резултата от последния раздел и го добавим към резултата от∑1(и). Уравнението е:
7b6696a5+3587272B
Отидете на онлайн калкулатор който току-що използвахме в предишния раздел, и въведете7b6696a5в първото поле и3587272Bвъв второто поле, след което щракнете върху изчисляване. Това ни дава резултат от:
b0edbdd0
Добавяне на W стойност... с още по-модулно добавяне
Ако се консултирате отново с диаграмата, ще видите, че изходът от предишната операция отива в друга отмодулни допълнителни кутиипосочен от+знак. Този път се добавя към една от стойностите W, които са части от нашето подплатено съобщение, „хеширането е сложно“ (в случай на стойности W16-IN63, те са извлечени от подплатеното съобщение, а не са части от него).
Все още сме вътреКръг 0, така че трябва да използвамев0, което, както обсъдихме вПреобразуване в шестнадесетиченраздел към началото, е:
в0– 68617368
Ако добавим това в модулно уравнение на добавяне заедно с решението от последния ни раздел, получаваме:
68617368+b0edbdd0
Върнете се към същото онлайн калкулатор за добавяне на шестнадесетични числа и въвеждане68617368в първото поле,след това b0edbdd0във втория. КликнетеИзчисли, което ще ви даде отговор на:
1194f3138
Както отбелязахме вМодулно добавяне на резултатитевсеки път, когато един от нашите резултати достигне девет цифри на дължина вместо осем, трябва да го върнем назад, като просто премахнем най-лявата цифра,1. Следователно резултатът, от който се нуждаем, всъщност не е такъв1194f3138. Вместо това е:
194f3138
Добавяне на постоянното K… чрез винаги надеждното модулно добавяне
С горния отговор в ръка, изходът от кутията сочи към друга, която има+ символ, което отново показва модулно добавяне. Този път другата стрелка, която сочи към него, казва Ki, което означава, че сега е време да добавим константата K. Изброихме всяка от 64-те стойности за K вКонстантата, Краздел. Стойността, от която се нуждаем за първия кръг, K0е:
428a2f98
Така че нашата модулна операция за добавяне трябва да включва тази стойност плюс резултата от предишния кръг:
428a2f98+194f3138
Сега трябва да се върнем към нашите онлайн калкулатор за шестнадесетично събиране и въведете428a2f98в първото поле, с194f3138във втория. Щракванеизчислини дава резултат от:
5bd960d0
Модулното добавяне никога не свършва
Върнете се към диаграмата и следвайте резултата от предишната операция. Той среща още една страховита модулна кутия за добавяне, този път със стойността H(документ за самоличносткато друг негов вход. Все още сме в кръг 0, така че трябва да използваме променливата за инициализация H(0)г, кое е:
a54ff53a
Затова трябва да намерим отговора на:
a54ff53a+5bd960d0
Когато поставим тези стойности в едно и също онлайн калкулатор , завършваме с:
10129560a
Отново попаднахме на девет цифри, така че просто трябва да изпуснем най-лявата1, както е обсъдено вМодулно добавяне на резултатитераздел. Следователно нашият отговор наистина е:
0129560a
Откъде идват работните променливи?
Ако следвате линията от полето за символ +, ще видите, че завършва в ред от кутии в долната част, като това конкретно поле е маркираноз(i)e. Споменахме товаКръг 0 започва с променливи за инициализация, но товаследващите кръгове вместо това използват различни променливи.
Може би сте се чудили откъде ще дойдат те и сега имате поне част от отговора.Стойностите в този ред от кутии в долната част ще станат работните променливи, които се използват в следващия кръг.
В този случай променливата за инициализацияз(0)гбеше добавен към това, което по същество е смес от другите инициализиращи променливи H(0) и, Х(0)е, Х(0)gи Х(0)ч, заедно с част от нашето входно съобщение, W0,и константата, К0. Получената смес,0129560a, след това става работна променливаз(1 иза кръг 1.
Другите променливи за инициализация следват подобни процеси, като се модифицират и добавят една към друга по странни начини, за да станат нови работни променливи в следващия кръг. Можете да погледнете стрелките, сочещи към долния ред, за да видите откъде идва всяка от работните променливи на следващия кръг.
Това може да не изглежда толкова важно, но е ключов компонент от структурата, който позволява на всеки SHA-2 хеш да изглежда коренно различен, дори когато се промени само една буква от входа. Не забравяйте, че все още сме само част от пътя през рунд 0 и остават още 63 рунда, така че има много повече възможности да смесите тези стойности.
Обединяване на двете страни... с по-модулно допълнение
Спомнете си обратно къмМодулно добавяне на резултатитераздел, където извършихме модулно добавяне на следните стойности:
Maj(a,b,c) + ∑0(а) =08909ae5
След като намерихме решението, трябваше да спрем на тази нишка от диаграмата, докато разберем другите компоненти. Сега направихме всичко необходимо и сме готови да се върнем към него.
Само за да сме сигурни, че следвате добре, в момента сме нанай-ниското поле + от лявата страна на диаграмата, което се въвежда от уравнението, обсъдено по-горе. Другият ни вход в това модулно събирателно уравнение е решението отМодулното добавяне никога не свършвараздел, който беше:
0129560a
Затова се опитваме да намерим решение за:
08909ae5+0129560a
Да се върнем към нашите онлайн калкулатор и въведете08909ae5в първото поле, с0129560aвъв втория. Когато ударимизчисли, това ни дава:
9b9f0ef
Можем да добавим нула отпред, за да поддържаме последователност при 8 цифри:
09b9f0ef
След това този отговор се поставя в H(i)aслот в долния ред, което означава, чеще стане работна променлива H(1)ав следващия кръг, кръг 1.
Сега, когато имаме това решение, най-накрая завършихме всички многобройни изчисления, включени вКръг 0.
Другите работни променливи
Вече обсъдихме работната променливаз(i)e, а сега работната променливаз(i)a както добре. Сега е време да разгледаме откъде идват останалите работни променливи, за да можем да ги използваме в кръг 1 и всеки от следващите кръгове.
Както обсъдихме, в кръг 0 работните променливи бяха набор от предварително дефинирани числа, които нарекохме променливи за инициализация:
- з(0)а= 6a09e667
- з(0)б= bb67ae85
- з(0)c= 3c6ef372
- з(0)г= a54ff53a
- з(0) и= 510e527f
- з(0)е= 9b05688c
- з(0)g= 1f83d9ab
- з(0)ч= 5be0cd19
Сега е време да разберем какви ще бъдат останалите работни променливи за началото на кръг 1. За щастие, диаграмата го прави доста лесно:
Изчисленията SHA-2 участват в един кръг.
Ако погледнем долния ред, където пишез(i)b, можем да проследим назад стрелката, за да видим, че стойността е простоз(i)a. Катоз(0)ае6a09e667, това означава, че нашата работна променлива за кръг 1,з(1)б, също ще бъде6a09e667.
Придвижвайки се къмз(интегрална схемав долния ред виждаме, че стрелката произхожда отз(i)bкутия в горния ред. Следователно наз(0)бстойност,bb67ae85, ще стане работна променливаз(1)cв кръг 1.
Когато се обърнем къмз(документ за самоличноств долния ред виждаме, че стрелката го свързва сз(интегрална схемана върха. Следователно,з(1)ге същата стойност катоз(0)c, кое е3c6ef372.
Движейки се, стрелката за дънотоз(i)eидва от модулното добавяне наз(документ за самоличности резултата, който получихме, когато добавихме съгласната. Разбрахме тази стойност вМодулното добавяне никога не свършвараздел, следователно стойността заз(1 ие0129560a.
Стойностите заз(i)f,з(i)gиз(i)зса лесни за разгадаване. Ако проследим стрелките от тези стойности в долния ред, ще видим, че стрелките произхождат отз(i)e,з(i)fиз(i) g, съответно.
Следователно:
з(0) и, който беше 510e527f, ставаз(1)е.
з(0)е, който беше 9b05688c, ставаз(1)g.
з(0)g, който беше 1f83d9ab, ставаз(1)з.
Само за да обобщим, работните променливи, които ще използваме като някои от нашите входове за кръг 1, са:
- з(1)а= 09b9f0ef
- з(1)б= 6a09e667
- з(1)c= bb67ae85
- з(1)г= 3c6ef372
- з(1 и= 0129560a
- з(1)е= 510e527f
- з(1)g= 9b05688c
- з(1)з= 1f83d9ab
Кръг 1 (и следващите кръгове)
Завършихме кръг 0 и знаем какви са работните променливи за кръг 1. Ако се върнете къмПреобразуване в шестнадесетиченраздел, ние също знаем W стойността, която трябва да използваме в кръг 1:
в1= 346E6720
Можете също да намерите стойността K, от която се нуждаем, вКонстантата, К, раздел. Този път се нуждаем от стойността във втората колона на горния ред:
К1=71374491
Вече имаме цялата информация, от която се нуждаем, за да започнем Кръг 1. Първо, нека се върнем към диаграмата на целия алгоритъм:
Алгоритъмът SHA-2
Ако следваме стрелките, които излизат от дъното наКръг 0, ще видите, че те сочат къмКръгла t. Кръг t също има входове на WTи КT.Кръгла tе само резервен за всеки от 62-та рунда между тяхКръг 0иКръг 63, защото тегленето на 64 рунда би било непрактично.
Вместо това си представете, че стрелките от Кръг 0 наистина са насочени към Кръг 1 и че другите входове наистина са W1и К1.
Сега нека се върнем към диаграмата за един кръг на SHA-2:
Изчисленията SHA-2 участват в един кръг.
Както е посочено от двете диаграми, за да завършим Кръг 1, просто трябва да повторим всяка от операциите, които извършихме в Кръг 0. Единствената разлика е, че започваме с различни стойности. Вместо W0използваме W1. Вместо К0използваме К1. Вместо всички H0променливи за инициализация, ние използваме H1работни променливи. Току-що изброихме всеки от тези входни данни, от които се нуждаем, за да започнем Кръг 1, така че имате цялата необходима информация, за да започнете.
Първата ви стъпка е да разберетеМайор (a,b,c). Този път трябва да използвате новотоКръг 1входове на:
- з(1)а= 09b9f0ef
- з(1)б= 6a09e667
- з(1)c= bb67ae85
Описахме процеса вОперацията Majраздел. Той включваше както операции И, така и операции XOR и го завършихме чрез няколко стъпки, използвайки онлайн калкулаторите. След като повторите процеса с новите входни стойности, можете да разберете какво да правите по-нататък, като се върнете към диаграмата или към∑0операцияраздел на нашата статия.
В този раздел изпълнихме поредица от кръгови смени надясно, както и XOR операции. Този път трябва да използвате новотоастойност, H(1)а, кое е:
09b9f0ef
Останалите операции са същите, включително броя на битовете, които трябва да преместите. След като получите резултата, е време да преминете към следващата стъпка, която можете да намерите, като се консултирате с диаграмата или прегледате статията. След като получите този резултат, трябва да продължите напред, като всеки път извършвате едни и същи операции, но с новите входни стойности, където е подходящо.
Като обобщение,за да завършите кръг 1, трябва да имате:
- ИзпълняваГоляма операция.
- Завършен на∑0операция.
- Използвано модулно добавяне към тези два предишни резултата.
Тогава:
- Завършен наусловна функция.
- Завърших∑1операция.
- Извършено модулно събиране на резултата от условната функция и стойността за H(1)з
- Взе резултата от последната стъпка и го добави към резултата от ∑1работа чрез модулно добавяне
- Добавих този резултат към W1чрез модулно добавяне
- Използва се модулно добавяне, за да се вземе резултатът от последната стъпка и да се добави K1
- Добавен е резултатът от предишната стъпка към H(1)гс модулно допълнение
Следвайки тези стъпки, трябва да:
- Вземете резултата, който сте получили, когато сте добавили K1(преди две стъпки) и го добавете към решението, което сте получили от използването на модулно добавяне, за да комбинирате резултатите отГоляма операцияи на∑0операция(получихте този отговор в третата стъпка, в долната част на първия набор от точки)
- Използвайте диаграмата и нашите описания вДругите работни променливираздел, за да разберете кои стойности ще станат H(две)работни променливи, които ще ви трябват за рунд 2
Щом сте в този момент, значи е време да го направитезапочнете рунд 2, този път като използвате H(две)работещи променливи, които току-що разбрахте, заедно с Wдвеи Кдве. Кръг 2 продължава по абсолютно същия начин, с изключение на това, че използва тези нови входове, където е подходящо.
Когато приключите с кръг 2, ще имате работните променливи, от които се нуждаете за кръг 3, и ще ви трябва само W3и К3стойности, които изброихме по-рано в статията, за да завършите операциите.
Този процес се повтаря в кръгове 4 и 5 и така нататък, като резултатите стават работни променливи за следващия кръг. Единственото усложнение идва в рунд 16, където трябва да използвате W16стойност, която вече сме изчислили в първияМодулно допълнениераздел, който беше към началото на статията.
Задачата става още по-сложна за кръгове от 17 до 63, защото ще трябва сами да изчислите W стойностите, като използвате метода, описан вдругите W стойностираздел и следващите части на статията.
Ако приемем, че преживеете изпитанието и успеете да стигнете до края на рунд 63, ще останете с осем H(i)стойности като вашите резултати от всяко от изчисленията, които сте извършили през целия кръг.
Последният XOR
Ако се върнете обратно към общата диаграма на функцията SHA-2, ще видите последната стъпка:
Алгоритъмът SHA-2
Ще видите, че резултатите от кръг 63, които са осемте крайни H стойности, които бихте измислили на този етап, всички се насочват към поредица от модулни кутии за добавяне. Тези полета също имат други стрелки за въвеждане, които проследяват обратно към H(i-1). Това означава, че другите входове във всяка от тези модулни операции за добавяне са променливите за инициализация.
Следователно трябва да завършите следните модулни допълнителни изчисления:
- Краен Hастойност + H(0)а= d6320dec
- Краен Hbстойност + H(0)б= c80c83e4
- Краен H° Сстойност + H(0)c= c17915ee
- Краен Hдстойност + H(0)г= 5de8587b
- Краен Hистойност + H(0) и= b8118258
- Краен Hfстойност + H(0)е= 759b2453
- Краен Hжстойност + H(0)g= fce812d4
- Краен Hчстойност + H(0)ч= 7d3df56a
Остава само едно нещо, което трябва да направите, а именно да свържете тези резултати. Това е просто фантастична дума за добавяне на едно към края на друго по ред. Когато направите това, ще останете с:
d6320decc80c83e4c17915ee5de8587bb8118258759b2453fce812d47d3df56a
Горният резултат е нашият SHA-2 хеш за „хеширането е сложно“.На диаграмата това е представено отзiна дъното.
Въвеждане на по-големи съобщения
Ако първоначалните данни на съобщението бяха по-големи от 448 бита, все още нямаше да сме готови. Все пак ще трябва да обработим всеки от останалите блокове, докато цялата входна информация бъде премината през алгоритъма SHA-2.
Ако случаят беше такъв, нямаше да свържем окончателните си резултати, за да формираме хеша. Вместо това всеки от тези осемзiстойностите биха станали променливи за инициализация за следващия блок.
Стъпките щяха да продължат почти както по-горе, с изключение на това, че този път нашите първи 16 W стойности щяха да бъдат части от втория блок от входни данни. Следващите 48 W стойности биха били получени от тези 16 стойности според формулата, която използвахме вграфик на съобщенията: намиране на другите W стойностираздел.
Ако има общо само два блока входни данни, които трябва да бъдат обработени, тогава след кръг 63 на втория блок, крайните H стойности се добавят към променливите за инициализация на втория блок по същия начин, който току-що демонстрирахме за първия блок . След това тези резултати ще бъдат свързани, за да образуват SHA-2 хеш.
Ако има повече блокове, изходите от кръг 63 от втория блок вместо това ще станат променливи за инициализация за третия блок. Този процес ще продължи, докато всички блокове от входни данни бъдат обработени. Осемте изхода на крайния блок след това ще бъдат свързани в SHA-2 хеша по същия начин, по който изчислихме хеша за единичен блок входни данни.