MD5算法C语言实现

md5.c

  1 * Created on: 2013-4-24
  2  *    Author: veandy
  3 
  4 
  5 #include "md5.h"
  6 #include
  7 #include "md5.h"
  8 #include
  9 #include
 10 #include
 11 
 12 
 13 
 14 unsigned char PADDING[]={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 15 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 17 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 18 
 19 void MD5Init(MD5_CTX *context)
 20 {
 21 context->count[0] = 0;
 22 context->count[1] = 0;
 23 context->state[0] = 0x67452301;
 24 context->state[1] = 0xEFCDAB89;
 25 context->state[2] = 0x98BADCFE;
 26 context->state[3] = 0x10325476;
 27 }
 28 void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen)
 29 {
 30 unsigned int i = 0,index = 0,partlen = 0;
 31 index = (context->count[0] >> 3) & 0x3F;
 32 partlen = 64 - index;
 33 context->count[0] += inputlen << 3;
 34 if(context->count[0] < (inputlen << 3))
 35 context->count[1]++;
 36 context->count[1] += inputlen >> 29;
 37 
 38 if(inputlen >= partlen)
 39 {
 40 memcpy(&context->buffer[index],input,partlen);
 41 MD5Transform(context->state,context->buffer);
 42 for(i = partlen;i+64 <= inputlen;i+=64)
 43 MD5Transform(context->state,&input[i]);
 44 index = 0;
 45 }
 46 else
 47 {
 48 i = 0;
 49 }
 50 memcpy(&context->buffer[index],&input[i],inputlen-i);
 51 }
 52 void MD5Final(MD5_CTX *context,unsigned char digest[16])
 53 {
 54 unsigned int index = 0,padlen = 0;
 55 unsigned char bits[8];
 56 index = (context->count[0] >> 3) & 0x3F;
 57 padlen = (index < 56)?(56-index):(120-index);
 58 MD5Encode(bits,context->count,8);
 59 MD5Update(context,PADDING,padlen);
 60 MD5Update(context,bits,8);
 61 MD5Encode(digest,context->state,16);
 62 }
 63 void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len)
 64 {
 65 unsigned int i = 0,j = 0;
 66 while(j < len)
 67 {
 68 output[j] = input[i] & 0xFF;
 69 output[j+1] = (input[i] >> 8) & 0xFF;
 70 output[j+2] = (input[i] >> 16) & 0xFF;
 71 output[j+3] = (input[i] >> 24) & 0xFF;
 72 i++;
 73 j+=4;
 74 }
 75 }
 76 void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len)
 77 {
 78 unsigned int i = 0,j = 0;
 79 while(j < len)
 80 {
 81 output[i] = (input[j]) |
 82 (input[j+1] << 8) |
 83 (input[j+2] << 16) |
 84 (input[j+3] << 24);
 85 i++;
 86 j+=4;
 87 }
 88 }
 89 void MD5Transform(unsigned int state[4],unsigned char block[64])
 90 {
 91 unsigned int a = state[0];
 92 unsigned int b = state[1];
 93 unsigned int c = state[2];
 94 unsigned int d = state[3];
 95 unsigned int x[64];
 96 MD5Decode(x,block,64);
 97 FF(a, b, c, d, x[ 0], 7, 0xd76aa478);
 98 FF(d, a, b, c, x[ 1], 12, 0xe8c7b756);
 99 FF(c, d, a, b, x[ 2], 17, 0x242070db);
100 FF(b, c, d, a, x[ 3], 22, 0xc1bdceee);
101 FF(a, b, c, d, x[ 4], 7, 0xf57c0faf);
102 FF(d, a, b, c, x[ 5], 12, 0x4787c62a);
103 FF(c, d, a, b, x[ 6], 17, 0xa8304613);
104 FF(b, c, d, a, x[ 7], 22, 0xfd469501);
105 FF(a, b, c, d, x[ 8], 7, 0x698098d8);
106 FF(d, a, b, c, x[ 9], 12, 0x8b44f7af);
107 FF(c, d, a, b, x[10], 17, 0xffff5bb1);
108 FF(b, c, d, a, x[11], 22, 0x895cd7be);
109 FF(a, b, c, d, x[12], 7, 0x6b901122);
110 FF(d, a, b, c, x[13], 12, 0xfd987193);
111 FF(c, d, a, b, x[14], 17, 0xa679438e);
112 FF(b, c, d, a, x[15], 22, 0x49b40821);
113 
114 GG(a, b, c, d, x[ 1], 5, 0xf61e2562);
115 GG(d, a, b, c, x[ 6], 9, 0xc040b340);
116 GG(c, d, a, b, x[11], 14, 0x265e5a51);
117 GG(b, c, d, a, x[ 0], 20, 0xe9b6c7aa);
118 GG(a, b, c, d, x[ 5], 5, 0xd62f105d);
119 GG(d, a, b, c, x[10], 9,  0x2441453);
120 GG(c, d, a, b, x[15], 14, 0xd8a1e681);
121 GG(b, c, d, a, x[ 4], 20, 0xe7d3fbc8);
122 GG(a, b, c, d, x[ 9], 5, 0x21e1cde6);
123 GG(d, a, b, c, x[14], 9, 0xc33707d6);
124 GG(c, d, a, b, x[ 3], 14, 0xf4d50d87);
125 GG(b, c, d, a, x[ 8], 20, 0x455a14ed);
126 GG(a, b, c, d, x[13], 5, 0xa9e3e905);
127 GG(d, a, b, c, x[ 2], 9, 0xfcefa3f8);
128 GG(c, d, a, b, x[ 7], 14, 0x676f02d9);
129 GG(b, c, d, a, x[12], 20, 0x8d2a4c8a);
130 
131 HH(a, b, c, d, x[ 5], 4, 0xfffa3942);
132 HH(d, a, b, c, x[ 8], 11, 0x8771f681);
133 HH(c, d, a, b, x[11], 16, 0x6d9d6122);
134 HH(b, c, d, a, x[14], 23, 0xfde5380c);
135 HH(a, b, c, d, x[ 1], 4, 0xa4beea44);
136 HH(d, a, b, c, x[ 4], 11, 0x4bdecfa9);
137 HH(c, d, a, b, x[ 7], 16, 0xf6bb4b60);
138 HH(b, c, d, a, x[10], 23, 0xbebfbc70);
139 HH(a, b, c, d, x[13], 4, 0x289b7ec6);
140 HH(d, a, b, c, x[ 0], 11, 0xeaa127fa);
141 HH(c, d, a, b, x[ 3], 16, 0xd4ef3085);
142 HH(b, c, d, a, x[ 6], 23,  0x4881d05);
143 HH(a, b, c, d, x[ 9], 4, 0xd9d4d039);
144 HH(d, a, b, c, x[12], 11, 0xe6db99e5);
145 HH(c, d, a, b, x[15], 16, 0x1fa27cf8);
146 HH(b, c, d, a, x[ 2], 23, 0xc4ac5665);
147 
148 II(a, b, c, d, x[ 0], 6, 0xf4292244);
149 II(d, a, b, c, x[ 7], 10, 0x432aff97);
150 II(c, d, a, b, x[14], 15, 0xab9423a7);
151 II(b, c, d, a, x[ 5], 21, 0xfc93a039);
152 II(a, b, c, d, x[12], 6, 0x655b59c3);
153 II(d, a, b, c, x[ 3], 10, 0x8f0ccc92);
154 II(c, d, a, b, x[10], 15, 0xffeff47d);
155 II(b, c, d, a, x[ 1], 21, 0x85845dd1);
156 II(a, b, c, d, x[ 8], 6, 0x6fa87e4f);
157 II(d, a, b, c, x[15], 10, 0xfe2ce6e0);
158 II(c, d, a, b, x[ 6], 15, 0xa3014314);
159 II(b, c, d, a, x[13], 21, 0x4e0811a1);
160 II(a, b, c, d, x[ 4], 6, 0xf7537e82);
161 II(d, a, b, c, x[11], 10, 0xbd3af235);
162 II(c, d, a, b, x[ 2], 15, 0x2ad7d2bb);
163 II(b, c, d, a, x[ 9], 21, 0xeb86d391);
164 state[0] += a;
165 state[1] += b;
166 state[2] += c;
167 state[3] += d;
168 }

md5.h

 *  Created on: 2013-4-24
 *      Author: Administrator


#ifndef MD5_H_
#define MD5_H_
typedef struct
{
unsigned int count[2];
unsigned int state[4];
unsigned char buffer[64];
}MD5_CTX;


#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))
#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))
#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; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
void MD5Init(MD5_CTX *context);
void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);
void MD5Final(MD5_CTX *context,unsigned char digest[16]);
void MD5Transform(unsigned int state[4],unsigned char block[64]);
void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len);
void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len);

#endif



test.cpp
#include
#include
#include
#include
#include
#include "md5.h"
#include


extern "C" {
jbyteArray Java_com_example_demo_MainActivity_getaddressFromJNI(JNIEnv* env,
jobject thiz) {

MD5_CTX md5;
MD5Init(&md5);
int i;
unsigned char encrypt[] = "218545415555555555555555555"; 
unsigned char decrypt[16];
MD5Update(&md5, encrypt, strlen((char *) encrypt));
MD5Final(&md5, decrypt);



std:: string str="";
   char* c;
for (int i = 0; i < 16; ++i) {
__android_log_print(ANDROID_LOG_INFO, "MYPROG", "decrypt = %x",
decrypt[i]);

str+=decrypt[i];

//__android_log_print(ANDROID_LOG_INFO, "ed", "strd = %c",
// str[0]);


//const char* s=str.c_str();
__android_log_print(ANDROID_LOG_INFO, "ed", "strd = %x",
str[i]);

}
jbyte *by = (jbyte*)decrypt;
jbyteArray jarray = env->NewByteArray(16);
(env)->SetByteArrayRegion(jarray, 0, 16, (jbyte*)decrypt);


return jarray;
}

 

posted @ 2013-05-13 17:07  闲人轩  阅读(642)  评论(0编辑  收藏  举报