#include "main.h"
#include "MD5.h"
uint32_t MD5_data[16]={0};
uint8_t MD5_LastData[16]={0};
uint32_t data[16]={0};
uint32_t MD5_result[4]={0x67452301,0xefcdab89,0x98badcfe,0x10325476};
void Md5_hex()
{
for(int i=0,j=0;i<16;j++)
{
MD5_LastData[i++] = MD5_result[j];
MD5_LastData[i++] = MD5_result[j]>>8;
MD5_LastData[i++] = MD5_result[j]>>16;
MD5_LastData[i++] = MD5_result[j]>>24;
}
}
void MD5_Cal(uint8_t Consumer_data[],uint8_t num)
{
Generate_data(Consumer_data ,num);
MD5_Tran(data);
Md5_hex();
}
uint32_t Generate_data(uint8_t *rawdata ,uint8_t num)
{
uint8_t MD5_Cnt = 0;
for(int i=0; i<num/4;i++)
{
data[i] = rawdata[4*i] | rawdata[4*i+1]<<8 | rawdata[4*i+2]<<16 | rawdata[4*i+3]<<24 ;
MD5_Cnt ++;
}
data[MD5_Cnt ] = (uint32_t)0x80;
switch(num%4)
{
case 1:
data[MD5_Cnt] = (0x80)<<8 |rawdata[num-1] ;
MD5_Cnt++;
break;
case 2:
data[MD5_Cnt] = (0x80)<<16 |rawdata[num-2] | rawdata[num-1]<<8;
MD5_Cnt++;
break;
case 3:
data[MD5_Cnt] =(0x08)<<24 | rawdata[num-3] | rawdata[num-2]<<8 | rawdata[num-1]<<16 ;
MD5_Cnt++;
break;
default:
break;
}
data[14]=num*8;
return *data;
}
void MD5_Tran(uint32_t *data)
{
uint32_t a = MD5_result[0];
uint32_t b = MD5_result[1];
uint32_t c = MD5_result[2];
uint32_t d = MD5_result[3];
/*第一轮*/
a=FF(a,b,c,d,data[0],7,0xd76aa478);
d=FF(d,a,b,c,data[1],12,0xe8c7b756);
c=FF(c,d,a,b,data[2],17,0x242070db);
b=FF(b,c,d,a,data[3],22,0xc1bdceee);
a=FF(a,b,c,d,data[4],7,0xf57c0faf);
d=FF(d,a,b,c,data[5],12,0x4787c62a);
c=FF(c,d,a,b,data[6],17,0xa8304613);
b=FF(b,c,d,a,data[7],22,0xfd469501);
a=FF(a,b,c,d,data[8],7,0x698098d8);
d=FF(d,a,b,c,data[9],12,0x8b44f7af);
c=FF(c,d,a,b,data[10],17,0xffff5bb1);
b=FF(b,c,d,a,data[11],22,0x895cd7be);
a=FF(a,b,c,d,data[12],7,0x6b901122);
d=FF(d,a,b,c,data[13],12,0xfd987193);
c=FF(c,d,a,b,data[14],17,0xa679438e);
b=FF(b,c,d,a,data[15],22,0x49b40821);
/*第二轮*/
a=GG(a,b,c,d,data[1],5,0xf61e2562);
d=GG(d,a,b,c,data[6],9,0xc040b340);
c=GG(c,d,a,b,data[11],14,0x265e5a51);
b=GG(b,c,d,a,data[0],20,0xe9b6c7aa);
a=GG(a,b,c,d,data[5],5,0xd62f105d);
d=GG(d,a,b,c,data[10],9,0x02441453);
c=GG(c,d,a,b,data[15],14,0xd8a1e681);
b=GG(b,c,d,a,data[4],20,0xe7d3fbc8);
a=GG(a,b,c,d,data[9],5,0x21e1cde6);
d=GG(d,a,b,c,data[14],9,0xc33707d6);
c=GG(c,d,a,b,data[3],14,0xf4d50d87);
b=GG(b,c,d,a,data[8],20,0x455a14ed);
a=GG(a,b,c,d,data[13],5,0xa9e3e905);
d=GG(d,a,b,c,data[2],9,0xfcefa3f8);
c=GG(c,d,a,b,data[7],14,0x676f02d9);
b=GG(b,c,d,a,data[12],20,0x8d2a4c8a);
/*第三轮*/
a=HH(a,b,c,d,data[5],4,0xfffa3942);
d=HH(d,a,b,c,data[8],11,0x8771f681);
c=HH(c,d,a,b,data[11],16,0x6d9d6122);
b=HH(b,c,d,a,data[14],23,0xfde5380c);
a=HH(a,b,c,d,data[1],4,0xa4beea44);
d=HH(d,a,b,c,data[4],11,0x4bdecfa9);
c=HH(c,d,a,b,data[7],16,0xf6bb4b60);
b=HH(b,c,d,a,data[10],23,0xbebfbc70);
a=HH(a,b,c,d,data[13],4,0x289b7ec6);
d=HH(d,a,b,c,data[0],11,0xeaa127fa);
c=HH(c,d,a,b,data[3],16,0xd4ef3085);
b=HH(b,c,d,a,data[6],23,0x04881d05);
a=HH(a,b,c,d,data[9],4,0xd9d4d039);
d=HH(d,a,b,c,data[12],11,0xe6db99e5);
c=HH(c,d,a,b,data[15],16,0x1fa27cf8);
b=HH(b,c,d,a,data[2],23,0xc4ac5665);
/*第四轮*/
a=II(a,b,c,d,data[0],6,0xf4292244);
d=II(d,a,b,c,data[7],10,0x432aff97);
c=II(c,d,a,b,data[14],15,0xab9423a7);
b=II(b,c,d,a,data[5],21,0xfc93a039);
a=II(a,b,c,d,data[12],6,0x655b59c3);
d=II(d,a,b,c,data[3],10,0x8f0ccc92);
c=II(c,d,a,b,data[10],15,0xffeff47d);
b=II(b,c,d,a,data[1],21,0x85845dd1);
a=II(a,b,c,d,data[8],6,0x6fa87e4f);
d=II(d,a,b,c,data[15],10,0xfe2ce6e0);
c=II(c,d,a,b,data[6],15,0xa3014314);
b=II(b,c,d,a,data[13],21,0x4e0811a1);
a=II(a,b,c,d,data[4],6,0xf7537e82);
d=II(d,a,b,c,data[11],10,0xbd3af235);
c=II(c,d,a,b,data[2],15,0x2ad7d2bb);
b=II(b,c,d,a,data[9],21,0xeb86d391);
MD5_result[0]+= a;
MD5_result[1]+= b;
MD5_result[2]+= c;
MD5_result[3]+= d;
MD5_result[0]=MD5_result[0]&0xFFFFFFFF;
MD5_result[1]=MD5_result[1]&0xFFFFFFFF;
MD5_result[2]=MD5_result[2]&0xFFFFFFFF;
MD5_result[3]=MD5_result[3]&0xFFFFFFFF;
}
uint32_t FF(uint32_t a,uint32_t b,uint32_t c,uint32_t d,uint32_t data,uint8_t s,uint32_t ti)
{
uint32_t MD5_temp = 0;
MD5_temp = a+F(b,c,d)+data+ti;
a = b+crol(MD5_temp,s);
return a;
}
uint32_t GG(uint32_t a,uint32_t b,uint32_t c,uint32_t d,uint32_t data,uint8_t s,uint32_t ti)
{
uint32_t MD5_temp = 0;
MD5_temp = a+G(b,c,d)+data+ti;
a = b+crol(MD5_temp,s);
return a;
}
uint32_t HH(uint32_t a,uint32_t b,uint32_t c,uint32_t d,uint32_t data,uint8_t s,uint32_t ti)
{
uint32_t MD5_temp = 0;
MD5_temp = a+H(b,c,d)+data+ti;
a = b+crol(MD5_temp,s);
return a;
}
uint32_t II(uint32_t a,uint32_t b,uint32_t c,uint32_t d,uint32_t data,uint8_t s,uint32_t ti)
{
uint32_t MD5_temp = 0;
MD5_temp = a+I(b,c,d)+data+ti;
a = b+crol(MD5_temp,s);
return a;
}
uint32_t F(uint32_t a,uint32_t b,uint32_t c)
{
return (a&b)|((~a)&c);
}
uint32_t G(uint32_t a,uint32_t b,uint32_t c)
{
return (a&c)|(b&(~c));
}
uint32_t H(uint32_t a,uint32_t b,uint32_t c)
{
return a^b^c;
}
uint32_t I(uint32_t a,uint32_t b,uint32_t c)
{
return b^(a|(~c));
}
uint32_t crol(uint32_t data,uint8_t bit)
{
uint32_t right = data>>(32-bit);
uint32_t left = data<<bit;
return (left|right);
}
uint32_t cror(uint32_t data,uint8_t bit)
{
uint32_t left = data<<(32 - bit);
uint32_t right = data>>bit;
return (left|right);
}
MD5算法的C语言实现
最新推荐文章于 2022-02-23 17:51:25 发布