www.pudn.com > MD5.rar > md5main.cpp


#include "md5.h" 
#include  
#include  
#include  
 
#define DIGEST_LEN 16 // 摘要长度 
#define HASH_HEX_LEN 1+2*DIGEST_LEN // Hash值长度 
 
// 根据MD5算计算字符串的Hash值 
void MD5_Hash(char *hash, char *input) 
{ 
	int i; 
    int status = 0; 
	md5_state_t state; 
	md5_byte_t digest[DIGEST_LEN]; 
     
	int di; 
	// 初始化算法 
	md5_init(&state); 
	// 添加校验字符串 
	md5_append(&state, (const md5_byte_t *)input, strlen(input)); 
	// 完成MD5算法,输出摘要长度 
	md5_finish(&state, digest); 
 
	// 转换成Hash值 
	for (di = 0; di < 16; ++di) 
	{ 
	    sprintf(hash + di * 2, "%02x", digest[di]); 
	} 
} 
 
// 校验字符串MD5值 
bool MD5_Check(char *hash, char *input) 
{ 
	char input_str_hash[HASH_HEX_LEN]; 
	// 计算输入字符串的Hash值 
	MD5_Hash(input_str_hash,input); 
 
	// 比较输入的Hash值与计算出的Hash值是否相同 
	if(strcmp(hash,input_str_hash)) 
	{ 
		return false; // 不同的Hash值 
	} 
	else 
	{ 
		return true; // 相同的Hash值 
	} 
 
} 
int main(int argc, char *argv[]) 
{ 
	// 为了演示方便,使用字符串代表文件 
	char file[]="Welcome to MD5 World!"; 
	char fake_file[]="Welcome to MD5 World."; 
	char hash[HASH_HEX_LEN]; 
	// 计算文件file的Hash值 
	MD5_Hash(hash,file); 
    // 根据Hash值校验文件file 
	bool real_ret=MD5_Check(hash,file); 
	printf("\n\n文件1 : %s\n\n",file); 
	printf("文件1的Hash值 : %s\n\n",hash); 
 
 
	printf("如果文件1被改为 %s\n\n",fake_file); 
 
	// 使用Hash值校验文件fake_file 
	if(!MD5_Check(hash,fake_file)) 
	{ 
		printf("经过校验,文件1被改动了!!!\n\n"); 
	} 
	else 
	{ 
		printf("经过校验,文件1未被修改!!!\n\n"); 
 
	} 
    return 0; 
}