📄 utmd5.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 + -