使用openssl的md5库



在linux机器上,有一个命令可以计算出文件的md5值,那就是md5sum,如果没有的话,就需要安装RPM包:coreutils。

现在我们使用openssl的库也可以方便的计算出文件的md5值。主要用到的函数是

int MD5_Init(MD5_CTX *c);
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
int MD5_Final(unsigned char *md, MD5_CTX *c);

使用库前,先需要安装openssl的RPM包。这三个函数不需要解释,看下面一个例子就知道:

#include 
#include 
#include 
#include 
using namespace std;


int main()
{
        FILE *fd=fopen("test","r");
        MD5_CTX c;
        unsigned char md5[17]={0};
        if(fd == NULL)
        {
                cout << "open failed" << endl;
                return -1;
        }
        int len;
        unsigned char *pData = (unsigned char*)malloc(1024*1024*1024);
        if(!pData)
        {
                cout << "malloc failed" << endl;
                return -1;
        }
        MD5_Init(&c);
        while( 0 != (len = fread(pData, 1, 1024*1024*1024, fd) ) )
        {
                MD5_Update(&c, pData, len);
        }
        MD5_Final(md5,&c);
        for(int i = 0; i < 16; i++)
                cout << hex << setw(2) << setfill('0') << (int)md5[i];
        cout << endl;
        fclose(fd);
        free(pData);
        return 0;
}



编译链接选项为:

g++ test.cpp -o testmd5 -lcrypto -lssl

生成testmd5后,我们把一个300多M的test文件放到与testmd5一个目录。并把testmd5生成的结果和linux命令"md5sum test" 结果对比,会发现是一样的。

int GetFileMD5(std::string strFile, std::string& strMD5)
{
	int nLen = 0;
	unsigned int nBufferSize = 1024 * 1024;
	char szTemp[4];
	unsigned char szMD5[20];
	MD5_CTX ctx;
	
	// set buffer size by file size
	ACE_stat stFileInfo;
	memset(&stFileInfo, 0, sizeof(ACE_stat));
	nRet = ACE_OS::lstat(strFile.c_str(), &stFileInfo);
	if (nRet != 0)
	{
		printf("stat file error[%s].\n", strFile.c_str());
		return -1;
	}
	if (stFileInfo.st_size < nBufferSize)
	{
		nBufferSize = stFileInfo.st_size + 64;
	}
	// open file
	FILE *fp = fopen(strFile.c_str(), "r");
	if(fd == NULL)
	{
		printf("fopen error:%s.\n", strFile.c_str());
		return -1;
	}
	unsigned char *pDataBuffer = (unsigned char*)malloc(nBufferSize);
	if(NULL == pDataBuffer)
	{
		printf("malloc error:%d.\n", nBufferSize);
		fclose(fp)
		return -1;
	}
	// get md5
	MD5_Init(&ctx);
	while(true)
	{
		memset(pDataBuffer, 0, nBufferSize);
		nLen = fread(pDataBuffer, 1, nBufferSize, fp);
		if(nLen == 0)
		{
			break;
		}
		MD5_Update(&ctx, pDataBuffer, nLen);
	}
	MD5_Final(szMD5, &ctx);
	// md5 to string
	strMD5 = "";
	for(int i = 0; i < 16; i++)
	{
		memset(szTemp, 0, sizeof(szTemp));
		snprintf(szTemp, sizeof(szTemp), "%02x", (int)szMD5[i]);
		strMD5 += szTemp;
	}
	fclose(fp);
	if(NULL != pDataBuffer)
	{
		free(pDataBuffer);
		pDataBuffer = NULL;
	}
	return 0;
}

你可能感兴趣的:(UnixAndLinux)