Last active
December 10, 2015 16:59
-
-
Save shanewfx/4464905 to your computer and use it in GitHub Desktop.
[C++] MD5.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Windows.h> | |
#include "MD5.h" | |
////////////////////////////////////////////////////////////////////////////////// | |
//常量定义 | |
//加密常量 | |
#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 //数据常量 | |
//密钥长度 | |
#define ENCRYPT_KEY_LEN 8 //密钥长度 | |
////////////////////////////////////////////////////////////////////////////////// | |
//函数定义 | |
#define H(x,y,z) ((x)^(y)^(z)) | |
#define I(x,y,z) ((y)^((x)|(~z))) | |
#define F(x,y,z) (((x)&(y))|((~x)&(z))) | |
#define G(x,y,z) (((x)&(z))|((y)&(~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)+(ULONG)(ac); \ | |
(a)=ROTATE_LEFT((a),(s)); \ | |
(a)+=(b); \ | |
} | |
//函数定义 | |
#define GG(a,b,c,d,x,s,ac) \ | |
{ \ | |
(a)+=G((b),(c),(d))+(x)+(ULONG)(ac); \ | |
(a)=ROTATE_LEFT ((a),(s)); \ | |
(a)+=(b); \ | |
} | |
//函数定义 | |
#define HH(a,b,c,d,x,s,ac) \ | |
{ \ | |
(a)+=H((b),(c),(d))+(x)+(ULONG)(ac); \ | |
(a)=ROTATE_LEFT((a),(s)); \ | |
(a)+=(b); \ | |
} | |
//函数定义 | |
#define II(a,b,c,d,x,s,ac) \ | |
{ \ | |
(a)+=I((b),(c),(d))+(x)+(ULONG)(ac); \ | |
(a)=ROTATE_LEFT((a),(s)); \ | |
(a)+=(b); \ | |
} | |
////////////////////////////////////////////////////////////////////////////////// | |
//初始化 | |
VOID CMD5Aide::MD5Init() | |
{ | |
m_lCount[0]=0; | |
m_lCount[1]=0; | |
m_lState[0]=0x67452301; | |
m_lState[1]=0xefcdab89; | |
m_lState[2]=0x98badcfe; | |
m_lState[3]=0x10325476; | |
MD5Memset(m_cbPadding,0,sizeof(m_cbPadding)); | |
*m_cbPadding=0x80; | |
return; | |
} | |
//更新函数 | |
VOID CMD5Aide::MD5Update (BYTE * pcbInput, UINT inputLen) | |
{ | |
UINT i,nIndex,nPartLen; | |
nIndex=(UINT)((this->m_lCount[0]>>3)&0x3F); | |
if ((m_lCount[0]+=((ULONG)inputLen<<3))<((ULONG)inputLen<<3)) m_lCount[1]++; | |
m_lCount[1]+=((ULONG)inputLen>>29); | |
nPartLen=64-nIndex; | |
if (inputLen>=nPartLen) | |
{ | |
MD5Memcpy((BYTE*)&m_cbBuffer[nIndex],(BYTE *)pcbInput,nPartLen); | |
MD5Transform(m_lState,m_cbBuffer); | |
for (i=nPartLen;i+63<inputLen;i+=64) MD5Transform(m_lState,&pcbInput[i]); | |
nIndex=0; | |
} | |
else i=0; | |
MD5Memcpy((BYTE*)&m_cbBuffer[nIndex],(BYTE *)&pcbInput[i],inputLen-i); | |
return; | |
} | |
//最终结果 | |
VOID CMD5Aide::MD5Final(BYTE digest[16]) | |
{ | |
BYTE cbBits[8]; | |
UINT nIndex,nPartLen; | |
Encode(cbBits,m_lCount,8); | |
nIndex=(UINT)((m_lCount[0]>>3)&0x3f); | |
nPartLen=(nIndex<56)?(56-nIndex):(120-nIndex); | |
MD5Update( m_cbPadding,nPartLen); | |
MD5Update(cbBits,8); | |
Encode(digest,m_lState,16); | |
MD5Memset((BYTE*)this,0,sizeof (*this)); | |
MD5Init(); | |
return; | |
} | |
//转换函数 | |
VOID CMD5Aide::MD5Transform(ULONG lState[4], BYTE cbBlock[64]) | |
{ | |
ULONG a=lState[0],b=lState[1],c=lState[2],d=lState[3],x[16]; | |
Decode(x,cbBlock,64); | |
FF(a,b,c,d,x[ 0],S11,0xd76aa478); /* 1 */ | |
FF(d,a,b,c,x[ 1],S12,0xe8c7b756); /* 2 */ | |
FF(c,d,a,b,x[ 2],S13,0x242070db); /* 3 */ | |
FF(b,c,d,a,x[ 3],S14,0xc1bdceee); /* 4 */ | |
FF(a,b,c,d,x[ 4],S11,0xf57c0faf); /* 5 */ | |
FF(d,a,b,c,x[ 5],S12,0x4787c62a); /* 6 */ | |
FF(c,d,a,b,x[ 6],S13,0xa8304613); /* 7 */ | |
FF(b,c,d,a,x[ 7],S14,0xfd469501); /* 8 */ | |
FF(a,b,c,d,x[ 8],S11,0x698098d8); /* 9 */ | |
FF(d,a,b,c,x[ 9],S12,0x8b44f7af); /* 10 */ | |
FF(c,d,a,b,x[10],S13,0xffff5bb1); /* 11 */ | |
FF(b,c,d,a,x[11],S14,0x895cd7be); /* 12 */ | |
FF(a,b,c,d,x[12],S11,0x6b901122); /* 13 */ | |
FF(d,a,b,c,x[13],S12,0xfd987193); /* 14 */ | |
FF(c,d,a,b,x[14],S13,0xa679438e); /* 15 */ | |
FF(b,c,d,a,x[15],S14,0x49b40821); /* 16 */ | |
GG(a,b,c,d,x[ 1],S21,0xf61e2562); /* 17 */ | |
GG(d,a,b,c,x[ 6],S22,0xc040b340); /* 18 */ | |
GG(c,d,a,b,x[11],S23,0x265e5a51); /* 19 */ | |
GG(b,c,d,a,x[ 0],S24,0xe9b6c7aa); /* 20 */ | |
GG(a,b,c,d,x[ 5],S21,0xd62f105d); /* 21 */ | |
GG(d,a,b,c,x[10],S22,0x2441453); /* 22 */ | |
GG(c,d,a,b,x[15],S23,0xd8a1e681); /* 23 */ | |
GG(b,c,d,a,x[ 4],S24,0xe7d3fbc8); /* 24 */ | |
GG(a,b,c,d,x[ 9],S21,0x21e1cde6); /* 25 */ | |
GG(d,a,b,c,x[14],S22,0xc33707d6); /* 26 */ | |
GG(c,d,a,b,x[ 3],S23,0xf4d50d87); /* 27 */ | |
GG(b,c,d,a,x[ 8],S24,0x455a14ed); /* 28 */ | |
GG(a,b,c,d,x[13],S21,0xa9e3e905); /* 29 */ | |
GG(d,a,b,c,x[ 2],S22,0xfcefa3f8); /* 30 */ | |
GG(c,d,a,b,x[ 7],S23,0x676f02d9); /* 31 */ | |
GG(b,c,d,a,x[12],S24,0x8d2a4c8a); /* 32 */ | |
HH(a,b,c,d,x[ 5],S31,0xfffa3942); /* 33 */ | |
HH(d,a,b,c,x[ 8],S32,0x8771f681); /* 34 */ | |
HH(c,d,a,b,x[11],S33,0x6d9d6122); /* 35 */ | |
HH(b,c,d,a,x[14],S34,0xfde5380c); /* 36 */ | |
HH(a,b,c,d,x[ 1],S31,0xa4beea44); /* 37 */ | |
HH(d,a,b,c,x[ 4],S32,0x4bdecfa9); /* 38 */ | |
HH(c,d,a,b,x[ 7],S33,0xf6bb4b60); /* 39 */ | |
HH(b,c,d,a,x[10],S34,0xbebfbc70); /* 40 */ | |
HH(a,b,c,d,x[13],S31,0x289b7ec6); /* 41 */ | |
HH(d,a,b,c,x[ 0],S32,0xeaa127fa); /* 42 */ | |
HH(c,d,a,b,x[ 3],S33,0xd4ef3085); /* 43 */ | |
HH(b,c,d,a,x[ 6],S34,0x4881d05); /* 44 */ | |
HH(a,b,c,d,x[ 9],S31,0xd9d4d039); /* 45 */ | |
HH(d,a,b,c,x[12],S32,0xe6db99e5); /* 46 */ | |
HH(c,d,a,b,x[15],S33,0x1fa27cf8); /* 47 */ | |
HH(b,c,d,a,x[ 2],S34,0xc4ac5665); /* 48 */ | |
II(a,b,c,d,x[ 0],S41,0xf4292244); /* 49 */ | |
II(d,a,b,c,x[ 7],S42,0x432aff97); /* 50 */ | |
II(c,d,a,b,x[14],S43,0xab9423a7); /* 51 */ | |
II(b,c,d,a,x[ 5],S44,0xfc93a039); /* 52 */ | |
II(a,b,c,d,x[12],S41,0x655b59c3); /* 53 */ | |
II(d,a,b,c,x[ 3],S42,0x8f0ccc92); /* 54 */ | |
II(c,d,a,b,x[10],S43,0xffeff47d); /* 55 */ | |
II(b,c,d,a,x[ 1],S44,0x85845dd1); /* 56 */ | |
II(a,b,c,d,x[ 8],S41,0x6fa87e4f); /* 57 */ | |
II(d,a,b,c,x[15],S42,0xfe2ce6e0); /* 58 */ | |
II(c,d,a,b,x[ 6],S43,0xa3014314); /* 59 */ | |
II(b,c,d,a,x[13],S44,0x4e0811a1); /* 60 */ | |
II(a,b,c,d,x[ 4],S41,0xf7537e82); /* 61 */ | |
II(d,a,b,c,x[11],S42,0xbd3af235); /* 62 */ | |
II(c,d,a,b,x[ 2],S43,0x2ad7d2bb); /* 63 */ | |
II(b,c,d,a,x[ 9],S44,0xeb86d391); /* 64 */ | |
lState[0]+=a; | |
lState[1]+=b; | |
lState[2]+=c; | |
lState[3]+=d; | |
MD5Memset((BYTE *)x,0,sizeof(x)); | |
return; | |
} | |
//编码函数 | |
VOID CMD5Aide::Encode(BYTE * pcbOutput, ULONG * pcbInput,UINT nLen) | |
{ | |
UINT i, j; | |
for (i=0,j=0;j<nLen;i++,j+=4) | |
{ | |
pcbOutput[j]=(BYTE)(pcbInput[i]&0xff); | |
pcbOutput[j+1]=(BYTE)((pcbInput[i]>>8)&0xff); | |
pcbOutput[j+2]=(BYTE)((pcbInput[i]>>16)&0xff); | |
pcbOutput[j+3]=(BYTE)((pcbInput[i]>>24)&0xff); | |
} | |
return; | |
} | |
//解码函数 | |
VOID CMD5Aide::Decode(ULONG * pcbOutput, BYTE * pcbInput, UINT nLen) | |
{ | |
UINT i,j; | |
for (i=0,j=0;j<nLen;i++,j+=4) | |
{ | |
pcbOutput[i]=((ULONG)pcbInput[j])|(((ULONG)pcbInput[j+1])<<8)| | |
(((ULONG)pcbInput[j+2])<<16)|(((ULONG)pcbInput[j+3])<< 24); | |
} | |
return; | |
} | |
//拷贝函数 | |
VOID CMD5Aide::MD5Memcpy(BYTE * pcbOutput, BYTE * pcbInput,UINT nLen) | |
{ | |
for (UINT i=0;i<nLen;i++) pcbOutput[i]=pcbInput[i]; | |
} | |
//置位函数 | |
VOID CMD5Aide::MD5Memset (BYTE * pcbOutput, INT nValue, UINT nLen) | |
{ | |
for (UINT i=0;i<nLen;i++) ((char *)pcbOutput)[i]=(char)nValue; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment