前言:
我们以一个wrold文档为例,新建一个xx.docx文件,然后在Linux下可以使用命令md5sum xx.docx计算md5值 -》835741aba850778a5b06bfd57f55c98c 。然后我在复制了一下这个文件,并将文件名改为yy.docx,然后重复上面的命令去计算这个新文件的md5值,然后得到的是相同的结果,文件的md5值是我在我们一个项目“文件传输”中用到的,一开始用这个只知道是用来判断两个文件的内容是否相同,用的是老师给的一个借口,项目写完已经很久了,这个文件的md5值是最近在面试的时候被面试官问到了,所以现在回过来看一看这个,其实这个是用来做加密的,我也不太了解,是在网上看的,关于机密什么的就先不说了,先来看看他是怎么在项目中用代码实现的把!
(一)函数介绍
//打开/usr/include/openssl/md5.h这个文件我们可以看到一些函数
// 初始化 MD5 Contex, 成功返回1,失败返回0
int MD5_Init(MD5_CTX *c);
// 循环调用此函数,可以将不同的数据加在一起计算MD5,成功返回1,失败返回0
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
// 输出MD5结果数据,成功返回1,失败返回0
int MD5_Final(unsigned char *md, MD5_CTX *c);
// MD5_Init,MD5_Update,MD5_Final三个函数的组合,直接计算出MD5的值
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
// 内部函数,不需要调用
void MD5_Transform(MD5_CTX *c, const unsigned char *b);
(二)代码演示
#include <openssl/md5.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
MD5_CTX ctx;
unsigned char outmd[16];
char buffer[1024];
char filename[32];
FILE* fp = NULL;
int len = 0, i = 0;
memset(outmd, 0, sizeof(outmd));
memset(filename, 0, sizeof(filename));
memset(buffer, 0, sizeof(buffer));
cout << "please enter file name:";
cin >> filename;
if((fp = fopen(filename, "rb")) == NULL)
{
cout << "file open error!"<< endl;
return 0;
}
MD5_Init(&ctx);
while((len = fread(buffer, 1, 1024, fp)) > 0 )
{
MD5_Update(&ctx, buffer, len);
memset(buffer, 0, sizeof(buffer));
}
MD5_Final(outmd, &ctx);
for(i = 0; i < 16; i++)
{
printf("%02X", outmd[i]);
}
cout << endl;
return 0;
}
结果:
注:编译命令为g++ - o main main.cpp -lssl加上库名。
参考文章:https://blog.csdn.net/eunice_fan1207/article/details/86312754
版权声明:本文为xing1584114471原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。