вопрос по MD5 на си
Цитата:
Входной поток выравнивается так, что бы его длина стала конгруэнтной (сравнимой) с 448 по модулю 512. Выравнивание происходит следующим образом: к потоку добавляется один бит '1', а затем биты '0' до тех пор, пока длина потока не будет сравнима с 448 по модулю 512. Выравнивание происходит всегда, даже если длина потока была уже сравнима с 448 по модулю 512. Таким образом к потоку добавляется минимум 1 бит, максимум - 512.
каким образом добавить вот эти самые биты? Как вообще осуществлять битовые операции? добавить байт у которого старший байт будет 1, а остальные 0? Объясните пожалуйста, если можно с небольшим примером на си.
А готовым алгоритмом воспользоваться не судьба? Или посмотреть как оно там реализовано?
мне там не особо понятен этот момент
Ну выложите особо непонятный кусочек (и ссылку на фуллсурс отдельно), попробуем разобраться.
MD5_CTX *context; /* context */
unsigned char *input; /* input block */
unsigned int inputLen; /* length of input block */
{
unsigned int i, index, partLen;
/* Расчет числа байтов mod 64 */
index = (unsigned int)((context->count[0] >> 3) & 0x3F);
/* Обновление числа битов */
if ((context->count[0] += ((UINT4)inputLen << 3))
< ((UINT4)inputLen << 3))
context->count[1]++;
context->count[1] += ((UINT4)inputLen >> 29);
http://rfc2.ru/1321.rfc целиком
а что в этом куске непонятного? и код-то не мешало б оформить..
ну вот в частности что это за смещение на 29 бит?
ну count[], я так понял, хранит число обработанных битов в массиве на 2х UINT4. Число битов = число байтов << 3. UINT4 - 32 бита. 32 - 3 = 29. Т.е. берем старшие 3 бита от inputLen которые по-любому не попадут в count[0]
то есть это можно читать как "если число битов в контексте плюс числобитов во входном потоке меньше чем число битов во входном потоке"?
Цитата:
Чем эта реализация не подходит?
мне необходимо разобраться с этим алгоритмом. так требуется на работе. чтобы я знал как вычисляется этот хэш и мог написать реализацию
Цитата: qmor
то есть это можно читать как "если число битов в контексте плюс числобитов во входном потоке меньше чем число битов во входном потоке"?
это нужно читать как "если context->count[0] переполнился - добавь старший разряд".
и если быть совсем верным то сначала "прибавить к числу битов в контексте число битов потока, сравнить с..."
спасибо, теперь это понятно