使用Linux的MD5 API


最近项目中需要用到md5校验。学习一下openssl中的md5的API,感觉使用很方便,记上来,以做备忘之需。  
openssl/md5.h:  
[code]#define MD5_DIGEST_LENGTH 16  
typedef struct MD5state_st         { 
        MD5_LONG A,B,C,D;         MD5_LONG Nl,Nh; 
        MD5_LONG data[MD5_LBLOCK];         unsigned int num;         } MD5_CTX;  
int MD5_Init(MD5_CTX *c); 
int MD5_Update(MD5_CTX *c, const void *data, size_t len); int MD5_Final(unsigned char *md, MD5_CTX *c);[/code]  
需要用到的接口主要就是这些了。  
struct MD5state_st是md5算法要用到的ctx结构 MD5_Init 是初始化ctx结构 
MD5_Update 则是对输入参数data(其长度为len)进行md5计算。 MD5_Final是最后把结果输出至缓存md中。  
OK,先写个程序试一盘: [code]#include <stdio.h> #include <string.h> 
#include <openssl/md5.h>  
int main(int argc, char **argv) { 
        MD5_CTX ctx; 
        unsigned char *buf = "123456789abcdefgh\n";         unsigned char md[MD5_DIGEST_LENGTH];         int i;  
        MD5_Init(&ctx); 
        MD5_Update(&ctx, (void *)buf, strlen(buf));         MD5_Final(md, &ctx);  




     五一长假除了旅游 还能做什么?  辅导补习  美容养颜  家庭家务  加班须知      
 




        printf("%s md5: ", buf); 
        for(i = 0; i< MD5_DIGEST_LENGTH; i++)                 printf("%02x", md[i]);         printf("\n");         return 0; }[/code]  
输出结果看看: 
[code][root@Kendo develop]# ./md5test 123456789abcdefgh 
md5: 6bd9796104fdb38fb400f4cb30778190[/code]  
没有玩过这个,做了一个文件,将buf的内容放进去。调用openssl来看看: [code][root@Kendo develop]# openssl md5 md5.conf  
MD5(md5.conf)= 6bd9796104fdb38fb400f4cb30778190[/code] 结果一致,应该是正确地。 
(Openssl API方便的资料感觉很少,一般偶都是摸着石头过河……)  
用到这里了,想看看openssl的md5程序是如何实现的,至少它展示了如果对一个完整的文件进行md5校验,并且可以看看偶的API使用得对不对,进入源码目录,打开文件crypto/md5/md5.c: [code]#include <stdio.h> #include <stdlib.h> 
#include <openssl/md5.h>  
#define BUFSIZE 1024*16  
void do_fp(FILE *f); 
void pt(unsigned char *md); 
#if !defined(_OSD_POSIX) && !defined(__DJGPP__) int read(int, void *, unsigned int); #endif  
int main(int argc, char **argv)         { 
        int i,err=0;         FILE *IN;  
        if (argc == 1)                 { 
                do_fp(stdin);                 }         else 
                { 






 




                for (i=1; i<argc; i++)                         { 
                        IN=fopen(argv[i],"r");                         if (IN == NULL)                                 { 
                                perror(argv[i]);                                 err++;                                 continue;                                 } 
                        printf("MD5(%s)= ",argv[i]);                         do_fp(IN);                         fclose(IN);                         }                 }         exit(err);         }  
void do_fp(FILE *f)         { 
        MD5_CTX c; 
        unsigned char md[MD5_DIGEST_LENGTH];         int fd;         int i; 
        static unsigned char buf[BUFSIZE];  
        fd=fileno(f);         MD5_Init(&c);         for (;;)                 { 
                i=read(fd,buf,BUFSIZE);                 if (i <= 0) break; 
                MD5_Update(&c,buf,(unsigned long)i);                 } 
        MD5_Final(&(md[0]),&c);         pt(md);         }  
void pt(unsigned char *md)         {         int i;  
        for (i=0; i<MD5_DIGEST_LENGTH; i++)                 printf("%02x",md[i]);         printf("\n"); 






 




        }[/code]  
的确是这样使用的,只不过如果是大文件,则是在一个循环中反复调用MD5_Update来完成的。 
发表于 @ 2008年04月24日 15:11:00 | 评论( 1 ) | 编辑| 举报| 收藏   
旧一篇:Linux 进程 | 新一篇:gcc常用的使用方法 查看最新精华文章 请访问博客首页相关文章   
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xjh_Love_paopao/archive/2008/04/24/2323441.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值