Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

вопрос по MD5 на си

21K
25 августа 2010 года
qmor
21 / / 06.06.2007
Столкнулся с проблемой генерации MD5 хэша. Необходимо реализовать этот алгоритм непонятен ряд моментов первый из которых

Цитата:
Входной поток выравнивается так, что бы его длина стала конгруэнтной (сравнимой) с 448 по модулю 512. Выравнивание происходит следующим образом: к потоку добавляется один бит '1', а затем биты '0' до тех пор, пока длина потока не будет сравнима с 448 по модулю 512. Выравнивание происходит всегда, даже если длина потока была уже сравнима с 448 по модулю 512. Таким образом к потоку добавляется минимум 1 бит, максимум - 512.



каким образом добавить вот эти самые биты? Как вообще осуществлять битовые операции? добавить байт у которого старший байт будет 1, а остальные 0? Объясните пожалуйста, если можно с небольшим примером на си.

14
25 августа 2010 года
Phodopus
3.3K / / 19.06.2008
А готовым алгоритмом воспользоваться не судьба? Или посмотреть как оно там реализовано?
21K
25 августа 2010 года
qmor
21 / / 06.06.2007
мне там не особо понятен этот момент
14
25 августа 2010 года
Phodopus
3.3K / / 19.06.2008
Ну выложите особо непонятный кусочек (и ссылку на фуллсурс отдельно), попробуем разобраться.
21K
25 августа 2010 года
qmor
21 / / 06.06.2007
void MD5Update (context, input, inputLen)
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 целиком
14
25 августа 2010 года
Phodopus
3.3K / / 19.06.2008
а что в этом куске непонятного? и код-то не мешало б оформить..
21K
25 августа 2010 года
qmor
21 / / 06.06.2007
context->count[1] += ((UINT4)inputLen >> 29);

ну вот в частности что это за смещение на 29 бит?
14
25 августа 2010 года
Phodopus
3.3K / / 19.06.2008
ну count[], я так понял, хранит число обработанных битов в массиве на 2х UINT4. Число битов = число байтов << 3. UINT4 - 32 бита. 32 - 3 = 29. Т.е. берем старшие 3 бита от inputLen которые по-любому не попадут в count[0]
21K
25 августа 2010 года
qmor
21 / / 06.06.2007
if ((context->count[0] += ((UINT4)inputLen << 3))< ((UINT4)inputLen << 3))

то есть это можно читать как "если число битов в контексте плюс числобитов во входном потоке меньше чем число битов во входном потоке"?
5
25 августа 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: qmor
Столкнулся с проблемой генерации MD5 хэша. Необходимо реализовать этот алгоритм непонятен ряд моментов первый из которых

Чем эта реализация не подходит?

21K
25 августа 2010 года
qmor
21 / / 06.06.2007
Цитата:
Чем эта реализация не подходит?



мне необходимо разобраться с этим алгоритмом. так требуется на работе. чтобы я знал как вычисляется этот хэш и мог написать реализацию

14
25 августа 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата: qmor

то есть это можно читать как "если число битов в контексте плюс числобитов во входном потоке меньше чем число битов во входном потоке"?


это нужно читать как "если context->count[0] переполнился - добавь старший разряд".
и если быть совсем верным то сначала "прибавить к числу битов в контексте число битов потока, сравнить с..."

21K
25 августа 2010 года
qmor
21 / / 06.06.2007
спасибо, теперь это понятно
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог