织梦CMS - 轻松建站从此开始!

罗索

与php md5算法完全一致的C语言版

落鹤生 发布于 2010-12-28 11:04 点击:次 
看到很多同学搜寻md5算法,我特意根据php的md5算法写了一个c语言版本,如果大家感兴趣,可以尽情的使用,通过本算法生成的md5摘要,与php的md5函数的结果完全相同。
TAG:

看到很多同学搜寻md5算法,我特意根据php的md5算法写了一个c语言版本,如果大家感兴趣,可以尽情的使用,通过本算法生成的md5摘要,与php的md5函数的结果完全相同。

  1. /** 
  2. * MD5制作函数,兼容PHP 
  3. * @author wangzebin 
  4.  
  5. */ 
  6.  
  7. #include <stdio.h> 
  8. #include <stdlib.h> 
  9. #include <string.h> 
  10. #include <syslog.h> 
  11.  
  12. /* 
  13.  * Convert an array of little-endian words to a hex string. 
  14.  */ 
  15. int binl2hex( int *src, char *dst, int nsize) 
  16.   if( src == 0 ) 
  17.     return 1; 
  18.  
  19.   if( dst == 0 ) 
  20.     return 1; 
  21.  
  22.   if( nsize < 32 ) 
  23.     return 1; 
  24.  
  25.  
  26.   char hex_tab[]  = "0123456789abcdef"
  27.  
  28.   int j = 0; 
  29.   for(int i = 0; i < 16; i++) 
  30.   { 
  31.     dst[j++] = hex_tab[(src[i>>2] >> ((i%4)*8+4)) & 0xF]; 
  32.  
  33. syslog(LOG_DEBUG,"end:%c-%d-%d-%d",dst[j-1]
  34. ,(src[i>>2] >> ((i%4)*8+4)),((i%4)*8+4),src[i>>2]); 
  35.  
  36.  
  37.     dst[j++] = hex_tab[(src[i>>2] >> ((i%4)*8  )) & 0xF]; 
  38. syslog(LOG_DEBUG,"end:%c-%d-%d-%d",dst[j-1]
  39. ,(src[i>>2] >> ((i%4)*8+4)),((i%4)*8+4),src[i>>2]); 
  40.   } 
  41.   dst[j] = 0; 
  42.   return 0; 
  43.  
  44. /* 
  45.  * Convert a string to an array of little-endian words 
  46.  * If chrsz is ASCII, characters >255 have their hi-byte silently ignored. 
  47.  */ 
  48. int str2binl(char * src,int *pndst, int nsize) 
  49.   if(src == 0) 
  50.     return 1; 
  51.  
  52.   if(pndst == 0) 
  53.     return 1; 
  54.  
  55.   int nloop = strlen(src) * 8; 
  56.   if( (nloop >> 5) >= nsize ) 
  57.     return 1; 
  58.  
  59.   for(int i=0; i<nsize; i++ ) 
  60.     pndst[i] = 0; 
  61.  
  62.    int mask = (1 << 8) - 1; 
  63.  
  64.   for(int i = 0; i < nloop; i += 8) 
  65.   { 
  66.     pndst[i>>5] |= ( src[i / 8] & mask) << (i%32); 
  67.   } 
  68.  
  69.   return 0; 
  70.  
  71. /* 
  72.  * Add integers, wrapping at 2^32. 
  73.  */ 
  74. int safe_add(int x, int y) 
  75.   int lsw = (x & 0xFFFF) + (y & 0xFFFF); 
  76.   int msw = (x >> 16) + (y >> 16) + (lsw >> 16); 
  77.   return (msw << 16) | (lsw & 0xFFFF); 
  78.  
  79. /* 
  80.  * Bitwise rotate a 32-bit number to the left. 
  81.  */ 
  82. int bit_rol(unsigned int num, unsigned int cnt) 
  83.   //old 
  84.   // return (num << cnt) | (num >>> (32 - cnt)); 
  85.   return (num << cnt) | (num >> (32 - cnt)); 
  86.  
  87. /* 
  88.  * These functions implement the four basic operations the algorithm uses. 
  89.  */ 
  90. int md5_cmn(int q, int a, int b, int x, int s, int t) 
  91.   return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); 
  92. int md5_ff( int a,  int b,  int c,  int d,  int x,  int s,  int t) 
  93.   return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); 
  94. int md5_gg( int a,  int b,  int c,  int d,  int x, int s,  int t) 
  95.   return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); 
  96. int md5_hh( int a,  int b,  int c,  int d,  int x,  int s,  int t) 
  97.   return md5_cmn(b ^ c ^ d, a, b, x, s, t); 
  98. int md5_ii( int a,  int b,  int c,  int d,  int x,  int s,  int t) 
  99.   return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); 
  100.  
  101. /* 
  102.  * Calculate the MD5 of an array of little-endian words, and a bit length 
  103.  */ 
  104. int core_md5( int *x,  int len,  int * dst) 
  105.   if( x == 0) 
  106.     return 1; 
  107.  
  108.   if( len <= 0 ) 
  109.     return 1; 
  110.  
  111.   if (dst == 0) 
  112.     return 1; 
  113.  
  114.   /* append padding */ 
  115.   x[len >> 5] |= 0x80 << ((len) % 32); 
  116.  
  117. syslog(LOG_DEBUG,"x[len >> 5]:%d",x[len >> 5]); 
  118. //old 
  119. //--x[(((len + 64) >>> 9) << 4) + 14] = len; 
  120.  
  121.   unsigned int ntemp = len + 64; 
  122.   x[(((ntemp) >> 9) << 4) + 14] = len; 
  123. syslog(LOG_DEBUG,"x[(((ntemp) >> 9) << 4) + 14]:%d"
  124. ,x[(((ntemp) >> 9) << 4) + 14]); 
  125.  
  126.   int a =  1732584193; 
  127.   int b = -271733879; 
  128.   int c = -1732584194; 
  129.   int d =  271733878; 
  130.   
  131.   int ncurrlen = (((ntemp) >> 9) << 4) + 14 + 1; 
  132.   for(int i = 0; i < ncurrlen; i += 16) 
  133.   { 
  134.     int olda = a; 
  135.     int oldb = b; 
  136.     int oldc = c; 
  137.     int oldd = d; 
  138.  
  139.     a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); 
  140.     d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); 
  141.     c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819); 
  142.     b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); 
  143.  
  144.     a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); 
  145.     d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426); 
  146.     c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); 
  147.     b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); 
  148.  
  149.  
  150.     a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416); 
  151.     d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); 
  152.     c = md5_ff(c, d, a, b, x[i+10], 17, -42063); 
  153.     b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); 
  154.     
  155.  
  156.     a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682); 
  157.     d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); 
  158.     c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); 
  159.     b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329); 
  160.  
  161.  
  162.     a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); 
  163.     d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); 
  164.     c = md5_gg(c, d, a, b, x[i+11], 14,  643717713); 
  165.     b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); 
  166.  
  167.     a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); 
  168.     d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083); 
  169.     c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); 
  170.     b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); 
  171.  
  172.     a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438); 
  173.     d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); 
  174.     c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); 
  175.     b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501); 
  176.  
  177.     a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); 
  178.     d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); 
  179.     c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473); 
  180.     b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); 
  181.  
  182.     a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); 
  183.     d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); 
  184.     c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562); 
  185.     b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); 
  186.  
  187.     a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); 
  188.     d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);  (王泽宾)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201012/10680.html]
本文出处:CSDN博客 作者:王泽宾
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容