网上C/C++的MD5算法很多,但找了好久,也没找到合适的能与JAVA的MD5结果一样的算法。最后还是把以前项目里的一个算法改了一下,实现了和Java传输文件时,校验文件的功能。Java的MD5算法比较统一,而C++的算法则很多版本,只能C++往Java上靠拢。
md5.h
#ifndef _DMSUTIL_H
#define _DMSUTIL_H
#ifdef __cplusplus
extern "C" {
#endif
/*------------------------------------------------------------------------.
| md5 encrypt function
.------------------------------------------------------------------------*/
void EncryptMD5(unsigned char *output, unsigned char *input);
void EncryptMD5str(char *output, unsigned char *input, int len);
/*------------------------------------------------------------------------.
| hash encrypt function
.------------------------------------------------------------------------*/
void EncryptHash(char *crypt, char *source);
/*------------------------------------------------------------------------.
| DES encrypt and decrypt function
.------------------------------------------------------------------------*/
void EncryptDes(unsigned char *source, unsigned char *encrypt);
void DecryptDes(unsigned char *encrypt, unsigned char *source);
#ifdef __cplusplus
}
#endif
#endif
对应的md5.cpp文件源码如下:
//http:vcsky.net by havenzhao
#include
#include
#include "dms5.h"
/*MD5 context*/
typedef struct MD5_CTX_S{
unsigned int state[4];
unsigned int count[2];
char buffer[64];
}MD5_CTX;
static unsigned char digest[16];
/*MD5 initialization*/
static void MD5Init(MD5_CTX *);
/*MD5 block update operation*/
static void MD5Update(MD5_CTX *, unsigned char *, unsigned int);
/*Ends an MD5 message-digest operation*/
static void MD5Final(unsigned char [16], MD5_CTX *);
/*MD5 padding*/
static void __md5_Pad (MD5_CTX *);
/*MD5 basic transformation*/
static void __md5_Transform (unsigned int [4], unsigned char [64]);
#ifdef i386
#define __md5_Encode memcpy
#define __md5_Decode memcpy
#else /* i386 */
/*
* __md5_Encodes input (u_int32_t) into output (unsigned char). Assumes len is
* a multiple of 4.
*/
static void
__md5_Encode (unsigned char *output, unsigned int *input, unsigned int len)
{
unsigned int i, j;
for (i = 0, j = 0; j < len; i++, j += 4) {
output[j] = (unsigned char)(input[i] & 0xff);
output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
output[j+2] = (unsigned char)((input[i]