Linux下MD5算法使用

作者:无脑仔的小明 
出处:http://www.cnblogs.com/wunaozai/ 

我们以一个字符串为例,新建一个文件filename.txt,在文件内写入hello ,然后在Linux下可以使用命令md5sum filename.txt计算md5值 ==> b1946ac92492d2347c6235b4d2611184  。虽然写入的是hello这5个字符,但是我们使用命令xxd filename.txt后可以看出文件结尾处会有个0x0a这个回车符。所以在下面的代码中才会有\n。

//打开/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);
新建一个cpp文件(C文件也可以)用于计算MD5值
#include <openssl/md5.h>

#include <string.h>

#include <stdio.h>

int main()

{

MD5_CTX ctx;

unsigned char outmd[16];

int i=0;

memset(outmd,0,sizeof(outmd));

MD5_Init(&ctx);

MD5_Update(&ctx,"hel",3);

MD5_Update(&ctx,"lo\n",3);

MD5_Final(outmd,&ctx);

for(i=0;i<16;i<i++)

{

printf("%02X",outmd[i]);

}

printf("\n");

return 0;

}

编译选项为: g++ MD5test.cpp -lssl -o MD5test(如果是C语言可以使用gcc MD5test.c -o  MD5test)

运行后的结果为: B1946AC92492D2347C6235B4D2611184

注意这里用到openssl库,可以自行根据网上教程安装。

下面这个代码是对文件进行MD5计算。

#include <openssl/md5.h>

#include <string.h>

#include <stdio.h>



int main()

{

MD5_CTX ctx;

unsigned char outmd[16];

char buffer[1024];

char filename[32];

int len=0;

int i;

FILE * fp=NULL;

memset(outmd,0,sizeof(outmd));

memset(filename,0,sizeof(filename));

memset(buffer,0,sizeof(buffer));

printf("请输入文件名,用于计算MD5值:");

scanf("%s",filename);

fp=fopen(filename,"rb");

if(fp==NULL)

{

printf("Can't open file\n");
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<i++)
{
printf("%02X",outmd[i]);
}
printf("\n");
return 0;
}

运行得到结果后,我们可以使用md5sum命令进行验证。

猜你喜欢

转载自blog.csdn.net/Eunice_fan1207/article/details/86312754