/*四个32bits数,用于存放最终计算得到的消息摘要.当消息长度>512bits时,也用于存放每个512bits的中间结果*/ UINT4 state[4]; /*存储原始信息的bits数长度,不包括填充的bits,最长为2^64 bits*/ UINT4 count[2]; /*存放输入的信息的缓冲区,512bits*/ unsigned char buffer[64];} MD5_CTX;static void MD5Transform(UINT4[4], unsigned char[64]); static void Encode(unsigned char *, UINT4 *, unsigned int); static void Decode(UINT4 *, unsigned char *, unsigned int);/*用于bits填充的缓冲区,当欲加密的信息的bits数被512除其余数为448时,需要填充的bits的最大值为512=64*8*/ static unsigned char PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};/*接下来的这几个宏定义是md5算法规定的,就是对信息进行md5加密都要做的运算*/ #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) #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);\