📄 md5.cpp
字号:
#include<math.h>
#include"cstring.h"
#include"stdafx.h"
#include"MD5.h"
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
MD5::MD5()
{
Init();
}
MD5::~MD5()
{}
void MD5::StrToVec(CString& str)
{
int i,d=0,len=str.GetLength();
unsigned long k=0;
if(len==0)
M.push_back(0x80000000);
for(i=0;i<len;i++)
{
k<<=8;
k+=(byte)str[i];
if(i%4==3 || i==len-1)
{
if(i==len-1)
{
if(len%4==0)
{
M.push_back(k);
M.push_back(0x80000000);
}
else if(len%4==1)
{
k<<=24;
k+=0x800000;
M.push_back(k);
}
if(len%4==2)
{
k<<=16;
k+=0x8000;
M.push_back(k);
}
if(len%4==3)
{
k<<=8;
k+=0x80;
M.push_back(k);
}
k=0;
}
if(i==len-1)break;
M.push_back(k);
k=0;
}
}
for(i=0;i<len/4+1;i++)
{
M[i]=(M[i] & 0xff)<<24 | ((M[i]>>8) & 0xff)<<16 | ((M[i]>>16) & 0xff)<<8 | ((M[i]>>24) & 0xff);
}
}
void MD5::FillUp(CString& str)
{
int len=str.GetLength();
unsigned long k;
while(M.size()%16!=14)
{
M.push_back(0);
}
k=len*8;
M.push_back(k);
M.push_back(0);
}
void MD5::FF(unsigned long& X,unsigned long Y,unsigned long Z,
unsigned long K,int i,int s,unsigned long t)
{
X=Y+Left(X+F(Y,Z,K)+BUFF[i]+t,s);
}
void MD5::GG(unsigned long& X,unsigned long Y,unsigned long Z,
unsigned long K,int i,int s,unsigned long t)
{
X=Y+Left(X+G(Y,Z,K)+BUFF[i]+t,s);
}
void MD5::HH(unsigned long& X,unsigned long Y,unsigned long Z,
unsigned long K,int i,int s,unsigned long t)
{
X=Y+Left(X+H(Y,Z,K)+BUFF[i]+t,s);
}
void MD5::II(unsigned long& X,unsigned long Y,unsigned long Z,
unsigned long K,int i,int s,unsigned long t)
{
X=Y+Left(X+I(Y,Z,K)+BUFF[i]+t,s);
}
unsigned long MD5::Left(unsigned long X,int s)
{
return ( (X<<s) | (X>>(32-s)));
}
void MD5::tranform()
{
unsigned long AA,BB,CC,DD;
AA=A;
BB=B;
CC=C;
DD=D;
//ROUND1
FF(A,B,C,D,0,7,0xd76aa478);
FF(D,A,B,C,1,12,0xe8c7b756);
FF(C,D,A,B,2,17,0x242070db);
FF(B,C,D,A,3,22,0xc1bdceee);
FF(A,B,C,D,4,7,0xf57c0faf);
FF(D,A,B,C,5,12,0x4787c62a);
FF(C,D,A,B,6,17,0xa8304613);
FF(B,C,D,A,7,22,0xfd469501);
FF(A,B,C,D,8,7,0x698098d8);
FF(D,A,B,C,9,12,0x8b44f7af);
FF(C,D,A,B,10,17,0xffff5bb1);
FF(B,C,D,A,11,22,0x895cd7be);
FF(A,B,C,D,12,7,0x6b901122);
FF(D,A,B,C,13,12,0xfd987193);
FF(C,D,A,B,14,17,0xa679438e);
FF(B,C,D,A,15,22,0x49b40821);
//ROUDN2
GG(A,B,C,D,1,5,0xf61e2562);
GG(D,A,B,C,6,9,0xc040b340);
GG(C,D,A,B,11,14,0x265e5a51);
GG(B,C,D,A,0,20,0xe9b6c7aa);
GG(A,B,C,D,5,5,0xd62f105d);
GG(D,A,B,C,10,9,0x02441453);
GG(C,D,A,B,15,14,0xd8a1e681);
GG(B,C,D,A,4,20,0xe7d3fbc8);
GG(A,B,C,D,9,5,0x21e1cde6);
GG(D,A,B,C,14,9,0xc33707d6);
GG(C,D,A,B,3,14,0xf4d50d87);
GG(B,C,D,A,8,20,0x455a14ed);
GG(A,B,C,D,13,5,0xa9e3e905);
GG(D,A,B,C,2,9,0xfcefa3f8);
GG(C,D,A,B,7,14,0x676f02d9);
GG(B,C,D,A,12,20,0x8d2a4c8a);
//ROUND3
HH(A,B,C,D,5,4,0xfffa3942);
HH(D,A,B,C,8,11,0x8771f681);
HH(C,D,A,B,11,16,0x6d9d6122);
HH(B,C,D,A,14,23,0xfde5380c);
HH(A,B,C,D,1,4,0xa4beea44);
HH(D,A,B,C,4,11,0x4bdecfa9);
HH(C,D,A,B,7,16,0xf6bb4b60);
HH(B,C,D,A,10,23,0xbebfbc70);
HH(A,B,C,D,13,4,0x289b7ec6);
HH(D,A,B,C,0,11,0xeaa127fa);
HH(C,D,A,B,3,16,0xd4ef3085);
HH(B,C,D,A,6,23,0x04881d05);
HH(A,B,C,D,9,4,0xd9d4d039);
HH(D,A,B,C,12,11,0xe6db99e5);
HH(C,D,A,B,15,16,0x1fa27cf8);
HH(B,C,D,A,2,23,0xc4ac5665);
//ROUND4
II(A,B,C,D,0,6,0xf4292244);
II(D,A,B,C,7,10,0x432aff97);
II(C,D,A,B,14,15,0xab9423a7);
II(B,C,D,A,5,21,0xfc93a039);
II(A,B,C,D,12,6,0x655b59c3);
II(D,A,B,C,3,10,0x8f0ccc92);
II(C,D,A,B,10,15,0xffeff47d);
II(B,C,D,A,1,21,0x85845dd1);
II(A,B,C,D,8,6,0x6fa87e4f);
II(D,A,B,C,15,10,0xfe2ce6e0);
II(C,D,A,B,6,15,0xa3014314);
II(B,C,D,A,13,21,0x4e0811a1);
II(A,B,C,D,4,6,0xf7537e82);
II(D,A,B,C,11,10,0xbd3af235);
II(C,D,A,B,2,15,0x2ad7d2bb);
II(B,C,D,A,9,21,0xeb86d391);
A=A+AA;
B=B+BB;
C=C+CC;
D=D+DD;
}
void MD5::Init()
{
A=0x67452301;
B=0xefcdab89;
C=0x98badcfe;
D=0x10325476;
}
void MD5::Hash(CString& str1,CString& str2)
{
CString temp;
StrToVec(str1);
FillUp(str1);
for(int i=0;i<M.size()/16;i++)
{
for(int j=0;j<16;j++)
BUFF[j]=M[i*16+j];
tranform();
}
NumToStr(str2);
}
void MD5::NumToStr(CString& str)
{
CString temp;
A=(A & 0xff)<<24 | ((A>>8) & 0xff)<<16 | ((A>>16) & 0xff)<<8 | ((A>>24) & 0xff);
temp.Format("%x",A);
str+=temp;
B=(B & 0xff)<<24 | ((B>>8) & 0xff)<<16 | ((B>>16) & 0xff)<<8 | ((B>>24) & 0xff);
temp.Format("%x",B);
str+=temp;
C=(C & 0xff)<<24 | ((C>>8) & 0xff)<<16 | ((C>>16) & 0xff)<<8 | ((C>>24) & 0xff);
temp.Format("%x",C);
str+=temp;
D=(D & 0xff)<<24 | ((D>>8) & 0xff)<<16 | ((D>>16) & 0xff)<<8 | ((D>>24) & 0xff);
temp.Format("%x",D);
str+=temp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -