一个C++实现的md5源码(转)

来源:互联网 发布:成塔软件 编辑:程序博客网 时间:2024/06/13 23:46

 使用代码

[cpp] view plain copy
  1. string c,key;  
  2. cin >> c;  
  3. if( c == "c" ) return(0);  
  4.   
  5.   
  6. CMD5 iMD5;  
  7. iMD5.GenerateMD5( (unsigned char*)c.c_str(), c.size() );  
  8. key = iMD5.ToString();  

 

Md5.h

 

[cpp] view plain copy
  1. #ifndef _MD5_H  
  2. #define _MD5_H  
  3.   
  4. //#pragma warning(disable:4786)  
  5.   
  6. #include <string>  
  7.   
  8. using namespace std;  
  9.   
  10. /*! 
  11.  * Manage MD5. 
  12.  */  
  13. class CMD5  
  14. {  
  15. private:  
  16.     #define uint8  unsigned char  
  17.     #define uint32 unsigned long int  
  18.   
  19.     struct md5_context  
  20.     {  
  21.         uint32 total[2];  
  22.         uint32 state[4];  
  23.         uint8 buffer[64];  
  24.     };  
  25.   
  26.     void md5_starts( struct md5_context *ctx );  
  27.     void md5_process( struct md5_context *ctx, uint8 data[64] );  
  28.     void md5_update( struct md5_context *ctx, uint8 *input, uint32 length );  
  29.     void md5_finish( struct md5_context *ctx, uint8 digest[16] );  
  30.   
  31. public:  
  32.     //! construct a CMD5 from any buffer  
  33.     void GenerateMD5(unsigned char* buffer,int bufferlen);  
  34.   
  35.     //! construct a CMD5  
  36.     CMD5();  
  37.   
  38.     //! construct a md5src from char *  
  39.     CMD5(const char * md5src);  
  40.   
  41.     //! construct a CMD5 from a 16 bytes md5  
  42.     CMD5(unsigned long* md5src);  
  43.   
  44.     //! add a other md5  
  45.     CMD5 operator +(CMD5 adder);  
  46.   
  47.     //! just if equal  
  48.     bool operator ==(CMD5 cmper);  
  49.   
  50.     //! give the value from equer  
  51.     // void operator =(CMD5 equer);  
  52.   
  53.     //! to a string  
  54.     string ToString();  
  55.   
  56.     unsigned long m_data[4];  
  57. };  
  58. #endif /* md5.h */  

 

Md5.cpp

 

 

[cpp] view plain copy
  1. /* 
  2.  * RFC 1321 compliant MD5 implementation, 
  3.  * by Christophe Devine <devine@cr0.net>; 
  4.  * this program is licensed under the GPL. 
  5.  */  
  6. #include "Md5.h"  
  7. #include <stdio.h>  
  8. #include <stdlib.h>  
  9. #include <string.h>  
  10.   
  11. #define GET_UINT32(n,b,i)                                       /  
  12. {                                                               /  
  13.     (n) = (uint32) ((uint8 *) b)[(i)]                           /  
  14.       | (((uint32) ((uint8 *) b)[(i)+1]) <<  8)                 /  
  15.       | (((uint32) ((uint8 *) b)[(i)+2]) << 16)                 /  
  16.       | (((uint32) ((uint8 *) b)[(i)+3]) << 24);                /  
  17. }  
  18.   
  19. #define PUT_UINT32(n,b,i)                                       /  
  20. {                                                               /  
  21.     (((uint8 *) b)[(i)]  ) = (uint8) (((n)      ) & 0xFF);      /  
  22.     (((uint8 *) b)[(i)+1]) = (uint8) (((n) >>  8) & 0xFF);      /  
  23.     (((uint8 *) b)[(i)+2]) = (uint8) (((n) >> 16) & 0xFF);      /  
  24.     (((uint8 *) b)[(i)+3]) = (uint8) (((n) >> 24) & 0xFF);      /  
  25. }  
  26.   
  27. //extern pthread_mutex_t mutexMemory;  
  28.   
  29. void CMD5::md5_starts( struct md5_context *ctx )  
  30. {  
  31.     ctx->total[0] = 0;  
  32.     ctx->total[1] = 0;  
  33.     ctx->state[0] = 0x67452301;  
  34.     ctx->state[1] = 0xEFCDAB89;  
  35.     ctx->state[2] = 0x98BADCFE;  
  36.     ctx->state[3] = 0x10325476;  
  37. }  
  38.   
  39. void CMD5::md5_process( struct md5_context *ctx, uint8 data[64] )  
  40. {  
  41.     uint32 A, B, C, D, X[16];  
  42.   
  43.     GET_UINT32( X[0],  data,  0 );  
  44.     GET_UINT32( X[1],  data,  4 );  
  45.     GET_UINT32( X[2],  data,  8 );  
  46.     GET_UINT32( X[3],  data, 12 );  
  47.     GET_UINT32( X[4],  data, 16 );  
  48.     GET_UINT32( X[5],  data, 20 );  
  49.     GET_UINT32( X[6],  data, 24 );  
  50.     GET_UINT32( X[7],  data, 28 );  
  51.     GET_UINT32( X[8],  data, 32 );  
  52.     GET_UINT32( X[9],  data, 36 );  
  53.     GET_UINT32( X[10], data, 40 );  
  54.     GET_UINT32( X[11], data, 44 );  
  55.     GET_UINT32( X[12], data, 48 );  
  56.     GET_UINT32( X[13], data, 52 );  
  57.     GET_UINT32( X[14], data, 56 );  
  58.     GET_UINT32( X[15], data, 60 );  
  59.   
  60. #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))  
  61.   
  62. #define P(a,b,c,d,k,s,t)                                /  
  63. {                                                       /  
  64.     a += F(b,c,d) + X[k] + t; a = S(a,s) + b;           /  
  65. }  
  66.   
  67.     A = ctx->state[0];  
  68.     B = ctx->state[1];  
  69.     C = ctx->state[2];  
  70.     D = ctx->state[3];  
  71.   
  72. #define F(x,y,z) (z ^ (x & (y ^ z)))  
  73.   
  74.     P( A, B, C, D,  0,  7, 0xD76AA478 );  
  75.     P( D, A, B, C,  1, 12, 0xE8C7B756 );  
  76.     P( C, D, A, B,  2, 17, 0x242070DB );  
  77.     P( B, C, D, A,  3, 22, 0xC1BDCEEE );  
  78.     P( A, B, C, D,  4,  7, 0xF57C0FAF );  
  79.     P( D, A, B, C,  5, 12, 0x4787C62A );  
  80.     P( C, D, A, B,  6, 17, 0xA8304613 );  
  81.     P( B, C, D, A,  7, 22, 0xFD469501 );  
  82.     P( A, B, C, D,  8,  7, 0x698098D8 );  
  83.     P( D, A, B, C,  9, 12, 0x8B44F7AF );  
  84.     P( C, D, A, B, 10, 17, 0xFFFF5BB1 );  
  85.     P( B, C, D, A, 11, 22, 0x895CD7BE );  
  86.     P( A, B, C, D, 12,  7, 0x6B901122 );  
  87.     P( D, A, B, C, 13, 12, 0xFD987193 );  
  88.     P( C, D, A, B, 14, 17, 0xA679438E );  
  89.     P( B, C, D, A, 15, 22, 0x49B40821 );  
  90.   
  91. #undef F  
  92.   
  93. #define F(x,y,z) (y ^ (z & (x ^ y)))  
  94.   
  95.     P( A, B, C, D,  1,  5, 0xF61E2562 );  
  96.     P( D, A, B, C,  6,  9, 0xC040B340 );  
  97.     P( C, D, A, B, 11, 14, 0x265E5A51 );  
  98.     P( B, C, D, A,  0, 20, 0xE9B6C7AA );  
  99.     P( A, B, C, D,  5,  5, 0xD62F105D );  
  100.     P( D, A, B, C, 10,  9, 0x02441453 );  
  101.     P( C, D, A, B, 15, 14, 0xD8A1E681 );  
  102.     P( B, C, D, A,  4, 20, 0xE7D3FBC8 );  
  103.     P( A, B, C, D,  9,  5, 0x21E1CDE6 );  
  104.     P( D, A, B, C, 14,  9, 0xC33707D6 );  
  105.     P( C, D, A, B,  3, 14, 0xF4D50D87 );  
  106.     P( B, C, D, A,  8, 20, 0x455A14ED );  
  107.     P( A, B, C, D, 13,  5, 0xA9E3E905 );  
  108.     P( D, A, B, C,  2,  9, 0xFCEFA3F8 );  
  109.     P( C, D, A, B,  7, 14, 0x676F02D9 );  
  110.     P( B, C, D, A, 12, 20, 0x8D2A4C8A );  
  111.   
  112. #undef F  
  113.       
  114. #define F(x,y,z) (x ^ y ^ z)  
  115.   
  116.     P( A, B, C, D,  5,  4, 0xFFFA3942 );  
  117.     P( D, A, B, C,  8, 11, 0x8771F681 );  
  118.     P( C, D, A, B, 11, 16, 0x6D9D6122 );  
  119.     P( B, C, D, A, 14, 23, 0xFDE5380C );  
  120.     P( A, B, C, D,  1,  4, 0xA4BEEA44 );  
  121.     P( D, A, B, C,  4, 11, 0x4BDECFA9 );  
  122.     P( C, D, A, B,  7, 16, 0xF6BB4B60 );  
  123.     P( B, C, D, A, 10, 23, 0xBEBFBC70 );  
  124.     P( A, B, C, D, 13,  4, 0x289B7EC6 );  
  125.     P( D, A, B, C,  0, 11, 0xEAA127FA );  
  126.     P( C, D, A, B,  3, 16, 0xD4EF3085 );  
  127.     P( B, C, D, A,  6, 23, 0x04881D05 );  
  128.     P( A, B, C, D,  9,  4, 0xD9D4D039 );  
  129.     P( D, A, B, C, 12, 11, 0xE6DB99E5 );  
  130.     P( C, D, A, B, 15, 16, 0x1FA27CF8 );  
  131.     P( B, C, D, A,  2, 23, 0xC4AC5665 );  
  132.   
  133. #undef F  
  134.   
  135. #define F(x,y,z) (y ^ (x | ~z))  
  136.   
  137.     P( A, B, C, D,  0,  6, 0xF4292244 );  
  138.     P( D, A, B, C,  7, 10, 0x432AFF97 );  
  139.     P( C, D, A, B, 14, 15, 0xAB9423A7 );  
  140.     P( B, C, D, A,  5, 21, 0xFC93A039 );  
  141.     P( A, B, C, D, 12,  6, 0x655B59C3 );  
  142.     P( D, A, B, C,  3, 10, 0x8F0CCC92 );  
  143.     P( C, D, A, B, 10, 15, 0xFFEFF47D );  
  144.     P( B, C, D, A,  1, 21, 0x85845DD1 );  
  145.     P( A, B, C, D,  8,  6, 0x6FA87E4F );  
  146.     P( D, A, B, C, 15, 10, 0xFE2CE6E0 );  
  147.     P( C, D, A, B,  6, 15, 0xA3014314 );  
  148.     P( B, C, D, A, 13, 21, 0x4E0811A1 );  
  149.     P( A, B, C, D,  4,  6, 0xF7537E82 );  
  150.     P( D, A, B, C, 11, 10, 0xBD3AF235 );  
  151.     P( C, D, A, B,  2, 15, 0x2AD7D2BB );  
  152.     P( B, C, D, A,  9, 21, 0xEB86D391 );  
  153.   
  154. #undef F  
  155.   
  156.     ctx->state[0] += A;  
  157.     ctx->state[1] += B;  
  158.     ctx->state[2] += C;  
  159.     ctx->state[3] += D;  
  160. }  
  161.   
  162. void CMD5::md5_update( struct md5_context *ctx, uint8 *input, uint32 length )  
  163. {  
  164.     uint32 left, fill;  
  165.   
  166.     if( ! length ) return;  
  167.   
  168.     left = ( ctx->total[0] >> 3 ) & 0x3F;  
  169.     fill = 64 - left;  
  170.   
  171.     ctx->total[0] += length <<  3;  
  172.     ctx->total[1] += length >> 29;  
  173.   
  174.     ctx->total[0] &= 0xFFFFFFFF;  
  175.     ctx->total[1] += ctx->total[0] < length << 3;  
  176.   
  177.     if( left && length >= fill )  
  178.     {  
  179.         memcpy( (void *) (ctx->buffer + left), (void *) input, fill );  
  180.         md5_process( ctx, ctx->buffer );  
  181.         length -= fill;  
  182.         input  += fill;  
  183.         left = 0;  
  184.     }  
  185.   
  186.     while( length >= 64 )  
  187.     {  
  188.         md5_process( ctx, input );  
  189.         length -= 64;  
  190.         input  += 64;  
  191.     }  
  192.   
  193.     if( length )  
  194.     {  
  195.         memcpy( (void *) (ctx->buffer + left), (void *) input, length );  
  196.     }  
  197. }  
  198.   
  199. static uint8 md5_padding[64] =  
  200. {  
  201.  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  
  202.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  
  203.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  
  204.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  
  205. };  
  206.   
  207. void CMD5::md5_finish( struct md5_context *ctx, uint8 digest[16] )  
  208. {  
  209.     uint32 last, padn;  
  210.     uint8 msglen[8];  
  211.   
  212.     PUT_UINT32( ctx->total[0], msglen, 0 );  
  213.     PUT_UINT32( ctx->total[1], msglen, 4 );  
  214.   
  215.     last = ( ctx->total[0] >> 3 ) & 0x3F;  
  216.     padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );  
  217.   
  218.     md5_update( ctx, md5_padding, padn );  
  219.     md5_update( ctx, msglen, 8 );  
  220.   
  221.     PUT_UINT32( ctx->state[0], digest,  0 );  
  222.     PUT_UINT32( ctx->state[1], digest,  4 );  
  223.     PUT_UINT32( ctx->state[2], digest,  8 );  
  224.     PUT_UINT32( ctx->state[3], digest, 12 );  
  225. }  
  226.   
  227. void CMD5::GenerateMD5(unsigned char* buffer,int bufferlen)  
  228. {  
  229.     struct md5_context context;  
  230.     md5_starts (&context);  
  231.     md5_update (&context, buffer, bufferlen);  
  232.     md5_finish (&context,(unsigned char*)m_data);  
  233. }  
  234.   
  235. CMD5::CMD5()  
  236. {  
  237.     for(int i=0;i<4;i++)  
  238.         m_data[i]=0;  
  239. }  
  240.   
  241. CMD5::CMD5(unsigned long* md5src)  
  242. {  
  243.     memcpy(m_data,md5src,16);  
  244. }  
  245. int _httoi(const char *value)  
  246. {  
  247.   struct CHexMap  
  248.   {  
  249.     char chr;  
  250.     int value;  
  251.   };  
  252.   const int HexMapL = 16;  
  253.   CHexMap HexMap[HexMapL] =  
  254.   {  
  255.     {'0', 0}, {'1', 1},  
  256.     {'2', 2}, {'3', 3},  
  257.     {'4', 4}, {'5', 5},  
  258.     {'6', 6}, {'7', 7},  
  259.     {'8', 8}, {'9', 9},  
  260.     {'a', 10}, {'b', 11},  
  261.     {'c', 12}, {'d', 13},  
  262.     {'e', 14}, {'f', 15}  
  263.   };  
  264.   //pthread_mutex_lock(&mutexMemory);  
  265.   char *mstr = strdup(value);  
  266.   //pthread_mutex_unlock(&mutexMemory);  
  267.   char *s = mstr;  
  268.   int result = 0;  
  269.   if (*s == '0' && *(s + 1) == 'X') s += 2;  
  270.   bool firsttime = true;  
  271.   while (*s != '/0')  
  272.   {  
  273.     bool found = false;  
  274.     for (int i = 0; i < HexMapL; i++)  
  275.     {  
  276.       if (*s == HexMap[i].chr)  
  277.       {  
  278.         if (!firsttime) result <<= 4;  
  279.         result |= HexMap[i].value;  
  280.         found = true;  
  281.         break;  
  282.       }  
  283.     }  
  284.     if (!found) break;  
  285.     s++;  
  286.     firsttime = false;  
  287.   }  
  288.   //pthread_mutex_lock(&mutexMemory);  
  289.   free(mstr);  
  290.   //pthread_mutex_unlock(&mutexMemory);  
  291.   return result;  
  292. }  
  293.   
  294.   
  295. CMD5::CMD5(const char* md5src)  
  296. {  
  297.     if (strcmp(md5src,"")==0)  
  298.     {  
  299.         for(int i=0;i<4;i++)  
  300.             m_data[i]=0;  
  301.         return;  
  302.     }  
  303.     for(int j = 0; j < 16; j++ )  
  304.     {  
  305.         char buf[10];  
  306.         strncpy(buf,md5src,2);  
  307.         md5src+=2;  
  308.         ((unsigned char*)m_data)[j] = _httoi(buf);  
  309.     }  
  310. }  
  311.   
  312. CMD5 CMD5::operator +(CMD5 adder)  
  313. {  
  314.     unsigned long m_newdata[4];  
  315.     for(int i=0;i<4;i++)  
  316.         m_newdata[i]=m_data[i]^(adder.m_data[i]);  
  317.     return CMD5(m_newdata);  
  318. }  
  319.   
  320. bool CMD5::operator ==(CMD5 cmper)  
  321. {  
  322.     return (memcmp(cmper.m_data ,m_data,16)==0);  
  323. }  
  324.   
  325. //void CMD5::operator =(CMD5 equer)  
  326. //{  
  327. //  memcpy(m_data,equer.m_data ,16);  
  328. //}  
  329.   
  330. string CMD5::ToString()  
  331. {  
  332.     char output[33];  
  333.     for(int j = 0; j < 16; j++ )  
  334.     {  
  335.         sprintf( output + j * 2, "%02x", ((unsigned char*)m_data)[j]);  
  336.     }  
  337.     return string(output);  
  338. }  


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 平板版本太低怎么办 手机屏局部失灵怎么办 iphone8触屏不灵敏怎么办 苹果机8屏幕失灵怎么办 车钥匙丢车上怎么办 指纹锁华盖坏了怎么办 非法入了户口怎么办 司考成绩单丢了怎么办 小饭桌转让手续怎么办 两个领导不和你怎么办 两个领导意见不一致怎么办 两个领导对立我怎么办 投诉申通没用怎么办 领导作风有问题怎么办 做完火疗受风了难受怎么办 鼻子做的不好看怎么办 埋线双眼皮出血怎么办 割完双眼皮出血怎么办 全切双眼皮出血怎么办 割双眼皮出血了怎么办 割双眼皮后出血怎么办 双眼皮手术后出血怎么办 缝双眼皮开了怎么办 朋友网没了怎么办 压疮发生后怎么办 学籍账号已登录怎么办 护士学分不达标怎么办 高中学籍错了怎么办 定时器时间太短不够用怎么办? 考试时间不够用怎么办 感觉时间不够用怎么办 学习时间不够用怎么办 天天时间不够用怎么办 网贷骚扰通讯录怎么办 老被电话骚扰怎么办 对付广场舞噪音怎么办 普法平台考试不及格怎么办 假疫苗事件孩子怎么办 网上办生育证怎么办? 新生儿足跟血筛查没通过怎么办 新生儿听力筛查未通过怎么办