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命令进行验证。

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dup、dup2、fcntl

dup、dup2&#xff0c;复制文件描述符 int dup(int oldfd);  //返回文件描述表中没有被占用的最小可用的描述符&#xff0c;新旧描述符作用相同 int dup2(int oldfd, int newfd);  //如果new已经被打开&#xff0c;先关闭再拷贝就会指向同一个文件&#xff0c;如果old和new…

进程

创建子进程&#xff1a;fork调用&#xff0c; 一次fork调用返回两个值&#xff0c;1、返回子进程的pid&#xff08;非负整数&#xff09; 2、返回0 父进程的fork返回子进程的id&#xff0c;子进程的fork返回0&#xff08;表示执行成功&#xff09; 创建单个子进程&#xff1a; …

Ubuntu在vmware虚拟机无法上网的解决方法

http://blog.csdn.net/xueyushenzhou/article/details/50460183 在vmware中安装Ubuntu之后&#xff0c;我们希望基本的功能如上网、传输文件等功能都是可用的&#xff0c;但是经常遇到不能上网的情况。使用笔记本时&#xff0c;我们经常希望能通过无线网卡上网&#xff0c;但是…

exec函数族

fork创建子进程后执行的是和父进程相同的程序&#xff08;但有可能执行不同的代码分支&#xff09;&#xff0c;子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff0c;从新程序的启动例…

IO 多路复用之poll总结

http://www.cnblogs.com/Anker/p/3261006.html IO多路复用之poll总结 1、基本知识 poll的机制与select类似&#xff0c;与select在本质上没有多大差别&#xff0c;管理多个描述符也是进行轮询&#xff0c;根据描述符的状态进行处理&#xff0c;但是poll没有最大文件描述符数量的…

wait、waitpid

父进程调用wait函数可以回收子进程的终止信息&#xff0c;该函数有三个功能&#xff1a;&#xff08;一次wait调用回收一个子进程 回收多个用循环&#xff09; 1、阻塞等待子进程退出 2、回收子进程残留资源 3、获取子进程结束状态&#xff08;退出原因&#xff09; pid_t wait…

C++项目中的extern C {}

http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html 引言 在用C的项目源码中&#xff0c;经常会不可避免的会看到下面的代码&#xff1a; 123456789#ifdef __cplusplusextern "C" {#endif/*...*/#ifdef __cplusplus}#endif它到底有什么用呢&#xff0c;…

管道

管道&#xff0c;其本质是一个伪文件&#xff08;实为内核缓冲区&#xff09;&#xff1b;由两个文件描述符引用&#xff0c;一个表示读端、一个表示写端&#xff1b;规定数据从管道的写端流入&#xff0c;读端流出。 管道的原理&#xff1a;管道实为内核使用环形队列机制&…

C/S、B/S的区别

C/S结构&#xff0c;即Client/Server(客户机/服务器)结构&#xff0c;是大家熟知的软件系统体系结构&#xff0c;通过将任务合理分配到Client端和Server端&#xff0c;降低了系统的通讯开销&#xff0c;可以充分利用两端硬件环境的优势。早期的软件系统多以此作为首选设计标准。…

extern c用法解析

http://www.jianshu.com/p/5d2eeeb93590 引言C保留了一部分过程式语言的特点&#xff0c;因而它可以定义不属于任何类的全局变量和函数。但是&#xff0c;C毕竟是一种面向对象的程序设计语言&#xff0c;为了支持函数的重载&#xff0c;C对全局函数的处理方式与C有明显的不同。…

C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)

http://blog.csdn.net/xiaofeige567/article/details/27484137 C语言实现单链表&#xff08;带头结点&#xff09;的基本操作&#xff08;创建&#xff0c;头插法&#xff0c;尾插法&#xff0c;删除结点&#xff0c;打印链表&#xff09; [plain] view plaincopy #include<…

静态网页与动态网页区别

一、静态web页面&#xff1a;1、在静态Web程序中&#xff0c;客户端使用Web浏览器&#xff08;IE、FireFox等&#xff09;经过网络(Network)连接到服务器上&#xff0c;使用HTTP协议发起一个请求&#xff08;Request&#xff09;&#xff0c;告诉服务器我现在需要得到哪个页面&…

单向循环链表C语言实现

http://blog.csdn.net/morixinguan/article/details/51771633 我们都知道&#xff0c;单向链表最后指向为NULL&#xff0c;也就是为空&#xff0c;那单向循环链表就是不指向为NULL了&#xff0c;指向头节点&#xff0c;所以下面这个程序运行结果就是&#xff0c;你将会看到遍历…

web服务器原理

什么是web服务器&#xff1f; 在Mosaic浏览器&#xff08;通常被认为是第一个图形化的web浏览器&#xff09;和超链接内容的初期&#xff0c;演变出了“web服务器”的新概念&#xff0c;它通过HTTP协议来提供静态页面内容和图片服务。在那个时候&#xff0c;大多数内容都是静态…

(C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作

http://blog.csdn.net/fisherwan/article/details/19760681 上午写了下单向循环链表的程序&#xff0c;今天下午我把双向链表的程序写完了。其实双向链表和单向链表也是有很多相似的地方的&#xff0c;听名字可以猜到&#xff0c;每个节点都包含两个指针&#xff0c;一个指针指…

竞态条件

pause函数 调用该函数可以造成进程主动挂起&#xff0c;等待信号唤醒。调用该系统调用的进程将处于阻塞状态(主动放弃cpu) 直到有信号递达将其唤醒。 int pause(void); 返回值&#xff1a;-1 并设置errno为EINTR 返回值&#xff1a; ① 如果信号的默认处理动作是终止进程&#…

(C++版)链表(一)——实现单向链表创建、插入、删除等相关操作

http://blog.csdn.net/fisherwan/article/details/25557545 前段时间用C语言实现了链表的相关操作&#xff0c;但是发现当时挺清楚的&#xff0c;过了一段时间又忘的差不多了&#xff0c;所以现在打算用C再实现一遍&#xff0c;由于初次用C实现&#xff0c;存在错误的地方还望大…

(C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作

http://blog.csdn.net/fisherwan/article/details/19754585 昨天写了单向链表的代码&#xff0c;今天上午把单向循环链表的程序给敲完了。链表的相关操作一样的&#xff0c;包含链表的创建、判断链表是否为空、计算链表长度、向链表中插入节点、从链表中删除节点、删除整个链表…

计科院首页静态网页

一.HTML代码 <!DOCTYPE html><html><head><meta charset"UTF-8"><title>首页</title> </head><body><div id"page"> <div id"page_head"> <div id"logo" aligncenter…

可重入函数

一个函数在被调用执行期间(尚未调用结束)&#xff0c;由于某种时序又被重复调用&#xff0c;称之为“重入”。根据函数实现的方法可分为“可重入函数”和“不可重入函数”两种。 注意事项 定义可重入函数&#xff0c;函数内不能含有全局变量及static变量&#xff0c;不能使用ma…