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拷至目標平臺運行可得到跟上面一樣的加密編碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章