Linux下C语言使用openssl库进行MD5校验

http://blog.csdn.net/cassie_huang/article/details/53212933

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

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

[cpp]  view plain  copy
  1. //打开/usr/include/openssl/md5.h这个文件我们可以看到一些函数  
  2. // 初始化 MD5 Contex, 成功返回1,失败返回0  
  3. int MD5_Init(MD5_CTX *c);  
  4. // 循环调用此函数,可以将不同的数据加在一起计算MD5,成功返回1,失败返回0  
  5. int MD5_Update(MD5_CTX *c, const void *data, size_t len);  
  6. // 输出MD5结果数据,成功返回1,失败返回0  
  7. int MD5_Final(unsigned char *md, MD5_CTX *c);  
  8. // MD5_Init,MD5_Update,MD5_Final三个函数的组合,直接计算出MD5的值  
  9. unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);  
  10. // 内部函数,不需要调用  
  11. void MD5_Transform(MD5_CTX *c, const unsigned char *b);  


新建一个cpp文件(C文件也可以)用于计算MD5值
[cpp]  view plain  copy
  1. #include <openssl/md5.h>  
  2. #include <string.h>  
  3. #include <stdio.h>  
  4.   
  5. int main()  
  6. {  
  7.     MD5_CTX ctx;  
  8.     unsigned char outmd[16];  
  9.     int i=0;  
  10.   
  11.     memset(outmd,0,sizeof(outmd));  
  12.     MD5_Init(&ctx);  
  13.     MD5_Update(&ctx,"hel",3);  
  14.     MD5_Update(&ctx,"lo\n",3);  
  15.     MD5_Final(outmd,&ctx);  
  16.     for(i=0;i<16;i<i++)  
  17.     {  
  18.         printf("%02X",outmd[i]);  
  19.     }  
  20.     printf("\n");  
  21.     return 0;  
  22. }  

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

运行后的结果为: B1946AC92492D2347C6235B4D2611184

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

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

[cpp]  view plain  copy
  1. #include <openssl/md5.h>  
  2. #include <string.h>  
  3. #include <stdio.h>  
  4.   
  5. int main()  
  6. {  
  7.     MD5_CTX ctx;  
  8.     unsigned char outmd[16];  
  9.     char buffer[1024];  
  10.     char filename[32];  
  11.     int len=0;  
  12.     int i;  
  13.     FILE * fp=NULL;  
  14.     memset(outmd,0,sizeof(outmd));  
  15.     memset(filename,0,sizeof(filename));  
  16.     memset(buffer,0,sizeof(buffer));  
  17.     printf("请输入文件名,用于计算MD5值:");  
  18.     scanf("%s",filename);  
  19.     fp=fopen(filename,"rb");  
  20.     if(fp==NULL)  
  21.     {  
  22.         printf("Can't open file\n");  
  23.         return 0;  
  24.     }  
  25.   
  26.     MD5_Init(&ctx);  
  27.     while((len=fread(buffer,1,1024,fp))>0)  
  28.     {  
  29.         MD5_Update(&ctx,buffer,len);  
  30.         memset(buffer,0,sizeof(buffer));  
  31.     }  
  32.     MD5_Final(outmd,&ctx);  
  33.   
  34.     for(i=0;i<16;i<i++)  
  35.     {  
  36.         printf("%02X",outmd[i]);  
  37.     }  
  38.     printf("\n");  
  39.     return 0;  
  40. }  
运行得到结果后,我们可以使用md5sum命令进行验证。

文章为转载,略微改了几个字眼。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值