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

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

4 голоса | спросил soulseekah 8 12010vEurope/Moscow11bEurope/MoscowMon, 08 Nov 2010 16:38:45 +0300 2010, 16:38:45

1 ответ


0

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 в этом порядке, то слово числовое значение равно a + 256 * b + 65536 * c + 16777216 * d .

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

ответил Thomas Pornin 8 12010vEurope/Moscow11bEurope/MoscowMon, 08 Nov 2010 17:54:29 +0300 2010, 17:54:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132