Реферат: Цифровая подпись
if (mdi == 0x40)
{
for (i = 0, ii = 0; i < 16; i++, ii += 4)
in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
(((UINT4)mdContext->in[ii+2]) << 16) |
(((UINT4)mdContext->in[ii+1]) << 8) |
((UINT4)mdContext->in[ii]);
Transform (mdContext->buf, in);
mdi = 0;
}
}
Пока уменьшаемая на 1 длина переданного в функцию сообщения не станет равной нулю выполняем следующие действия:
Заносим новый символ из входного буфера функции в 64-х байтный буфер структуры MD5_CTX, увеличивая при этом переменную mdi на 1. Если mdi равна 64, то преобразуем
однобайтные символы буфера in[] структуры MD5_CTX в 4-х байтные величины типа UINT4, заносим в промежуточный буфер на 16 величин типа UINT4, и далее передаем функции Transform(). Присваиваем переменной mdi 0.
void MD5Final (MD5_CTX *mdContext)
Функция завершает вычисление Message Digest и заносит полученное значение в структуре MD5_CTX в символьный буфер digest[0. . . 15].
Входным параметром функции является указатель на структуру MD5_CTX.
Основные моменты:
Расширение сообщения дополнительными заполняющими символами из таблицы PADDING[]
/* Подсчет длины сообщения в байтах по модулю 64 */
mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
/* Расширить до 56 по модулю 64 */
padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);
MD5Update(mdContext, PADDING, padLen);
Присоединение битов длины и вызов функции Transform().
in[14] = mdContext->i[0];
in[15] = mdContext->i[1];
for (i = 0, ii = 0; i < 14; i++, ii += 4)
in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |