Я отправляю сообщение для проверки здравомыслия, поэтому, пожалуйста, простите меня, если это звучит немного основательно. Я пытаюсь узнать больше о шифровании, поэтому я решил, что хороший стартовый проект будет реализовывать алгоритм хэширования Sha-1. Я нашел walk-through и попал в точку, где я не знаю, ошибочна ли прогулка или мое понимание битности/вращения/двоичных операций неверно.Бит-сдвиг бит-массива и бинарная математика для SHA-1
Из документа:
Шаг 11.2: Положите их вместе
После завершения одной из четырех функций выше, каждая переменная будет двигаться на этом этапе перед запуском цикла со следующего слова , Для этого шага мы создадим новую переменную под названием 'temp' и установите ее равной: (Левое вращение 5) + F + E + K + (текущее слово ).
Обратите внимание, что за исключением того, что левые вращаются, единственная операция, которую мы делаем, является основным дополнением. Добавление в двоичном формате примерно так же просто, как и .
В качестве примера этого шага мы воспользуемся результатами последнего слова (79).
A lrot 5: 00110001000100010000101101110100 F: 10001011110000011101111100100001 A lrot 5 + F Out: 110111100110100101110101010010101
Обратите внимание, что результат этой операции на один бит больше, чем два входа. Это похоже на добавление 5 и 6, для представления ответа вам понадобится новое значение . Для того, чтобы все получилось , мы должны в конце концов укоротить этот дополнительный бит. Однако мы не хотим делать это до конца!
Это не совсем подходит. То, что я думаю, что произойдет это:
A = 00110001000100010000101101110100
F = 10001011110000011101111100100001
A Left rotate 5 = 00100010001000010110111010000110
(A Left Rotate 5) + F = 10101101111000110100110110100111 (which is still 32 bits)
Что мне нужно, это просто еще один набор глаза на это, чтобы сказать «Да krtzer, вы правы, и этот документ является неправильным» или «Ваше понимание разрядность, порядок байт, и/или вращение бит неправильное, вот как оно работает ».
Прямо сейчас я не уверен, что мое целочисленное представление ошибочно (спецификация говорит, что использует U32s, но в этом разделе говорится, что мне нужно отслеживать дополнительные биты), то, что моя программа испортила вращение (Я использую маленький endian), или есть что-то еще.
Любой опыт или понимание будут оценены!