天下

记录修行的印记

单文件版MD5函数

//MD5.cpp
#include <string>
std::
string MD5(std::string s)
{
    
const char HEX_CHAR[]={'0''1''2''3''4''5''6''7',
        
'8''9''a''b''c''d''e''f'};

    
const unsigned long Md5Calc_t[ 64 ] = {
        
0xd76aa4780xe8c7b7560x242070db0xc1bdceee,
        
0xf57c0faf0x4787c62a0xa83046130xfd469501,
        
0x698098d80x8b44f7af0xffff5bb10x895cd7be,
        
0x6b9011220xfd9871930xa679438e0x49b40821,

        
0xf61e25620xc040b3400x265e5a510xe9b6c7aa,
        
0xd62f105d0x024414530xd8a1e6810xe7d3fbc8,
        
0x21e1cde60xc33707d60xf4d50d870x455a14ed,
        
0xa9e3e9050xfcefa3f80x676f02d90x8d2a4c8a,

        
0xfffa39420x8771f6810x6d9d61220xfde5380c,
        
0xa4beea440x4bdecfa90xf6bb4b600xbebfbc70,
        
0x289b7ec60xeaa127fa0xd4ef30850x04881d05,
        
0xd9d4d0390xe6db99e50x1fa27cf80xc4ac5665,

        
0xf42922440x432aff970xab9423a70xfc93a039,
        
0x655b59c30x8f0ccc920xffeff47d0x85845dd1,
        
0x6fa87e4f0xfe2ce6e00xa30143140x4e0811a1,
        
0xf7537e820xbd3af2350x2ad7d2bb0xeb86d391
    };

    
const unsigned long Md5Calc_s[ 16 ] = { 7,12,17,22,59,14,204,11,16,23,6,10,15,21 };

    
//扩展成K*512位
    unsigned long *data;
    
int l;
    l 
= s.length()*8;
    data 
= new unsigned long[((l/512)+1)*512];
    memset(data, 
0sizeof(data[0])*((l/512)+1)*512);
    
for(unsigned int i = 0; i < s.length(); ++i){
        data[i 
/ 4|= s[i] << 8*((i % 4));
    }
    data[s.length() 
/ 4|= 0x80 << 8*((s.length()%4));
    data[((l
/512)+1)*512/32-2]=l;
    l 
= (l/512)+1;
    
//开始计算
    unsigned long H[4], a, b, c, d;
    H[
0]=0x67452301, H[1]=0xefcdab89, H[2]=0x98badcfe, H[3]=0x10325476;

    
for(int i = 0; i<l; ++i){
        unsigned 
long M[16];
        
for(int t = 0; t<16++t)
            M[t] 
= data[i*16+t];

        a 
= H[0], b = H[1], c = H[2], d = H[3];

        unsigned 
long s, k, x, e;
        s 
= k = 0;
        
/** Turn 1, F */
        s 
= k = 0;
        
for( x = 0; x < 16; x ++ ){
            e 
= ( b & c ) | ( ~& d );
            e 
= a + e + M[ k ] + Md5Calc_t[ x ];
            e 
= ( e >> ( 32 - Md5Calc_s[ s ] )) | ( e << Md5Calc_s[ s ] );
            a 
= b + e;
            e 
= d; d = c; c = b; b = a; a = e;
            s 
= ( s + 1 ) % 4; k ++;
        }

        
/** Turn 2, G */
        k 
= 1; s = 4;
        
for( x = 16; x < 32; x ++ ){
            e 
= ( b & d ) | ( c & ~d );
            e 
= a + e + M[ k ] + Md5Calc_t[ x ];
            e 
= ( e >> ( 32 - Md5Calc_s[ s ] )) | ( e << Md5Calc_s[ s ] );
            a 
= b + e;
            e 
= d; d = c; c = b; b = a; a = e;
            k 
= ( k + 5 ) % 16;
            s 
= ( s - 3 ) % 4 + 4;
        }

        
/** Turn 3, H */
        k 
= 5; s = 8;
        
for( x = 32; x < 48; x ++ ){
            e 
= b ^ c ^ d;
            e 
= a + e + M[ k ] + Md5Calc_t[ x ];
            e 
= ( e >> ( 32 - Md5Calc_s[ s ] )) | ( e << Md5Calc_s[ s ] );
            a 
= b + e;
            e 
= d; d = c; c = b; b = a; a = e;
            k 
= ( k + 3 ) % 16;
            s 
= ( s - 7 ) % 4 + 8;
        }

        
/** Turn 4, I */
        k 
= 0; s = 12;
        
for( x = 48; x < 64; x ++ ){
            e 
= c ^ ( b | ~d );
            e 
= a + e + M[ k ] + Md5Calc_t[ x ];
            e 
= ( e >> ( 32 - Md5Calc_s[ s ] )) | ( e << Md5Calc_s[ s ] );
            a 
= b + e;
            e 
= d; d = c; c = b; b = a; a = e;
            k 
= ( k + 7 ) % 16;
            s 
= ( s - 11 ) % 4  + 12;
        }

        H[
0+= a;
        H[
1+= b;
        H[
2+= c;
        H[
3+= d;
    }
    
char buf[33];
    
for(int i = 0; i<32++i){
        buf[i] 
= HEX_CHAR[(H[i / 8>> (4*((i % 8))))&0xf];
    }
    
for(int i = 0; i<32; i += 2){
        
char tmp = buf[i];
        buf[i] 
= buf[i+1];
        buf[i
+1= tmp;
    }
    buf[
32= '\0';
    
return std::string(buf);
}

//Test
//#include <iostream>
//using namespace std;
//int main(int argc, char* argv[])
//{
//    char s[100];
//    std::string md5;
//    while(true){
//        scanf("%s", s);
//        md5 = MD5(s);
//        cout << md5 << endl;
//    }
//    return 0;
//}

posted on 2012-01-12 16:56 天下 阅读(485) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2012年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(4)

随笔分类(378)

随笔档案(329)

链接

最新随笔

搜索

最新评论