📄 md5.h
字号:
#ifndef _YJG_MD5_H_
#define _YJG_MD5_H_
#include <string.h>
#include <math.h>
// MD5基本运算函数 F, G, H and I
#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)))
//循环左移公式
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
class uint128
{
public:
unsigned int n[4];
char * toString();
uint128()
{
int i=0;
for(i=0;i<4;i++) n[i]=0;
}
uint128(uint128 & u)
{
int i=0;
for(i=0;i<4;i++) n[i]=u.n[i];
}
~uint128(){}
private:
void uint2char(const unsigned int u,char * s);//把32为整数以十六进制打印到字符串中
};
void uint2Char(const unsigned int u,char *s)
{
int i;
int t;
for(i=0;i<8;i++)
{
t=u%(unsigned int)pow(16,i+1);
if(t<10) s[i]='0'+t;
else s[i]='A'+t;
}
}
char * uint128::toString()
{
char * p=new char[33];
int i,j,t;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
if(i<7) t=(n[j]/(unsigned int)pow(16,i))%16;
else t=n[j]/(unsigned int)pow(16,i);
if(t<10) p[j*8+i]='0'+t;
else p[j*8+i]='a'+(t-10);
}
}
p[32]='\0';
return p;
}
const unsigned int T[64]={
0XD76AA478,0XE8C7B756,0X242070DB,0XC1BDCEEE,
0XF57C0FAF,0X4787C62A,0XA8304613,0XFD469501,
0X698098D8,0X8B44F7AF,0XFFFF5BB1,0X895CD7BE,
0X6B901122,0XFD987193,0XA679438E,0X49B40821,
0XF61E2562,0XC040B340,0X265E5A51,0XE9B6C7AA,
0XD62F105D,0X02441453,0XD8A1E681,0XE7D3FBC8,
0X21E1CDE6,0XC33707D6,0XF4D50D87,0X455A14ED,
0XA9E3E905,0XFCEFA3F8,0X676F02D9,0X8D2A4C8A,
0XFFFA3942,0X8771F681,0X699D6122,0XFDE5380C,
0XA4BEEA44,0X4BDECFA9,0XF6BB4B60,0XBEBFBC70,
0X289B7EC6,0XEAA127FA,0XD4EF3085,0X04881D05,
0XD9D4D039,0XE6DB99E5,0X1FA27CF8,0XC4AC5665,
0XFA292244,0X432AFF97,0XAB9423A7,0XFC93A039,
0X655B59C3,0X8F0CCC92,0XFFEFF47D,0X85845DD1,
0X6FA87E4F,0XFE2CE6E0,0XA3014314,0XAE0811A1,
0XF7537E82,0XBD3AF235,0X2AD7D2BB,0XEB86D391
};
//定义[abcd k s i]的函数
void Round1(unsigned int &a,unsigned int b,unsigned int c,unsigned int d,unsigned int k,unsigned int s,unsigned int i,unsigned int *X)
{
a=b+(ROTATE_LEFT((a+F(b,c,d)+X[k]+T[i]),s));
}
void Round2(unsigned int &a,unsigned int b,unsigned int c,unsigned int d,unsigned int k,unsigned int s,unsigned int i,unsigned int *X)
{
a=b+(ROTATE_LEFT((a+G(b,c,d)+X[k]+T[i]),s));
}
void Round3(unsigned int &a,unsigned int b,unsigned int c,unsigned int d,unsigned int k,unsigned int s,unsigned int i,unsigned int *X)
{
a=b+(ROTATE_LEFT((a+H(b,c,d)+X[k]+T[i]),s));
}
void Round4(unsigned int &a,unsigned int b,unsigned int c,unsigned int d,unsigned int k,unsigned int s,unsigned int i,unsigned int *X)
{
a=b+(ROTATE_LEFT((a+I(b,c,d)+X[k]+T[i]),s));
}
unsigned int Char2Int32(char a,char b,char c,char d)
{
unsigned int r;
r=((unsigned int)d)&0x000000ff;
r+=(((unsigned int)c)&0x000000ff)<<8;
r+=(((unsigned int)b)&0x000000ff)<<16;
r+=(((unsigned int)a)&0x000000ff)<<24;
return r;
}
unsigned int block[16]; //算法处理的每个512大小的块
uint128 md5(char * string)
{
uint128 r;
int i,j,last;
int start;
unsigned int len; //存放输入的字符串长度,最长为4G个字节
unsigned int AA,BB,CC,DD;
char t[4];
unsigned int A=0X67452301;
unsigned int B=0XEFCDAB89;
unsigned int C=0X98BADCFE;
unsigned int D=0X10325476;
start=0;
len=strlen(string);
last=(len>=448)?(len/512+2):1;
while(last!=0)
{
//以下为填充并选出每次的512bit
if(last==1) //最后一块
{
for(i=start;i<56+start;i+=4)
{
for(j=0;j<4;j++)
{
if(i+j==len) t[j]=0x80;
else if(i+j<len) t[j]=string[i+j];
else t[j]='\0';
}
block[i/4]=Char2Int32(t[0],t[1],t[2],t[3]);
}
block[14]=0;
block[15]=len;
last=0;
}
else
{
for(i=start;i<64+start;i+=4)
{
for(j=0;j<4;j++)
{
if(i+j==len) t[j]=0x80;
else if(i+j<len) t[j]=string[i+j];
else t[j]='\0';
}
block[i/4]=Char2Int32(t[0],t[1],t[2],t[3]);
}
last--;
start+=512;
}
AA=A;
BB=B;
CC=C;
DD=D;
/*roud1*/
Round1(A,B,C,D,0,7,1,block);
Round1(D,A,B,C,1,12,2,block);
Round1(C,D,A,B,2,17,3,block);
Round1(B,C,D,A,3,22,4,block);
Round1(A,B,C,D,4,7,5,block);
Round1(D,A,B,C,5,12,6,block);
Round1(C,D,A,B,6,17,7,block);
Round1(B,C,D,A,7,22,8,block);
Round1(A,B,C,D,8,7,9,block);
Round1(D,A,B,C,9,12,10,block);
Round1(C,D,A,B,10,17,11,block);
Round1(B,C,D,A,11,22,12,block);
Round1(A,B,C,D,12,7,13,block);
Round1(D,A,B,C,13,12,14,block);
Round1(C,D,A,B,14,17,15,block);
Round1(B,C,D,A,15,22,16,block);
/*roud2*/
Round2(A,B,C,D,1,5,17,block);
Round2(D,A,B,C,6,9,18,block);
Round2(C,D,A,B,11,14,19,block);
Round2(B,C,D,A,0,20,20,block);
Round2(A,B,C,D,5,5,21,block);
Round2(D,A,B,C,10,9,22,block);
Round2(C,D,A,B,15,14,23,block);
Round2(B,C,D,A,4,20,24,block);
Round2(A,B,C,D,9,5,25,block);
Round2(D,A,B,C,14,9,26,block);
Round2(C,D,A,B,3,14,27,block);
Round2(B,C,D,A,8,20,28,block);
Round2(A,B,C,D,13,5,29,block);
Round2(D,A,B,C,2,9,30,block);
Round2(C,D,A,B,7,14,31,block);
Round2(B,C,D,A,12,20,32,block);
/*roud3*/
Round3(A,B,C,D,5,4,33,block);
Round3(D,A,B,C,8,11,34,block);
Round3(C,D,A,B,11,16,35,block);
Round3(B,C,D,A,14,23,36,block);
Round3(A,B,C,D,1,4,37,block);
Round3(D,A,B,C,4,11,38,block);
Round3(C,D,A,B,7,16,39,block);
Round3(B,C,D,A,10,23,40,block);
Round3(A,B,C,D,13,4,41,block);
Round3(D,A,B,C,0,11,42,block);
Round3(C,D,A,B,3,16,43,block);
Round3(B,C,D,A,6,23,44,block);
Round3(A,B,C,D,9,4,45,block);
Round3(D,A,B,C,12,11,46,block);
Round3(C,D,A,B,15,16,47,block);
Round3(B,C,D,A,2,23,48,block);
/*roud4*/
Round4(A,B,C,D,0,6,49,block);
Round4(D,A,B,C,7,10,50,block);
Round4(C,D,A,B,14,15,51,block);
Round4(B,C,D,A,5,21,52,block);
Round4(A,B,C,D,12,6,53,block);
Round4(D,A,B,C,3,10,54,block);
Round4(C,D,A,B,10,15,55,block);
Round4(B,C,D,A,1,21,56,block);
Round4(A,B,C,D,8,6,57,block);
Round4(D,A,B,C,15,10,58,block);
Round4(C,D,A,B,6,15,59,block);
Round4(B,C,D,A,13,21,60,block);
Round4(A,B,C,D,4,6,61,block);
Round4(D,A,B,C,11,10,62,block);
Round4(C,D,A,B,2,15,63,block);
Round4(B,C,D,A,9,21,64,block);
A=A+AA;
B=B+BB;
C=C+CC;
D=D+DD;
}//end while
r.n[0]=A;
r.n[1]=B;
r.n[2]=C;
r.n[3]=D;
return r;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -