2014-12-01 3 views
0

Я отправляю сообщение для проверки здравомыслия, поэтому, пожалуйста, простите меня, если это звучит немного основательно. Я пытаюсь узнать больше о шифровании, поэтому я решил, что хороший стартовый проект будет реализовывать алгоритм хэширования 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), или есть что-то еще.

Любой опыт или понимание будут оценены!

ответ

0

Вы правы в своем понимании того, как все работает. Проблема была в статье (которую я написал). Дополнительная цифра должна всегда быть добавлены в начале стадии 11.2, является ли это необходимым или нет, и если это не нужно, он должен быть установлен в 1.

В статье теперь гласит:

Обратите внимание, что результат этой операции на один бит длиннее двух входов. После каждой итерации новое слово должно быть на один бит длиннее последнего. Иногда это будет необходимый бит носителя (например, дополнительное значение места, которое вам нужно представить, как результат добавления двух цифр с цифрами 5 и 6 в базе 10), и когда это не нужно, вы должны просто добавить 1. работайте правильно, нам нужно будет урезать этот дополнительный бит в конце концов; однако мы не хотим делать это до конца!

Статья также была неясна в связи с тем фактом, что в примере показан уже повернутый А.

Смежные вопросы