📄 md5_2.cpp
字号:
#include <iostream>
#include <iomanip.h>
#include <memory.h>
#include <math.h>
#include <stdlib.h>
using namespace std;
typedef unsigned char u8;
typedef unsigned int u32;
const double MAX_INT =(double)0xFFFFFFFF + 1.0;
struct UNIT
{
u32 A;
u32 B;
u32 C;
u32 D;
};
u32 X[16];
typedef u32 (*Func)(u32,u32,u32);
static u32 T[65];
const u32 TX[4][16][3] =
{
{
{ 0, 7, 1}, { 1,12, 2}, { 2,17, 3}, { 3,22, 4},
{ 4, 7, 5}, { 5,12, 6}, { 6,17, 7}, { 7,22, 8},
{ 8, 7, 9}, { 9,12,10}, {10,17,11}, {11,22,12},
{12, 7,13}, {13,12,14}, {14,17,15}, {15,22,16},
},
{
{ 1, 5,17}, { 6, 9,18}, {11,14,19}, { 0,20,20},
{ 5, 5,21}, {10, 9,22}, {15,14,23}, { 4,20,24},
{ 9, 5,25}, {14, 9,26}, { 3,14,27}, { 8,20,28},
{13, 5,29}, { 2, 9,30}, { 7,14,31}, {12,20,32},
},
{
{5, 4, 33}, { 8,11,34}, {11,16,35},{14, 23,36},
{1, 4, 37}, { 4,11,38}, { 7,16,39},{10, 23,40},
{13,4, 41}, { 0,11,42}, { 3,16,43},{ 6, 23,44},
{9, 4, 45}, {12,11,46}, {15,16,47},{ 2, 23,48},
},
{
{ 0,6,49}, { 7,10,50}, {14,15,51},{ 5, 21,52},
{12,6,53}, { 3,10,54}, {10,15,55},{ 1, 21,56},
{ 8,6,57}, {15,10,58}, { 6,15,59},{13, 21,60},
{ 4,6,61}, {11,10,62}, { 2,15,63},{ 9, 21,64},
},
};
void init()
{
for(int i=1;i<65;i++)
{
T[i]= (u32)(MAX_INT * fabs(sin(i)));
}
}
u32 F(u32 x,u32 y,u32 z)
{
return ((x & y) | ((~x) & z));
}
u32 G(u32 x,u32 y,u32 z)
{
return ((x & z) | (y & (~z)));
}
u32 H(u32 x,u32 y,u32 z)
{
return (x ^ y ^ z);
}
u32 I(u32 x,u32 y,u32 z)
{
return (y ^ (x | (~z)));
}
void display(u32 x)
{
if(x<(1<<28)) cout<<"0";
if(x<(1<<24))cout<<"0";
if(x<(1<<20)) cout<<"0";
if(x<(1<<16))cout<<"0";
if(x<(1<<12)) cout<<"0";
if(x<(1<<8))cout<<"0";
if(x<(1<<4)) cout<<"0";
cout<<std::hex<<x;
}
u8* pretreat(u8 * data,int len,int & newLen)
{
int fill,rest,size;
u8* newData;
u32 bit_len;
rest=len%56;
if(rest <= 56) fill= 56- rest;
else fill = (64-rest )+56;
newData = new u8(len+fill+8);
if(NULL == newData) return NULL;
if(len > 0) memcpy(newData,data,len);
if(fill>0) memset(newData+len,0x80,1);
if(fill>1) memset(newData+len+1,0,fill-1);
size=fill+len;
bit_len = size * 8;
memset(newData + size + 0,(bit_len & 0x000000FF), 1);
memset(newData + size + 1,(bit_len & 0x0000FF00) >> 8, 1);
memset(newData + size + 2,(bit_len & 0x00FF0000) >> 16,1);
memset(newData + size + 3,(bit_len & 0xFF000000) >> 24,1);
memset(newData + size + 4,0,4);
newLen = size + 8;
return newData;
}
//左移函数
u32 leftMove(u32 x,int s)
{
return (x>>32-s)|(x<<s);
}
//转换函数
void transform(UNIT & unit,int index,Func f)
{
u32 abcd[4],temp;
int k,s,u;
for(int i=0;i<16;i++)
{
k=TX[index][i][0];
s=TX[index][i][1];
u=TX[index][i][2];
temp=f(unit.B,unit.C,unit.D);
abcd[0]=unit.D;
abcd[1]=leftMove(unit.A+temp+X[k]+T[u],s)+unit.B;
abcd[2]=unit.B;
abcd[3]=unit.C;
unit.A=abcd[0];
unit.B=abcd[1];
unit.C=abcd[2];
unit.D=abcd[3];
}
}
//md5函数实现
int md5(u8 * data,int len)
{
u32 AA,BB,CC,DD;
u8* buf;
int newLen;
UNIT unit;
init();
buf=pretreat(data,len,newLen);
if(NULL == buf) return -1;
AA = 0x67452301;
BB = 0xefcdab89;
CC = 0x98badcfe;
DD = 0x10325476;
for(int i=0;i<newLen/64;i++)
{
unit.A=AA;
unit.B=BB;
unit.C=CC;
unit.D=DD;
for(int j=0;j<16;j++)
{
X[j] =buf[i*16+j*4];
X[j] +=buf[i*16+j*4+1]<<8;
X[j] +=buf[i*16+j*4+2]<<16;
X[j] +=buf[i*16+j*4+3]<<24;
}
transform(unit,0,F);
transform(unit,1,G);
transform(unit,2,H);
transform(unit,3,I);
AA=unit.A+AA;
BB=unit.B+BB;
CC=unit.C+CC;
DD=unit.D+DD;
}
display(AA);
display(BB);
display(CC);
display(DD);
cout<<endl;
return 0;
}
//md5函数
void md5(u8 * data)
{
//int len=sizeof(data);
int len=0;
while(data[len]!='\0')len++;
md5(data,len);
}
void main()
{
char str[200];
cout<<"输入字符串"<<endl;
cin>>str;
cout<<"md5散列值为:"<<endl;
md5((u8*)str);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -