一、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 -lssl
FreeOS@FreeOS:~/source/test$ ./md5test hello
The 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是没有换行符结尾的