一、C编程
在网络间进行通信时我们都需要对我们发送的数据进行校验的,一般情况下,大多数都是使用MD5来进行校验。也就是当我们在发送数据时同时把他的MD5校验码一起发过去,当接受到这些数据时,他先调用自己的MD5校验方法来生成刚接收到的数据的校验码,然后和我们发送给他的MD5校验码进行比较看看是否相同,来确定是否需要重新发送数据。这只是自己的个人观点不代表权威说法。先前在网上查过Linux中如何调用关于MD5的函数,也也系统中的找过源代码,但是结果就是没任何结果。有许多博文中写到了调用ssl中关于MD5的函数,仔细看了看方法还算简单,这样就不用自己去写代码实现MD5的算法了。那就和大家一起分享自己的收获吧!!首先我们要先安装ssl库,如果你的系统中没有安装的话就应该进行这一步操作,命令如下:sudo
apt-get install openssl libssl-dev这里跟大家说一声我用的系统是Ubuntu
10.10,如果你们用的不是这个系统的话,也可以先试一下这条命令,基本上现在的系统大都是采用deb,我想应该没什么差别吧!我们的基本工作做好之后,那我们就看看下面的代码是怎么用这些函数的吧!代码如下://md5test.c#include
#include #include
#include int main(int argc,
char *argv[]){ MD5_CTX ctx; unsigned char md[16]; char
md5[33] = {'\0'}; char tmp[3] = {'\0'}; int i; if(argc
< 2) { printf("Using : %s
\n",argv[0]); exit(1); } //int
MD5_Init(MD5_CTX *c); if(MD5_Init(&ctx) ==0 )
//初始化一个MD5_CTX这样的结构体 { printf("Error!MD5_Init()
Error!\n"); exit(1); } // int MD5_Update(MD5_CTX *c,
const void *data, unsigned long len); if(MD5_Update(&ctx, (unsigned
char*)argv[1], strlen(argv[1])) == 0 )
//更新这块区域,防止引用非法数据(你们可以去看man手册,本人英语不太好) { printf("Error!
MD5_Update() Error!\n"); exit(1); } //int
MD5_Final(unsigned char *md, MD5_CTX *c); if(MD5_Final(md, &ctx) ==
0) //最后把ctx中的数据按照MD5算法生成16位的MD5码,存放到md中 { printf("Error!
MD5_Final() Error!\n"); exit(1); } for(i=0;
i< 16; i++) { sprintf(tmp, "%02X", md[i]);
strcat(md5, tmp); } printf("The String is [ %s ]\nThe String
MD5 is [ %s ]\n",argv[1],md5); return
0;}编译执行:FreeOS@FreeOS:~/source/test$ gcc md5test.c -o md5test
-Wall -lsslFreeOS@FreeOS:~/source/test$ ./md5test helloThe String is [
hello ]The String MD5 is [ 5D41402ABC4B2A76B9719D911017C592
]提示:在我们编译时一定要加上-lssl,否则会报没有这些MD5相应的函数。你就把光标定位到相应函数处按shift+k键就可跳到相应的函数的man
手册中了。这里的方法只是一种,当时在网上查资料的时候好像还有一种方法,如果自己没记错的话应该是在MD5的输出格式上面,如果不是的话那就只能说明自己的记忆力不好,嘿嘿!!注:上面的编译在Ubuntu
10.10上是可以的,今天刚升级到了11.04再次编译时就报出错,于是试着用下面的方法进行编译:
gcc md5test.c -o md5test
-Wall -lcrypto
二、shell
echo -n "字符串" | md5sum| awk '{print $1}'
1 echo默认是带换行符做结尾的
2 echo -n 可以去掉换行符
3 printf是没有换行符结尾的
阅读(2051) | 评论(0) | 转发(0) |