Реферат: Цифровая подпись

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) |

К-во Просмотров: 485
Бесплатно скачать Реферат: Цифровая подпись