C ++ implements md5 encryption or unique identification of computing files, and md5 Encryption

Source: Internet
Author: User

C ++ implements md5 encryption or unique identification of computing files, and md5 Encryption

I uploaded many classes on the network to implement md5 encryption for C ++. As for the class which is original, I dare not speculate. I just declare that I have reprinted it and support originality.

For the md5 encryption algorithm, I provide two files:

# Ifndef MD5_H # define MD5_H # include <string> # include <fstream>/* Type define */typedef unsigned char byte; typedef unsigned int uint32; using std: string; using std: ifstream;/* MD5 declaration. */class MD5 {public: MD5 (); MD5 (const void * input, size_t length); MD5 (const string & str); MD5 (ifstream & in ); void update (const void * input, size_t length); void update (const string & str); void update (Ifstream & in); const byte * digest (); string toString (); void reset (); string ToMD5 (const string & str); // in this case, you only need to call this function to complete the encryption process private: void update (const byte * input, size_t length); void final (); void transform (const byte block [64]); void encode (const uint32 * input, byte * output, size_t length); void decode (const byte * input, uint32 * output, size_t length); string bytesToHexString (const byte * input, si Ze_t length);/* class uncopyable */MD5 (const MD5 &); MD5 & operator = (const MD5 &); private: uint32 _ state [4]; /* state (ABCD) */uint32 _ count [2];/* number of bits, modulo 2 ^ 64 (low-order word first) */byte _ buffer [64];/* input buffer */byte _ digest [16];/* message digest */bool _ finished;/* calculate finished? */Static const byte PADDING [64];/* padding for calculate */static const char HEX [16]; enum {BUFFER_SIZE = 1024 };}; # endif/* MD5_H */

# Include "md5.h" # include "string. h "const string MD5_Key =" wow "; using namespace std;/* Constants for MD5Transform routine. */# define S11 7 # define S12 12 # define S13 17 # define S14 22 # define S21 5 # define S22 9 # define S23 14 # define S24 20 # define S31 4 # define S12 s32 11 # define S33 16 # define S34 23 # define S41 6 # define S42 10 # define S43 15 # define S44 21/* F, g, H and I are basic MD5 functions. */# 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)/* ROTATE_LEFT rotates x left n bits. */# define ROTATE_LEFT (x, n) (x) <(n) | (x)> (32-(n )))) /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. rotation is separate from addition to prevent recomputation. */# define FF (a, B, c, d, x, s, ac) {(a) + = F (B), (c), (d )) + (x) + ac; (a) = ROTATE_LEFT (a), (s); (a) + = (B) ;}# define GG (a, B, c, d, x, s, ac) {(a) + = G (B ),( C), (d) + (x) + ac; (a) = ROTATE_LEFT (a), (s); (a) + = (B );} # define HH (a, B, c, d, x, s, ac) {(a) + = H (B), (c), (d )) + (x) + ac; (a) = ROTATE_LEFT (a), (s); (a) + = (B) ;}# define II (a, B, c, d, x, s, ac) {(a) + = I (B), (c), (d) + (x) + ac; () = ROTATE_LEFT (a), (s); (a) + = (B);} const byte MD5: PADDING [64] = {0x80 }; const char MD5: HEX [16] = {'0', '1', '2', '3', '4', '5', '6 ', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F '}; /* Default construct. */MD5: MD5 () {reset ();}/* Construct a MD5 object with a input buffer. */MD5: MD5 (const void * input, size_t length) {reset (); update (input, length);}/* Construct a MD5 object with a string. */MD5: MD5 (const string & str) {reset (); update (str);}/* Construct a MD5 object with a file. */MD5: MD5 (ifstream & in) {reset (); update (In);}/* Return the message-digest */const byte * MD5: digest () {if (! _ Finished) {_ finished = true; final ();} return _ digest;}/* Reset the calculate state */void MD5: reset () {_ finished = false; /* reset number of bits. */_ count [0] = _ count [1] = 0;/* Load magic initialization constants. */_ state [0] = 0x67452301; _ state [1] = 0xefcdab89; _ state [2] = 0x98badcfe; _ state [3] = 0x10325476 ;} /* Updating the context with a input buffer. */void MD5: update (const void * Input, size_t length) {update (const byte *) input, length);}/* Updating the context with a string. */void MD5: update (const string & str) {update (const byte *) str. c_str (), str. length ();}/* Updating the context with a file. */void MD5: update (ifstream & in) {if (! In) {return;} std: streamsize length; char buffer [BUFFER_SIZE]; while (! In. eof () {in. read (buffer, BUFFER_SIZE); length = in. gcount (); if (length> 0) {update (buffer, length) ;}} in. close ();}/* MD5 block update operation. continues an MD5 message-digest operation, processing another message block, and updating the context. */void MD5: update (const byte * input, size_t length) {uint32 I, index, partLen; _ finished = false;/* Compute number of bytes mod 64 */index = (Uint32) (_ count [0]> 3) & 0x3f ); /* update number of bits */if (_ count [0] + = (uint32) length <3) <(uint32) length <3 )) {++ _ count [1];} _ count [1] + = (uint32) length> 29); partLen = 64-index; /* transform as same times as possible. */if (length> = partLen) {memcpy (& _ buffer [index], input, partLen); transform (_ buffer); for (I = partLen; I + 63 <length; I + = 64) {transform (& input [I ]);} Index = 0;} else {I = 0;}/* Buffer remaining input */memcpy (& _ buffer [index], & input [I], length-I);}/* MD5 finalization. ends an MD5 message-_ digest operation, writing the message _ digest and zeroizing the context. */void MD5: final () {byte bits [8]; uint32 oldState [4]; uint32 oldCount [2]; uint32 index, padLen; /* Save current state and count. */memcpy (oldState, _ state, 16); mem Cpy (oldCount, _ count, 8);/* Save number of bits */encode (_ count, bits, 8);/* Pad out to 56 mod 64. */index = (uint32) (_ count [0]> 3) & 0x3f); padLen = (index <56 )? (56-index): (120-index); update (PADDING, padLen);/* Append length (before padding) */update (bits, 8 ); /* Store state in digest */encode (_ state, _ digest, 16);/* Restore current state and count. */memcpy (_ state, oldState, 16); memcpy (_ count, oldCount, 8);}/* MD5 basic transformation. transforms _ state based on block. */void MD5: transform (const byte block [64]) {uint32 a = _ state [0], B = _ state [1], c = _ state [2], d = _ state [3], x [16]; decode (block, x, 64);/* Round 1 */FF (, b, c, d, x [0], S11, 0xd76aa478);/* 1 */FF (d, a, B, c, x [1], S12, 0xe8c7b756);/* 2 */FF (c, d, a, B, x [2], S13, 0x242070db);/* 3 */FF (B, c, d, a, x [3], S14, 0xc1bdceee);/* 4 */FF (a, B, c, d, x [4], S11, 0xf57c0faf ); /* 5 */FF (d, a, B, c, x [5], S12, 0x4787c62a);/* 6 */FF (c, d, a, B, x [6], S13, 0xa8304613);/* 7 */FF (B, c, d, a, x [7], S14, 0xfd469501 ); /* 8 */FF (a, B, c, d, x [8], S11, 0x698098d8);/* 9 */FF (d, a, B, c, x [9], S12, 0x8b44f7af);/* 10 */FF (c, d, a, B, x [10], S13, 0xffff5bb1 ); /* 11 */FF (B, c, d, a, x [11], S14, 0x895cd7be);/* 12 */FF (a, B, c, d, x [12], S11, 0x6b901122);/* 13 */FF (d, a, B, c, x [13], S12, 0xfd987193 ); /* 14 */FF (c, d, a, B, x [14], S13, 0xa679438e);/* 15 */FF (B, c, d,, x [15], S14, 0x49b40821);/* 16 * // * Round 2 */GG (a, B, c, d, x [1], S21, 0xf61e2562);/* 17 */GG (d, a, B, c, x [6], S22, 0xc040b340);/* 18 */GG (c, d, a, B, x [11], S23, 0x265e5a51);/* 19 */GG (B, c, d, a, x [0], S24, 0xe9b6c7aa ); /* 20 */GG (a, B, c, d, x [5], S21, 0xd62f105d);/* 21 */GG (d, a, B, c, x [10], S22, 0x2441453);/* 22 */GG (c, d, a, B, x [15], S23, 0xd8a1e681 ); /* 23 */GG (B, c, d, a, x [4], S24, 0xe7d3fbc8);/* 24 */GG (a, B, c, d, x [9], S21, 0x21e1cde6);/* 25 */GG (d, a, B, c, x [14], S22, 0xc33707d6 ); /* 26 */GG (c, d, a, B, x [3], S23, 0xf4d50d87);/* 27 */GG (B, c, d,, x [8], S24, 0x455a14ed);/* 28 */GG (a, B, c, d, x [13], S21, 0xa9e3e905 ); /* 29 */GG (d, a, B, c, x [2], S22, 0xfcefa3f8);/* 30 */GG (c, d, a, B, x [7], S23, 0x676f02d9);/* 31 */GG (B, c, d, a, x [12], S24, 0x8d2a4c8a ); /* 32 * // * Round 3 */HH (a, B, c, d, x [5], S31, 0xfffa3942);/* 33 */HH (d, a, B, c, x [8], S32, 0x8771f681);/* 34 */HH (c, d, a, B, x [11], S33, 0x6d9d6122);/* 35 */HH (B, c, d, a, x [14], S34, 0xfde5380c);/* 36 */HH (a, B, c, d, x [1], S31, 0xa4beea44);/* 37 */HH (d, a, B, c, x [4], S32, 0x4bdecfa9 ); /* 38 */HH (c, d, a, B, x [7], S33, 0xf6bb4b60);/* 39 */HH (B, c, d,, x [10], S34, 0xbebfbc70);/* 40 */HH (a, B, c, d, x [13], S31, 0x289b7ec6 ); /* 41 */HH (d, a, B, c, x [0], S32, 0xeaa127fa);/* 42 */HH (c, d, a, B, x [3], S33, 0xd4ef3085);/* 43 */HH (B, c, d, a, x [6], S34, 0x4881d05 ); /* 44 */HH (a, B, c, d, x [9], S31, 0xd9d4d039);/* 45 */HH (d, a, B, c, x [12], S32, 0xe6db99e5);/* 46 */HH (c, d, a, B, x [15], S33, 0x1fa27cf8 ); /* 47 */HH (B, c, d, a, x [2], S34, 0xc4ac5665);/* 48 * // * Round 4 */II (, b, c, d, x [0], S41, 0xf4292244);/* 49 */II (d, a, B, c, x [7], S42, 0x432aff97);/* 50 */II (c, d, a, B, x [14], S43, 0xab9423a7);/* 51 */II (B, c, d, a, x [5], S44, 0xfc93a039);/* 52 */II (a, B, c, d, x [12], S41, 0x655b59c3 ); /* 53 */II (d, a, B, c, x [3], S42, 0x8f0ccc92);/* 54 */II (c, d, a, B, x [10], S43, 0xffeff47d);/* 55 */II (B, c, d, a, x [1], S44, 0x85845dd1 ); /* 56 */II (a, B, c, d, x [8], S41, 0x6fa87e4f);/* 57 */II (d, a, B, c, x [15], S42, 0xfe2ce6e0);/* 58 */II (c, d, a, B, x [6], S43, 0xa3014314 ); /* 59 */II (B, c, d, a, x [13], S44, 0x4e0811a1);/* 60 */II (a, B, c, d, x [4], S41, 0xf7537e82);/* 61 */II (d, a, B, c, x [11], S42, 0xbd3af235 ); /* 62 */II (c, d, a, B, x [2], S43, 0x2ad7d2bb);/* 63 */II (B, c, d,, x [9], S44, 0xeb86d391);/* 64 */_ state [0] + = a; _ state [1] + = B; _ state [2] + = c; _ state [3] + = d;}/* Encodes input (ulong) into output (byte ). assumes length is a multiple of 4. */void MD5: encode (const uint32 * input, byte * output, size_t length) {for (size_t I = 0, j = 0; j <length; ++ I, j + = 4) {output [j] = (byte) (input [I] & 0xff); output [j + 1] = (byte) (input [I]> 8) & 0xff); output [j + 2] = (byte) (input [I]> 16) & 0xff ); output [j + 3] = (byte) (input [I]> 24) & 0xff) ;}/ * Decodes input (byte) into output (ulong ). assumes length is a multiple of 4. */void MD5: decode (const byte * input, uint32 * output, size_t length) {for (size_t I = 0, j = 0; j <length; ++ I, j + = 4) {output [I] = (uint32) input [j]) | (uint32) input [j + 1]) <8) | (uint32) input [j + 2]) <16) | (uint32) input [j + 3]) <24 );}} /* Convert byte array to hex string. */string MD5: bytesToHexString (const byte * input, size_t length) {string str; str. reserve (length <1); for (size_t I = 0; I <length; ++ I) {int t = input [I]; int a = t/16; int B = t % 16; str. append (1, HEX [a]); str. append (1, HEX [B]);} return str;}/* Convert digest to string value */string MD5: toString () {return bytesToHexString (digest (), 16);} string MD5: ToMD5 (const string & str) // MD5 encryption, where key = xyf, key must be added before encryption {const string str_word = str + MD5_Key; reset (); update (str_word); return toString ();}

So how to call it?

MD5 md5; // defines the MD5 class md5.update ("xxxxxx"); // because the update function only receives the string type, it uses getbuffer () function Conversion CString is stringchar * p = md5.toString (). c_str ();
However, you must call the md5.reset () method to reset the md5 value of another string.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.