MD5算法的C语言实现



#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);  
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值