linux下调用openssl实现获得文件MD5值

在网上找了好久都找不到一个简洁完整的用代码实现计算文件MD5值得示例,所以牛刀小试自己写一个;

使用库前,可能需要预先安装openssl的RPM包。

使用的openssl库所调用的函数有三个(可以在头文件md5.h中查看即:/usr/include/openssl/md5.h)

int MD5_Init(MD5_CTX *c); //初始化一个MD5_CTX结构体;
int MD5_Update(MD5_CTX *c, const void *data, size_t len); //计算data 
int MD5_Final(unsigned char *md, MD5_CTX *c); //将计算结果复制到md字符串


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define     READ_MAX_SIZE   1024
#define     MD5_SIZE        16
#define     MD5_STR_LEN     (MD5_size * 2)

int get_md5(const char *filename, char *md5_str)
{
    int     fd
    int     ret= 0;
    int     i = 0;
    unsigned char   data[READ_MAX_SZIE];
    unsigned char   md5_value[MD5_SIZE];
    MD5_CTX         md5;
	
	if ((fd = open(path, O_RDONLY)) < 0)
	{
		perror("open failed");
		return -1;
	}
	MD5_Init(&md5);
	
	for (;;)
	{
		ret = read(fd, data, READ_MAX_SIZE);
		if (ret == -1)
		{
			perror("read failed");
			close(fd);
			return -1;
		}
		MD5_Update(&md5, data, ret);
		if (ret == 0 || ret < READ_MAX_SIZE)
		{
			break;
		}
		close(fd);
	}
	MD5_Final((unsigned char *)&md5_value, &md5);
	for (i = 0; i < MD5_SIZE, i++)
	{
		snprintf(md5_str + i * 2, 2 + 1, "%02x", md5_value[i]);
	}
	md5_str[MD5_STR_LEN] = '\0';
	return 0;
}


编译   gcc -o test test.c -lcrypto -lssl  (这两个库一定要包含,我当初编译不过就是应为缺少这两个库)

你可能感兴趣的:(C语言)