56 MD5(
const std::string& text);
94 std::string
md5(
const std::string str);
126 return x & y | ~x & z;
131 return x & z | y & ~z;
147 return (x << n) | (x >> (32 - n));
186 update(text.c_str(), text.length());
200 state[0] = 0x67452301;
201 state[1] = 0xefcdab89;
202 state[2] = 0x98badcfe;
203 state[3] = 0x10325476;
211 for (
unsigned int i = 0, j = 0; j < len; i++ , j += 4)
212 output[i] = static_cast<uint4>(input[j]) | (
static_cast<uint4>(input[j + 1]) << 8) |
213 (
static_cast<uint4>(input[j + 2]) << 16) | (
static_cast<uint4>(input[j + 3]) << 24);
222 for (
size_type i = 0, j = 0; j < len; i++ , j += 4)
224 output[j] = input[i] & 0xff;
225 output[j + 1] = (input[i] >> 8) & 0xff;
226 output[j + 2] = (input[i] >> 16) & 0xff;
227 output[j + 3] = (input[i] >> 24) & 0xff;
240 FF(a, b, c, d, x[0],
S11, 0xd76aa478);
241 FF(d, a, b, c, x[1],
S12, 0xe8c7b756);
242 FF(c, d, a, b, x[2],
S13, 0x242070db);
243 FF(b, c, d, a, x[3],
S14, 0xc1bdceee);
244 FF(a, b, c, d, x[4],
S11, 0xf57c0faf);
245 FF(d, a, b, c, x[5],
S12, 0x4787c62a);
246 FF(c, d, a, b, x[6],
S13, 0xa8304613);
247 FF(b, c, d, a, x[7],
S14, 0xfd469501);
248 FF(a, b, c, d, x[8],
S11, 0x698098d8);
249 FF(d, a, b, c, x[9],
S12, 0x8b44f7af);
250 FF(c, d, a, b, x[10],
S13, 0xffff5bb1);
251 FF(b, c, d, a, x[11],
S14, 0x895cd7be);
252 FF(a, b, c, d, x[12],
S11, 0x6b901122);
253 FF(d, a, b, c, x[13],
S12, 0xfd987193);
254 FF(c, d, a, b, x[14],
S13, 0xa679438e);
255 FF(b, c, d, a, x[15],
S14, 0x49b40821);
258 GG(a, b, c, d, x[1],
S21, 0xf61e2562);
259 GG(d, a, b, c, x[6],
S22, 0xc040b340);
260 GG(c, d, a, b, x[11],
S23, 0x265e5a51);
261 GG(b, c, d, a, x[0],
S24, 0xe9b6c7aa);
262 GG(a, b, c, d, x[5],
S21, 0xd62f105d);
263 GG(d, a, b, c, x[10],
S22, 0x2441453);
264 GG(c, d, a, b, x[15],
S23, 0xd8a1e681);
265 GG(b, c, d, a, x[4],
S24, 0xe7d3fbc8);
266 GG(a, b, c, d, x[9],
S21, 0x21e1cde6);
267 GG(d, a, b, c, x[14],
S22, 0xc33707d6);
268 GG(c, d, a, b, x[3],
S23, 0xf4d50d87);
269 GG(b, c, d, a, x[8],
S24, 0x455a14ed);
270 GG(a, b, c, d, x[13],
S21, 0xa9e3e905);
271 GG(d, a, b, c, x[2],
S22, 0xfcefa3f8);
272 GG(c, d, a, b, x[7],
S23, 0x676f02d9);
273 GG(b, c, d, a, x[12],
S24, 0x8d2a4c8a);
276 HH(a, b, c, d, x[5],
S31, 0xfffa3942);
277 HH(d, a, b, c, x[8],
S32, 0x8771f681);
278 HH(c, d, a, b, x[11],
S33, 0x6d9d6122);
279 HH(b, c, d, a, x[14],
S34, 0xfde5380c);
280 HH(a, b, c, d, x[1],
S31, 0xa4beea44);
281 HH(d, a, b, c, x[4],
S32, 0x4bdecfa9);
282 HH(c, d, a, b, x[7],
S33, 0xf6bb4b60);
283 HH(b, c, d, a, x[10],
S34, 0xbebfbc70);
284 HH(a, b, c, d, x[13],
S31, 0x289b7ec6);
285 HH(d, a, b, c, x[0],
S32, 0xeaa127fa);
286 HH(c, d, a, b, x[3],
S33, 0xd4ef3085);
287 HH(b, c, d, a, x[6],
S34, 0x4881d05);
288 HH(a, b, c, d, x[9],
S31, 0xd9d4d039);
289 HH(d, a, b, c, x[12],
S32, 0xe6db99e5);
290 HH(c, d, a, b, x[15],
S33, 0x1fa27cf8);
291 HH(b, c, d, a, x[2],
S34, 0xc4ac5665);
294 II(a, b, c, d, x[0],
S41, 0xf4292244);
295 II(d, a, b, c, x[7],
S42, 0x432aff97);
296 II(c, d, a, b, x[14],
S43, 0xab9423a7);
297 II(b, c, d, a, x[5],
S44, 0xfc93a039);
298 II(a, b, c, d, x[12],
S41, 0x655b59c3);
299 II(d, a, b, c, x[3],
S42, 0x8f0ccc92);
300 II(c, d, a, b, x[10],
S43, 0xffeff47d);
301 II(b, c, d, a, x[1],
S44, 0x85845dd1);
302 II(a, b, c, d, x[8],
S41, 0x6fa87e4f);
303 II(d, a, b, c, x[15],
S42, 0xfe2ce6e0);
304 II(c, d, a, b, x[6],
S43, 0xa3014314);
305 II(b, c, d, a, x[13],
S44, 0x4e0811a1);
306 II(a, b, c, d, x[4],
S41, 0xf7537e82);
307 II(d, a, b, c, x[11],
S42, 0xbd3af235);
308 II(c, d, a, b, x[2],
S43, 0x2ad7d2bb);
309 II(b, c, d, a, x[9],
S44, 0xeb86d391);
317 memset(x, 0,
sizeof x);
324 inline void MD5::update(
const unsigned char input[], size_type length)
330 if ((
count[0] += (length << 3)) < (length << 3))
332 count[1] += (length >> 29);
340 if (length >= firstpart)
343 memcpy(&
buffer[index], input, firstpart);
356 memcpy(&
buffer[index], &input[i], length - i);
362 inline void MD5::update(
const char input[], size_type length)
364 update(reinterpret_cast<const unsigned char*>(input), length);
373 static unsigned char padding[64] = {
374 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
375 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
376 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
382 unsigned char bits[8];
387 size_type padLen = (index < 56) ? (56 - index) : (120 - index);
415 for (
int i = 0; i < 16; i++)
416 sprintf_s(buf + i * 2, 33 - i * 2,
"%02x",
digest[i]);
419 return std::string(buf);
426 return out <<
md5.hexdigest();
431 inline std::string
md5(
const std::string str)
435 return md5.hexdigest();
std::ostream & operator<<(std::ostream &out, MD5 md5)
void update(const unsigned char *buf, size_type length)
static void encode(uint1 output[], const uint4 input[], size_type len)
void transform(const uint1 block[blocksize])
static uint4 G(uint4 x, uint4 y, uint4 z)
static void FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac)
friend std::ostream & operator<<(std::ostream &, MD5 md5)
static void II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac)
static void decode(uint4 output[], const uint1 input[], size_type len)
static uint4 H(uint4 x, uint4 y, uint4 z)
std::string hexdigest() const
static uint4 rotate_left(uint4 x, int n)
static uint4 I(uint4 x, uint4 y, uint4 z)
static void HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac)
std::string md5(const std::string str)
static uint4 F(uint4 x, uint4 y, uint4 z)
static void GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac)