Какие у меня биты md5? - PullRequest
       26

Какие у меня биты md5?

4 голосов
/ 08 ноября 2010

Я пытаюсь закодировать функцию хеширования md5 в Python, но, похоже, она не работает. Я выделил проблему с битами сообщения, которые должны быть хэшированы. Да, я фактически конвертирую каждый байт в биты и формирую битовое сообщение (я хочу изучить алгоритм на битовом уровне). И это где вещи рушатся; моя строка битов сформирована неправильно.

Самое простое сообщение было бы "", оно длиной 0 байт, заполнение было бы "1", за которым следуют (или нет) 511 "0" с (последние 64 бита обозначают длину сообщения, которая, как уже было сказано, просто 0).

10000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000

Я передаю 32-битные порции данных в функцию преобразования за раз. Я попытался вручную расположить 1 во всех позициях в первом блоке, а также в последнем блоке (little-endian). Где должен быть «1»?

Спасибо.

Обновление : правильная позиция для первого 32-битного слова, переданного в преобразование, должна фактически быть: 00000000000000000000000010000000, который int(x,2) равен 128, этот беспорядок произошел из-за моего A = rotL((A+F(B,C,D)+int(messageBits[0],2)+sinList[0]), s11)+B Преобразуйте формат, используя int() для интерпретации битовых строк как целочисленных данных, int() принимает двоичный формат с прямым порядком байтов, поэтому 100 .... было очень большим числом.

1 Ответ

4 голосов
/ 08 ноября 2010

MD5 использует соглашение с прямым порядком байтов на уровне битов, а затем соглашение с прямым порядком байтов на уровне байтов.

Вход представляет собой упорядоченную последовательность битов. Восемь последовательных битов - это байт . Байт имеет числовое значение от 0 до 255; каждый бит в байте имеет значения 128, 64, 32, 16, 8, 4, 2 или 1, в таком порядке (это то, что означает "big-endian at bit level").

Четыре последовательных байта являются 32-битным словом. Числовое значение слова находится в диапазоне от 0 до 4294967295. Первый байт наименее значимый в этом слове ("little-endian на уровне байтов"). Следовательно, если четыре байта равны a , b , c и d в этом порядке, то числовое значение слова равно а + 256 * B + 65536 * с + 16777216 * д . * * 1 021

В программных приложениях ввод почти всегда представляет собой последовательность байтов (его длина в битах кратна 8). Предполагается, что объединение битов в байты уже произошло. Таким образом, дополнительный бит дополнения '1' будет первым битом следующего байта, и, поскольку соглашение о битовом уровне является старшим, этот следующий байт будет иметь числовое значение 128 (0x80).

Для пустого сообщения самым первым битом будет бит дополнения '1', за которым следует целый набор нулей. Длина сообщения также равна нулю, что кодирует еще одни нули. Следовательно, блок дополненных сообщений будет представлять собой один «1», за которым следует 511 «0», как показано. Когда биты собраны в байты, первый байт будет иметь значение 128, за которым следуют 63 байта значения 0. Когда байты сгруппированы в 32-битные слова, первое слово ( M 0 ) будет иметь числовое значение 128, а 15 других слов ( M 1 до M 15 ) будут иметь числовое значение 0.

Подробнее см. MD5 . То, что я описал выше, это то, что объясняется в первом абзаце раздела 2 RFC 1321. Такое же кодирование используется для длины бит сообщения (в конце заполнения) и для записи окончательного результата хеширования.

...