红联Linux门户
Linux帮助

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

发布时间:2017-02-04 15:15:49来源:linux网站作者:loving_le
在网上找了好久都找不到一个简洁完整的用代码实现计算文件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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/md5.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h >
#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, md5_value[i]);
}
md5_str[MD5_STR_LEN] = '\0';
return 0;
}
 
编译 gcc -o test test.c -lcrypto -lssl (这两个库一定要包含,我当初编译不过就是应为缺少这两个库)
 
本文永久更新地址:http://www.linuxdiyf.com/linux/28141.html