⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 md5_2.cpp

📁 C++写的md5算法实现
💻 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 + -