Реферат: Цифровая подпись
1. В выходной параметр записывается сумма соответствующей функции (для FF() это F(), для GG() это G(), для HH() это H(), для II() это I()) от 2-го, 3-го и 4-го параметров с 5-м и 7-м параметрами.
2. Производится циклический сдвиг влево выходного параметра на количество бит, указанное в 6-м входном параметре.
3. Производится приращение выходного параметра на величину, указанную во 2-м входном параметре.
#define FF(a, b, c, d, x, s, ac) /
{(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); /
(a) = ROTATE_LEFT ((a), (s)); /
(a) += (b); /
}
#define GG(a, b, c, d, x, s, ac) /
{(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); /
(a) = ROTATE_LEFT ((a), (s)); /
(a) += (b); /
}
#define HH(a, b, c, d, x, s, ac) /
{(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); /
(a) = ROTATE_LEFT ((a), (s)); /
(a) += (b); /
}
#define II(a, b, c, d, x, s, ac) /
{(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); /
(a) = ROTATE_LEFT ((a), (s)); /
(a) += (b); /
}
Сразу можно отметить, что входные параметры вышеуказанных функций представляют собой следующие значения:
register UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; Как видно регистровые переменные a, b, c, d типа UINT4 инициализируются значениями временного буфера buf[4] содержащемся в основной структуре Message Digest MD5_CTX. Пятый параметр x всегда инициализируется символом из входного буфера in[64] также находящемся в структуре MD5_CTX.
Параметр s равен одной из шестнадцати констант, определенных в функции Transform().
А вот самый последний параметр ас равен одной из 64-х "таинственных констант". Разработчики из RSA Data Security, Inc. предлагают вам расположить эти константы в "little-endian" порядке, расшифровать при помощи DES и вы получите ТАЙНЫЕ ПОСЛАНИЯ. (вот только DESовый ключик они не указали).
ROTATE_LEFT
Данный макрос сдвигает x влево на n бит.