Linux下MD5移植与编程


目标平台:LOONGSON-1B开发板
内核:Linux 3.0
编译平台:ubuntu10.04
交叉工具链:gcc-3.4.6-2f

备注:以下操作均在root用户下进行

简介
本文旨在为MD5移植以及linux C下MD5加密编程提供技术文档。
MD5(Message Digest Algorithm 5:消息摘要算法第五版),为计算机安全领域广泛使用的一种散列函数,用于提供消息的完整性保护,是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法)。
MD5算法接收任意长度的一个字符串,然后将它散列成128位的编码。它广泛应用于各种计算机各种加密领域。

1、安装MD5工具
首先下载MD5工具源码:
进入地址: http://martin.hinner.info/libmd/
下载libmd库libmd-0.3.tar.bz2
在ubuntu10.04安装libmd工具:
#tar jxf libmd-0.3.tar.bz2
#cd libmd-0.3
#./configure
#make
#make install
Ubuntu10.04完成md5工具安装。


2、交叉编译MD5工具
备注:若移植至arm平台则相应改为arm-linux
#cd libmd-0.3
#./configure --host=mipsel=mipsel-linux --prefix=/home/md5_install
#vi Makefile
打开Makefile并修改:
将CC = gcc 修改为 CC = mipsel-linux-gcc
将RANLIB = ranlib 修改为 RANLIB = mipsel-linux-ranlib
将AR = ar 修改为 AR = mipsel-linux-ar
在INSTALL = /usr/bin/install -c语句下添加语句:
BUILDROOT = /home/md5_install
保存退出Makefile
#make
#make install
安装后在目录/home/md5_install/下生成usr/include/、usr/lib/、usr/man等文件夹,将交叉编译生成的在/home/md5_install/usr/lib/libmd.so.1.0移至目标平台的/lib目录,完成MD5移植。

3、MD5编程
Libmd提供了一系列C函数接口,通过这些接口可方便地实现MD5加密。
md5.h文件提供了MD5编程中一个重要的结构体struct MD5Context,它的原型如下:
struct MD5Context{
u_int32_t buf[4];
U_int32_t bits[2];
Unsigned char in[64];
}MD5_CTX;
该类型结构体贯穿整个MD5编程。
3.1 MD5常用函数接口
#include <sys/types.h>
#include <md5.h>
void MD5Init(MD5_CTX *context);
void MD5Update(MD5_CTX *context, const void *data, unsigned int len);
void MD5Pad(MD5_CTX *context);
void MD5Final(unsigned char digest[16], MD5_CTX *context);
char *MD5End(MD5_CTX *context, char *buf);
char *MD5File(const char *filename, char *buf);
char *MD5FileChunk(const char *filename, char *buf, off_t offset, off_t lenghth);
char *MD5Data(const void *data, unsigned int len, char *buf);
函数说明:
MD5Init(), MD5Update()和MD5Final():是核心函数,MD5编程时,先分配一个MD5_CTX结构体空间,使用MD5Init()对该结构体进行初始化,使用MD5Update()对它进行更新,最后使用MD5Final()提取结果。
MD5Pad():类似于MD5Final(),区别在于它并不会终止计算。
MD5End():是MD5Final()函数的封装,它将转换的128十六进制编码转换为一串33个字符(包含结束符'\0')的ASCII码字符串。
MD5File():计算文件的摘要,并使用MD5End()返回结果。如果指定的文件不能打开,则返回NULL指针。
MD5FileChunk():函数类似于MD5File(),但它只计算文件里指定偏移offset开始至往后length个字节的文件摘要。如果length为0,或者大于偏移后剩余的长度,则MD5FileChunk()计算从偏移出至文件结尾的文件摘要。

4、MD5加密程序例子:
/*md5.c*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <md5.h>

int main(void)
{
    unsigned char passwd[10] = {0};
    unsigned char sout[MD5_HASHBYTES] = {0};
    int i;

    MD5_CTX ctx;
    memset(&ctx, 0, sizeof(MD5_CTX));

    MD5Init(&ctx);
    MD5Update(&ctx, (unsigned char *)passwd,sizeof(passwd));
    MD5Final((unisned char *)sout, &ctx);

    printf("MD5 code is:\n");
    for(i = 0; i < MD5_HASHBYTES, i++)
    {
        printf("%02x ", sout[i]);
    }
    printf("\n");
    return 0;
}

Ubuntu本地编译与运行:
#gcc -o md5 md5.c -lmd
#./md5
MD5 code is:
C5 6b d5 48 0f 6e 54 13 cb 6e a0 ad 96 66 61 3a
上面产生的字段为passwd经过MD5加密后的128位编码。

交叉编译与运行:
#mipsel-linux-gcc -I/home/md5_install/usr/include -o md5 md5.c -L/home/md5_install/usr/lib -lmd
将可执行文件md5拷至目标平台运行可得到跟上面一样的加密编码。

你可能感兴趣的:(Linux下MD5移植与编程)