使用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来完成的。
最近项目中需要用到 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来完成的。