⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utmd5.cpp

📁 MD5加密代码
💻 CPP
字号:
/*********************************************
文件名:     utMD5.h
编写者:     向科松
编写日期:   2007-07-
简要描述:   实现MD5的功能
版本        : V1.0.0
编译环境    :    Borland C++ Build
实现环境    :    windows 2000 sp4
--------------------------------------------------------------------------------
备注         : <其它说明>
--------------------------------------------------------------------------------
修改记录 :
日 期        版本       修改人              修改内容
2007-07-    V1.0.0      ice.xiang
********************************************/


#pragma hdrstop

#include "utMD5.h"
#include "math.h"
//---------------------------------------------------------------------------
#include <Classes.hpp>
#pragma package(smart_init)


#define BLOCK_SIZE      64
#define MAX_FILL_SIZE   56
#define lShift(x, s) (x)<<(s)|(x)>>(32 -(s))

//================
#define S11 7
#define S12 12
#define S13 17
#define S14 22
//================
#define S21 5
#define S22 9
#define S23 14
#define S24 20
//================
#define S31 4
#define S32 11
#define S33 16
#define S34 23
//================
#define S41 6
#define S42 10
#define S43 15
#define S44 21
//================

//----------------------------------------------------
unsigned  int uf(unsigned x, unsigned y, unsigned z)
{
  return  (x & y)|((~x)&z);
}

unsigned  int fg(unsigned x, unsigned y, unsigned z)
{
  return  (x & z)|(y & (~z));
}

unsigned  int fh(unsigned x, unsigned y, unsigned z)
{
  return  x ^ y ^ z;
}

unsigned  int fi(unsigned x, unsigned y, unsigned z)
{
  return y ^ (x | (~z));
}
//运算宏

void __fastcall  ff(unsigned int &a, unsigned int &b, unsigned int &c,
                    unsigned int &d, unsigned int &X, int s, unsigned int T)
{
  a += uf(b,c,d) + X + T;
  a = lShift(a, s);
  a += b;
}

void __fastcall  gg(unsigned int &a, unsigned int &b, unsigned int &c,
                    unsigned int &d, unsigned int &X, int s, unsigned int T)
{
  a += fg(b,c,d) + X + T;
  a = lShift(a, s);
  a += b;
}

void __fastcall  hh(unsigned int &a, unsigned int &b, unsigned int &c,
                    unsigned int &d, unsigned int &X, int s, unsigned int T)
{
  a += fh(b,c,d) + X + T;
  a = lShift(a, s);
  a += b;
}

void __fastcall  ii(unsigned int &a, unsigned int &b, unsigned int &c,
                    unsigned int &d, unsigned int &X, int s, unsigned int T)
{
  a += fi(b,c,d) + X + T;
  a = lShift(a, s);
  a += b;
}
//----------------------------------------------------

void __fastcall Round1(unsigned int &A, unsigned int &B, unsigned int &C,
                       unsigned int &D, unsigned int X[], unsigned int T[])
{
  ff(A, B, C, D, X[0 ], S11, T[0]);
  ff(D, A, B, C, X[1 ], S12, T[1]);
  ff(C, D, A, B, X[2 ], S13, T[2]);
  ff(B, C, D, A, X[3 ], S14, T[3]);

  ff(A, B, C, D, X[4 ], S11, T[4]);
  ff(D, A, B, C, X[5 ], S12, T[5]);
  ff(C, D, A, B, X[6 ], S13, T[6]);
  ff(B, C, D, A, X[7 ], S14, T[7]);
                     
  ff(A, B, C, D, X[8 ] ,S11, T[8] );
  ff(D, A, B, C, X[9 ] ,S12, T[9] );
  ff(C, D, A, B, X[10 ],S13, T[10]);
  ff(B, C, D, A, X[11 ],S14, T[11]);

  ff(A, B, C, D, X[12 ],S11, T[12]);
  ff(D, A, B, C, X[13 ],S12, T[13]);
  ff(C, D, A, B, X[14 ],S13, T[14]);
  ff(B, C, D, A, X[15 ],S14, T[15]);

}

void __fastcall Round2(unsigned int &A, unsigned int &B, unsigned int &C,
                       unsigned int &D, unsigned int X[], unsigned int T[])
{
  gg(A, B, C, D, X[1 ], S21, T[16])  ;
  gg(D, A, B, C, X[6 ], S22, T[17])  ;
  gg(C, D, A, B, X[11], S23, T[18]) ;
  gg(B, C, D, A, X[0 ], S24, T[19]) ;

  gg(A, B, C, D, X[5 ], S21, T[20])  ;
  gg(D, A, B, C, X[10], S22, T[21])  ;
  gg(C, D, A, B, X[15], S23, T[22])  ;
  gg(B, C, D, A, X[4 ], S24, T[23])  ;

  gg(A, B, C, D, X[9 ], S21, T[24])  ;
  gg(D, A, B, C, X[14], S22, T[25])  ;
  gg(C, D, A, B, X[3 ], S23, T[26])  ;
  gg(B, C, D, A, X[8 ], S24, T[27])  ;

  gg(A, B, C, D, X[13], S21, T[28])  ;
  gg(D, A, B, C, X[2 ], S22, T[29])  ;
  gg(C, D, A, B, X[7 ], S23, T[30])  ;
  gg(B, C, D, A, X[12], S24, T[31])  ;
}

void __fastcall Round3(unsigned int &A, unsigned int &B, unsigned int &C,
                       unsigned int &D, unsigned int X[], unsigned int T[])
{
  hh(A, B, C, D, X[5 ], S31, T[32]) ;
  hh(D, A, B, C, X[8 ], S32, T[33]) ;
  hh(C, D, A, B, X[11], S33, T[34]) ;
  hh(B, C, D, A, X[14], S34, T[35]) ;

  hh(A, B, C, D, X[1 ], S31, T[36]) ;
  hh(D, A, B, C, X[4 ], S32, T[37]) ;
  hh(C, D, A, B, X[7 ], S33, T[38]) ;
  hh(B, C, D, A, X[10], S34, T[39]) ;

  hh(A, B, C, D, X[13], S31, T[40]) ;
  hh(D, A, B, C, X[0 ], S32, T[41]) ;
  hh(C, D, A, B, X[3 ], S33, T[42]) ;
  hh(B, C, D, A, X[6 ], S34, T[43]) ;

  hh(A, B, C, D, X[9 ], S31, T[44]) ;
  hh(D, A, B, C, X[12], S32, T[45]) ;
  hh(C, D, A, B, X[15], S33, T[46]) ;
  hh(B, C, D, A, X[2 ], S34, T[47]) ;

}

void __fastcall Round4(unsigned int &A, unsigned int &B, unsigned int &C,
                       unsigned int &D, unsigned int X[], unsigned int T[])
{
  ii(A, B, C, D, X[0 ], S41, T[48]) ;
  ii(D, A, B, C, X[7 ], S42, T[49]) ;
  ii(C, D, A, B, X[14], S43, T[50]) ;
  ii(B, C, D, A, X[5 ], S44, T[51]) ;

  ii(A, B, C, D, X[12], S41, T[52]) ;
  ii(D, A, B, C, X[3 ], S42, T[53]) ;
  ii(C, D, A, B, X[10], S43, T[54]) ;
  ii(B, C, D, A, X[1 ], S44, T[55]) ;

  ii(A, B, C, D, X[8 ], S41, T[56]) ;
  ii(D, A, B, C, X[15], S42, T[57]) ;
  ii(C, D, A, B, X[6 ], S43, T[58]) ;
  ii(B, C, D, A, X[13], S44, T[59]) ;

  ii(A, B, C, D, X[4 ], S41, T[60]) ;
  ii(D, A, B, C, X[11], S42, T[61]) ;
  ii(C, D, A, B, X[2 ], S43, T[62]) ;
  ii(B, C, D, A, X[9 ], S44, T[63]) ;

}

void __fastcall MD5Init(unsigned int &A, unsigned int &B,
                        unsigned int &C, unsigned int &D,
                        unsigned int &aa, unsigned int &bb,
                        unsigned int &cc, unsigned int &dd)
{
  A = aa = 0x67452301;
  B = bb = 0xefcdab89;
  C = cc = 0x98badcfe;
  D = dd = 0x10325476;

}

//---------------------------------------------------------------------------
extern "C"  char * __export __stdcall MD5(char * strText, char * strRv)
{
  String strRvl = "";
  if ((NULL == strText) || (NULL == strRv))
  {
    return NULL;
  }
  int nTextSize = StrLen(strText);

  char * p;
  unsigned int   unValue;
  unsigned char  Buffer[64];
  int            countRead  = 0;

  unsigned  int X[16];
  unsigned  int T[64];

  unsigned  int A = 0x67452301;
  unsigned  int B = 0xefcdab89;
  unsigned  int C = 0x98badcfe;
  unsigned  int D = 0x10325476;

  unsigned  int aa = A;
  unsigned  int bb = B;
  unsigned  int cc = C;
  unsigned  int dd = D;
  
  MD5Init(A, B, C, D, aa, bb, cc, dd);

  //产生T
  for (int i=0; i<64; i++)
  {
    T[i]  = (4294967296 * fabs(sin(i+1)));
  }

  p = strText;

  //处理数据
  countRead=0;
  bool  flag  = true;
  bool  L64   = false;

  while (flag)
  {
    int i = 0;

    for (; (countRead<nTextSize) && (i<64); countRead++ )
    {
      Buffer[i++] = *p++;
    }

    //生成填充数据
    if (i<64)
    {
      if (i<56)
      {
        if (!L64)
        {
          Buffer[i++] = 0x80;
        }
        
        for (; i<64; i++)
        {
          Buffer[i] = 0x00;
        }
        nTextSize = nTextSize << 0x3;
        Buffer[59]  = (nTextSize >>24) & 0xff;
        Buffer[58]  = (nTextSize >>16) & 0xff;
        Buffer[57]  = (nTextSize >>8) & 0xff;
        Buffer[56]  = (nTextSize ) & 0xff;
        flag  = false;
      }
      else
      {
        L64 = true;
        Buffer[i++] = 0x80;
        while (i<64)
        {
          Buffer[i++] = 0x00;
        }
      }

    }

    //生成项
    for (i=0; i<16; i++)
    {
      X[i]  =  (Buffer[i*4 + 3] << 24) & 0xff000000;
      X[i]  += (Buffer[i*4 + 2] << 16) & 0x00ff0000;
      X[i]  += (Buffer[i*4 + 1] << 8)  & 0x0000ff00;
      X[i]  +=  Buffer[i*4 + 0] & 0x000000ff;
    }

    A = aa;
    B = bb;
    C = cc;
    D = dd;

    //进行运算
    Round1(A, B, C, D, &X[0], &T[0]);
    Round2(A, B, C, D, &X[0], &T[0]);
    Round3(A, B, C, D, &X[0], &T[0]);
    Round4(A, B, C, D, &X[0], &T[0]);

    aa += A;
    bb += B;
    cc += C;
    dd += D;
  }

  Buffer[3] = (aa >> 24) & 0xff;
  Buffer[2] = (aa >> 16) & 0xff;
  Buffer[1] = (aa >> 8)  & 0xff;
  Buffer[0] =  aa        & 0xff;

  Buffer[7] = (bb >> 24) & 0xff;
  Buffer[6] = (bb >> 16) & 0xff;
  Buffer[5] = (bb >> 8)  & 0xff;
  Buffer[4] =  bb        & 0xff;

  Buffer[11]  = (cc >> 24) & 0xff;
  Buffer[10]  = (cc >> 16) & 0xff;
  Buffer[9] = (cc >> 8)  & 0xff;
  Buffer[8] =  cc        & 0xff;

  Buffer[15] = (dd >> 24) & 0xff;
  Buffer[14] = (dd >> 16) & 0xff;
  Buffer[13] = (dd >> 8)  & 0xff;
  Buffer[12] =  dd        & 0xff;

  strRvl  = "";
  String  strTmp;
  for (int j=0; j<16; j++)
  {
    strRvl  += strTmp.IntToHex(Buffer[j], 2);
  }

  strcpy(strRv, strRvl.c_str());
  return strRv;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -