What are my md5 bits?

Refresh

December 2018

Views

1.8k time

3

I'm trying to code an md5 hashing function in Python but it doesn't seem to work. I've isolated the problem to the message bits that are to be hashed. Yes, I'm actually converting each byte to bits and forming a bit message (I want to study the algorithm on a bit level). And this is where things are falling apart; my bit string is not correctly formed.

The simplest message would be "", it's 0 bytes long, padding would be a "1" followed (or not) by 511 "0"s (last 64 bits denote message length, which, as already said, is just 0).

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

I'm feeding 32-bit chunks of data into the transform function at a time. I've tried to manually position the 1 in all the positions of in the first chunk, as well as the last chunk (little endian). Where should the "1" be?

Thank you.

Update: The correct position for the first 32-bit word fed into the transform should in fact be: 00000000000000000000000010000000 which int(x,2) is 128 this mess is due to my A = rotL((A+F(B,C,D)+int(messageBits[0],2)+sinList[0]), s11)+B transform format using int() to interpret the bit strings as integer data, int() takes little endian format binary, thus 100.... was a very huge number.

1 answers

4

MD5 использует тупоконечник конвенцию на битовом уровне, то мало-Endian конвенции на уровне байт.

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

Четыре последовательный байт является 32-битным словом. Численное значение слова составляет от 0 до 4294967295. первый байт является наименее значимым в этом слове ( «мало-Endian на уровне байтов»). Таким образом, если четыре байта , Ь , с и d в указанном порядке, то слово числовое значение а + 256 * B + 65536 * с + 16777216 * д .

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

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

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