Chinaunix首页 | 论坛 | 博客
  • 博客访问: 933435
  • 博文数量: 104
  • 博客积分: 1919
  • 博客等级: 上尉
  • 技术积分: 1910
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-21 16:33
文章分类
文章存档

2016年(4)

2015年(1)

2014年(6)

2013年(16)

2012年(27)

2011年(49)

2010年(1)

分类: LINUX

2013-01-10 16:04:11

一、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是没有换行符结尾的
阅读(2795) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~